2012-01-18 4 views
3

Я хочу создать процесс, который использует shutdown.exe для выключения компьютера по истечении заданного времени.Процесс Shutdown.exe с несколькими аргументами, не работает

Вот мой код:

ProcessStartInfo startInfo = new ProcessStartInfo(); 
startInfo.CreateNoWindow = false; 
startInfo.UseShellExecute = false; 
startInfo.WindowStyle = ProcessWindowStyle.Hidden; 
startInfo.FileName = "shutdown.exe"; 
startInfo.Arguments = "–s –f –t " + seconds; 
Process.Start(startInfo); 

Где секунд является ИНТ локальной переменной, пользователь решает.

Когда я запускаю свой код, ничего не происходит. Но когда я вручную перейду в командной строке cmd и введите:
shutdown.exe - s -f -t 999
затем Windows сделает всплывающее окно и сообщит, что система отключится через 16 минут.

Причина, по которой я считаю, что это из-за множества аргументов, заключается в том, что мой метод прервать текущее завершение работы системы (где я создал системное управление вручную из командной строки). Это почти то же самое, за исключением startInfo.Argument:

ProcessStartInfo startInfo = new ProcessStartInfo(); 
startInfo.CreateNoWindow = false; 
startInfo.UseShellExecute = false; 
startInfo.WindowStyle = ProcessWindowStyle.Hidden; 
startInfo.FileName = "shutdown.exe"; 
startInfo.Arguments = "-a"; 
Process.Start(startInfo); 
+2

ли ваша машина на самом деле отключение после 16 минут с несколькими аргументами? Вы пробовали это с секундами = 1? Причина, по которой я спрашиваю, заключается в том, что мне интересно, имеет ли значение тот факт, что вы устанавливаете WindowStyle в Hidden? – JohnL

+0

Наверное, бесполезная мысль здесь, но ничего не знающая о вашем исполняемом файле, что произойдет, если вы укажете 'UseShellExecute = true'? –

+0

Все еще ничего не происходит, когда изменяю код: startInfo.Arguments = "-s -f -t 1"; Я знаю, что что-то не так, потому что я могу быстро увидеть подсказку cmd, где он показывает, что команда не набрана правильно. Мне удалось получить снимок экрана: [ссылка] (http://img215.imageshack.us/img215/8954/shutdowntimer.png) – Toby

ответ

7

Быстрая проверка сообщения об использовании SHUTDOWN.EXE показывает, что он ожидает, что аргументы опций следующие косой черты («/») не дефис («-») ,

Замена строки:

 startInfo.Arguments = "–s –f –t " + seconds; 

С:

 startInfo.Arguments = "/s /f /t " + seconds; 

Урожайность рабочий результат на моей коробке с C# Express 2010

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

 startInfo.RedirectStandardOutput = true; 
     startInfo.RedirectStandardError = true; 

     Process p = Process.Start(startInfo); 
     string outstring = p.StandardOutput.ReadToEnd(); 
     string errstring = p.StandardError.ReadToEnd(); 
     p.WaitForExit(); 

К сожалению, я не могу сказать вам, почему версия командной строки принимает «тире» префиксы о вариантах и ​​C# выполняется версия не делает. Однако, мы надеемся, что вы после этого - рабочее решение.

Полный список кода ниже:

 int seconds = 100; 
     ProcessStartInfo startInfo = new ProcessStartInfo(); 
     startInfo.CreateNoWindow = false; 
     startInfo.UseShellExecute = false; 
     startInfo.WindowStyle = ProcessWindowStyle.Hidden; 
     startInfo.FileName = "shutdown.exe"; 
     startInfo.Arguments = "/s /f /t " + seconds; 
     startInfo.RedirectStandardOutput = true; 
     startInfo.RedirectStandardError = true; 
     Process p = Process.Start(startInfo); 
     string outstring = p.StandardOutput.ReadToEnd(); 
     string errstring = p.StandardError.ReadToEnd(); 
     p.WaitForExit(); 
+0

+1 Хотя я уверен, что '-' работает так же, как'/'в этом случае. (Предполагая, что cmd.exe не конвертирует - в /, что было бы нечетным.) –

+0

Большое спасибо.Я не получил это сообщение, потому что окно подсказки cmd исчезло почти мгновенно, и помощь так долго, что я не смог захватить сообщение на снимке экрана. Этот вывод и обработка ошибок, которые вы показали там, очень приятные, спасибо вам снова. – Toby

+0

не работает для меня. процесс начинается настолько часто так быстро, что он падает. есть идеи? – Manticore