Завершение процесса от CMD: от самого мягкого к сложному - PullRequest
0 голосов
/ 14 ноября 2018

Завершение процесса из CMD: от мягкого к сложному Мне было интересно, имел ли кто-нибудь опыт использования командной строки для завершения процессов с помощью taskkill и WIMC.Мне было интересно, знает ли кто-нибудь порядок того, насколько «тяжело» закрывать / завершать эти команды по команде, которая является «самой мягкой» (наименее сильной) близкой к команде, которая является «самой твердой» (самой сильной):

Мое предположение будет следующим:

Наименее / Мягкий

1) taskkill / im processname.exe

2) wmic process, где name = "processname.exe"вызов завершен

3) wmic process, где name = 'processname.exe' delete

4) taskkill / f / im processname.exe

Most / Hardest

Я пытаюсь создать пакетный командный файл и хотел просто узнать разницу между ними, чтобы увидеть, какой мне следует использовать.Я предпочитаю использовать более мягкое закрытие, проверить, запущен ли еще процесс, а затем попробовать еще больше закрыть, а затем повторять до тех пор, пока программа не будет успешно закрыта.Любая информация о разнице между ними может быть полезной, особенно между использованием terminate и delete через CMD: WMIC будет полезен, так как я не могу найти документацию где-либо на них.

1 Ответ

0 голосов
/ 15 ноября 2018

Как упомянул CatCat, есть два основных способа прервать процесс: WM_CLOSE и TerminateProcess(). Я добавил еще два для полноты картины.

  1. Отправка сообщения окна WM_CLOSE в главное окно процесса. Это то же самое сообщение, которое приложение получает, когда пользователь нажимает кнопку X, чтобы закрыть окно. Затем приложение может корректно завершить работу или запросить подтверждение у пользователя, например, если какая-то работа не сохранена

    taskkill без /f, похоже, пытается это сделать, но, похоже, не всегда удается найти правильное окно для закрытия. Если предполагается, что приложение не имеет видимого окна (например, если оно отображает только значок в системном трее или является сервером без окон), оно может полностью игнорировать это сообщение.

    Если taskkill не работает для вас, возможно NirCmd: делает лучшую работу: NirCmd.exe closeprocess iexplore.exe

  2. Также имеется сообщение WM_ENDSESSION - оно отправляется ОС при завершении работы (после WM_QUERYENDSESSION). Он работает примерно так же, за исключением того, что он отправляется всему приложению, а не определенному окну. В зависимости от параметров, приложения могут быть запрошены для сохранения работы во временных файлах, потому что система должна перезагрузиться, чтобы применить некоторые обновления. Некоторые приложения реагируют на это сообщение, некоторые - нет.

    Должно быть возможно отправлять эти сообщения вручную, но я не видел, чтобы это делалось, кроме как проверить, как приложение реагирует на завершение работы без фактического выключения ОС.

  3. WM_QUIT В сообщении предлагается закрыть приложение в целом (точнее, оно отправляется в поток). Приложение обычно должно отправить его себе после закрытия окна, и теперь пришло время завершить процесс.

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

  4. TerminateProcess() указывает операционной системе принудительно прекратить процесс. Это то, что происходит, когда вы нажимаете кнопку End process на вкладке processes в task manager. Процесс не получает уведомления о том, что он закрывается - он просто останавливается там, где был, и удаляется из памяти - без вопросов, без выключения и т. Д. Это может привести к повреждению, если некоторые файлы были записаны в то время или данные были переданы.

    Это то, что делает команда taskkill /f. И wmic process call terminate, и wmic process delete, похоже, тоже делают это, хотя я не уверен.

...