2012-06-16 2 views
3

Я пытаюсь выполнить команды командной строки и прочитать вывод на C#. Это мой код:Выход командной строки, считанный пустой строкой

ProcessStartInfo cmdInfo = new ProcessStartInfo("cmd.exe", "/c " + command); 
cmdInfo.CreateNoWindow = true; 
cmdInfo.RedirectStandardOutput = true; 
cmdInfo.UseShellExecute = false; 

Process cmd = new Process(); 
cmd.StartInfo = cmdInfo; 
cmd.Start(); 
string result = cmd.StandardOutput.ReadToEnd(); 
cmd.WaitForExit(); 
cmd.Close(); 
return result; 

Он работает большую часть времени, но иногда приводят = «», когда это невозможно для команды, я использую (например, маршрут добавить должен дать выход на успех или неудачу). Есть идеи? Мне было интересно, может быть, я создал условие гонки между процессом и вызовом ReadToEnd?

ответ

3

Не все выходные данные записываются в StandardOutput; многие приложения вместо этого будут писать в StandardError, если что-то пойдет не так. Вам нужно будет прочитать от обоих, чтобы получить весь вывод.

Пока приложение никогда не блокирует входные данные, должно быть безопасно вызвать ReadToEnd() на обоих выходных потоках, чтобы получить весь вывод. Однако более безопасным вариантом является подключение события к событиям OutputDataReceived и ErrorDataReceived. Вы можете приложить к ним лямбда-выражение, которое близко к локальным переменным, чтобы сделать вещи очень простыми:

+0

Удивительный! При этом моя проблема была совершенно исправлена. Мне любопытно, хотя, когда команды успешны, почему «ОК!» написано на StandardError? – akroy

+0

приложение может писать все, что захочет, в зависимости от того, какой он хочет. Часто утилит командной строки записывает сообщение о состоянии в стандартную ошибку, поскольку стандартный вывод часто перенаправляется в файл; сообщение «ОК» на stderr все равно будет отображаться на экране, но не будет выводиться, если вы хотите его проанализировать. –

+0

Ах, так по существу, потому что ОК! не является полезным из контекста. Я думаю, что все имеет смысл, спасибо! – akroy

Смежные вопросы