В Windows, как я могу изящно попросить работающую программу завершить работу?

15884
unforgettableid

В Unix или Linux легко изящно попросить завершить работающее приложение: вы посылаете ему сигнал SIGTERM. Если его идентификатор процесса 1234, вы можете просто запустить kill 1234или kill -s TERM 1234или kill -15 1234.

Как я могу сделать то же самое в Windows?

Если я правильно помню, функция «Завершить задачу» в диспетчере задач (а не функция «Завершить процесс») использовалась для выполнения того, что я хочу. Но, начиная с Windows 8.1, это уже не так нежно; когда я использую эту функцию, это приводит к потере несохраненных данных.

Я не хочу писать код для этого. Если бы я это сделал, я бы спросил о переполнении стека. :)

12
Если вы разработчик программного обеспечения и хотите сделать это программным путем, см. [Связанный с этим вопрос переполнения стека о том, как изящно попросить завершить процесс] (http://stackoverflow.com/questions/2055753/how-to- изящно-завершать а-процесс). unforgettableid 9 лет назад 1
В Windows нет ничего грациозного ........ Moab 9 лет назад 4

2 ответа на вопрос

14
unforgettableid

Taskkill.exe

Энди Э пишет, что вы можете использовать taskkill.exe.

Чтобы завершить процесс с идентификатором процесса 1234:

taskkill /pid 1234 

Чтобы прекратить notepad.exe:

taskkill /im notepad.exe 

Для получения дополнительной помощи:

taskkill /? 

Он добавляет:

/fВыключатель заставит убить, но не использовать его просто посылает сигнал завершения, чтобы приложение закрывается корректно.

Он прав. Я попытался использовать taskkill.exe (без /f), чтобы прекратить Notepad, и он работал как ожидалось. Блокнот спросил меня, хочу ли я сохранить несохраненный текст, который я ввел.

Я использую домашнюю версию Windows 8.1. Похоже, taskkill.exeпришел в комплекте с Windows без дополнительной оплаты. Это в c:\windows\system32.

Или просто выйти

Если вы не хотите беспокоиться об этом, просто выйдите из своей учетной записи Windows, затем войдите снова.

Консольные приложения

Что касается консольных приложений (например, PowerShell), Крис Бекке добавляет :

Нет реального способа изящно закрыть консольные приложения в Windows. Им нужно поддерживать какой-то изящный закрытый механизм.

Обратите внимание, что это не точно повторяет то, что происходит при выходе из системы или завершении работы; для этого см. http://stackoverflow.com/questions/520910/how-to-simulate-windows-shutdown-for-debugging Matt McHenry 8 лет назад 0
3
unforgettableid

Вы можете использовать rmlogotest.exe(Restart Manager Logo Test Tool). Эта бесплатная утилита, написанная Microsoft, является частью Windows App Certification Kit.

Чтобы получить последнюю версию Windows App Certification Kit, загрузите и запустите установщик Windows SDK. (Вы можете найти последнюю версию установщика Windows SDK, выполнив поиск в Google.) Снимите все флажки, кроме поля Windows App Certification Kit. Подождите, пока комплект будет загружен и установлен. Если я правильно помню, комплект составляет пару сотен мегабайт.

rmlogotest.exeвероятно будет, C:\Program Files (x86)\Windows Kits\10\App Certification Kitесли вы используете версию 10 Windows SDK.

Откройте командную строку. Перейдите в правильный каталог. rmlogotestЗатем введите пробел, а затем идентификационный номер процесса.

Если процесс «Перезапустить менеджер в курсе», rmlogotestон корректно перезапустит его и сообщит «Проверка логотипа пройдена». В противном случае rmlogotestпопросит его завершить корректно, а затем может сообщить вам «Ошибка проверки логотипа».

Я попытался использовать rmlogotest.exeдля завершения Notepad, и он работал как ожидалось. Блокнот спросил меня, хочу ли я сохранить несохраненный текст, который я ввел.

(Если вам интересно, что такое Restart Manager и что он делает, позвольте мне объяснить. Restart Manager является частью Windows и используется установщиком Windows 4.0 и выше. Когда установщику Windows требуется перезаписать или удалить открытый файл, он использует пошаговый процесс. Он сообщает Restart Manager о необходимости корректно завершить процесс, использующий файл. Он перезаписывает файл. Затем он сообщает Restart Manager о необходимости запустить процесс снова.)