Как отправить команду Shutdown для обработки через CMD Prompt в Windows
В настоящее время я работаю разработчиком программного обеспечения, и я использую множество инструментов, поэтому мне нужно закрыть их, когда закончите работу. Итак, что я сделал, я создал командный файл с командой tskill и списком программ, которые я использую, например.
tskill skype
tskill outlook
tskill devenv
tskill explorer
start explorer
Есть одна проблема с этим: изменения в инструментах не сохраняются при уничтожении процесса, для примера последнего проекта, открытых файлов, визуальных позиций элементов управления и всего остального. Эти настройки сохраняются только при закрытии инструмента, но на самом деле требуется много времени, чтобы щелкнуть каждый из них.
Итак, мой вопрос: Могу ли я отправить команду отключения на программное обеспечение, а не убить процесс?
Примечание: Мне нужна команда для CMD, а не для программирования решения, как я уже упоминал выше. Мне нужна команда типа "tskill skype", которая убивает процесс skype. Windows может отправить эту команду, потому что когда вы закрываете окна, окна отправляют команду завершения всех запущенных программ. Но если не удается завершить работу, то окна убивают процесс, как я делаю это выше.
Спасибо заранее.
Ответы
Ответ 1
Протестировано в Windows 7:
taskkill /IM notepad.exe
Обратите внимание, что вы должны указать расширение .exe
. Я предполагаю, что это делает то, что вам нужно: оно не просто убивает процесс, но отправляет сигнал "shutdown", который отображает "Сохранить несохраненные изменения?". диалог в Блокноте и других редакторах.
Ответ 2
Если ваше приложение поддерживает стандартные сообщения Windows, вы можете использовать rmtool
, чтобы лежать в приложении, и сообщить ему, что компьютер выключается. См. Как имитировать выключение Windows для отладки?
В script вам нужно будет найти PID процесса до того, как (pslist
из sysinternals предоставит информацию, но вам нужно будет проанализировать результат).
И если они не делают чистое закрытие, просто делайте, как делают окна, когда они закрываются: используйте rmtool, чтобы попросить всех из них выйти из игры, а затем 30 секунд убить всех, кто все еще стоит (как для Outlook, так и для devenv это может быть даже немного коротким...).
Ответ 3
Невозможно отправить команду save, прежде чем завершить процесс (по крайней мере, не с пакетным файлом), но вы можете сделать это вручную из С# (консольное приложение?).
using System.Diagnostics;
using System.Runtime.InteropServices;
class Program
{
[DllImport("user32.dll")]
public static extern int SetForegroundWindow(IntPtr hWnd);
static void Main(string[] args)
{
var ps = Process.GetProcessesByName("devenv");
foreach (var p in ps)
{
if (!p.MainWindowTitle.Contains("api"))
{
SetForegroundWindow(p.MainWindowHandle);
System.Windows.Forms.SendKeys.SendWait("^+S"); //simulates CTRL + SHIFT + S
p.CloseMainWindow();
}
}
}
Я использовал VS определенный ярлык для File- > Save All
Существует и более сложный способ использования Windows Api, но вы не хотите идти по этому маршруту для простого приложения.
Примечание. Необходимо иметь ссылку на System.Windows.Forms