Процесс Shutdown.exe с несколькими аргументами, не работает - PullRequest
3 голосов
/ 18 января 2012

Я хочу создать процесс, который использует 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);

Где секунд - это локальная переменная типа int, пользователь решает.

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

Причина, по которой я думаю, что это связано с несколькими аргументами, заключается в том, что мой метод прерывания текущего выключения системы работает (где я создал системное отключение вручную из командной строки cmd).Это почти то же самое, за исключением 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);

1 Ответ

7 голосов
/ 18 января 2012

Быстрая проверка сообщения об использовании 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();

К сожалению, я не могу сказать вам, почему версия командной строкипринимает префиксы 'dash' в опциях, а исполняемая версия 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();
...