Как использовать TASKKILL для 32-битных приложений в 64-битной среде Windows?

0

Когда пользователь запускает 32-разрядное приложение .Net в 64-разрядной среде, в диспетчере задач оно отображается с другим именем.

Например, если мое приложение называется Shipnet.Shell.exe, в диспетчере задач оно отображается SH7910~1.exe*32. Из-за этого изменения имени выполнение команды TASKKILL завершается неудачно.

Как я могу получить правильное имя для использования с TASKKILL?

Немного предыстории:

У нас есть устаревший продукт, разработанный в Centura Team Developer 4.2 (Gupta Sql Windows). Из нашего старого продукта мы можем использовать 32-битные .Net приложения. Мой продукт очень большой и имеет сотни приложений, разработанных в Centura и .Net. Пользователь может запустить несколько приложений из главного меню (Centura и .Net). На экране главного меню есть меню «Выход». Когда пользователь нажимает на это меню, наш продукт закрывает все приложения Centura и .Net. Centura позаботится о собственном приложении в процессе закрытия. Мы используем команду TASKKILL, чтобы закрыть все .Net приложения, запущенные из нашего продукта. Это нормально работает с 32-битной средой Windows. Когда мы внедряем то же самое в 64-битной среде Windows, наш продукт не может закрыть приложения .Net. Причина в том, что команда TASKKILL не смогла получить правильное имя приложения.

Манимаран
источник
Простым решением было бы скомпилировать 32-битную и 64-битную версию вашего приложения.
Ramhound

Ответы:

4

Вы можете использовать, TASKLISTчтобы получить PID по заголовку окна, имени процесса или другим критериям:

tasklist /FI "WINDOWTITLE eq notepad"

Это перечислит все процессы, для которых имя окна равно «блокнот».

Пример вывода:

C:\windows\system32>tasklist /FI "WINDOWTITLE eq Untitled - Notepad"

Image Name                     PID Session Name        Session#    Mem Usage
========================= ======== ================ =========== ============
notepad.exe                   1876 Console                    1      7,156 K

Доступные фильтры:

Filters:
    Filter Name     Valid Operators           Valid Value(s)
    -----------     ---------------           --------------------------
    STATUS          eq, ne                    RUNNING |
                                              NOT RESPONDING | UNKNOWN
    IMAGENAME       eq, ne                    Image name
    PID             eq, ne, gt, lt, ge, le    PID value
    SESSION         eq, ne, gt, lt, ge, le    Session number
    SESSIONNAME     eq, ne                    Session name
    CPUTIME         eq, ne, gt, lt, ge, le    CPU time in the format
                                              of hh:mm:ss.
                                              hh - hours,
                                              mm - minutes, ss - seconds
    MEMUSAGE        eq, ne, gt, lt, ge, le    Memory usage in KB
    USERNAME        eq, ne                    User name in [domain\]user
                                              format
    SERVICES        eq, ne                    Service name
    WINDOWTITLE     eq, ne                    Window title
    MODULES         eq, ne                    DLL name

Затем вы можете использовать taskkillи предоставить PID.

TASKKILL /PID 1230 /PID 1241 /PID 1253 /T

/tзавершает процессы и их дочерние элементы, /PIDуказывает идентификатор процесса.

Если у вас есть PowerShell, вы можете использовать Stop-Process <pid>(например Stop-Process 3512) илиStop-Process -processname notepad

Более подробная информация доступна здесь по команде Stop-Process.

Было бы очень полезно, если бы вы указали имя ОС, в которой вы столкнулись с проблемой, очень необычно, что имена усекаются до DOS-STYLE в 64-битных операционных системах!

Gizmo
источник
ОС Windows 2008 R2.
Manimaran
и команды, которые я предоставил, не работают?
Gizmo
0

У меня здесь похожая проблема. 32-битный процесс отказывается умирать. Я нашел бы это с помощью списка задач в процессе 8152. Это следующие шаги:

C: \ Users \ Smurf> taskkill / pid 8152 / t ОШИБКА: не удалось завершить процесс с PID 8152 (дочерний процесс с PID 7788). Причина: Тоганг Гевейгерд.

C: \ Users \ Smurf> taskkill / pid 7788 / t ОШИБКА: процесс "7788" не найден.

Toegand geweigerd - это «доступ запрещен». Я дал себе все права, поэтому процесс в ProcExp. Интересно, как убить этот нежелательный процесс ....

user718960
источник