Процесс выключения.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);

, где seconds - локальная переменная int, решает пользователь.

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

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

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 3

1 ответ:

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

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

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

С:

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

Дает рабочий результат на моей коробке с C# express 2010.

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

        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();