Запуск командной строки и получение ответа

Регистрация
28.10.2017
Сообщения
1 154
Реакции
282
Сайт
tehadm.ru
В .NET для запуска нового процесса используется статический метод Process.Start, который возвращает экземпляр класса Process. У этого класса есть свойство, которое предоставляет доступ к потоку, в который программа может выводить сообщения: StandardOutput. Доступ дается не напрямую, а через StreamReader, что даже удобнее. Для того, чтобы программа выводила результат не в консоль, а в StandardOutput, необходимо в свойствах процесса (ProcessStartInfo), включить опцию RedirectStandardOutput.

Если перед вами стоит задача запустить консольное приложение из своей программы и прочитать то, что оно выведет в консоль, воспользуйтесь методом Process.Start для запуска приложения, и используйте StreamReader полученный из StandardOutput, чтобы прочесть результат. Например, можно прочитать все данные которые содержит поток в текстовом формате используя метод ReadToEnd.

Но есть нюанс. Нельзя сразу взять и прочитать ответ, потому что процессу требуется некоторое время чтобы выполнить работу и вывести результат в консоль. Метод ReadToEnd будет ожидать завершения процесса. Если во время ожидания необходимо чтобы ваша программа продолжала функционировать (например перерисовывать окно, реагировать на действия пользователя), используйте метод ReadToEndAsync, который вызовет делегат по завершению и передаст ему результат, или метод ReadLine, который возвращает управление по мере получения строк, а не дожидается окончания процесса.

C#:
ProcessStartInfo startInfo = new ProcessStartInfo(@"C:\app.exe", @"/h");
// можно даже скрыть окно запущенного процесса
startInfo.WindowStyle = ProcessWindowStyle.Hidden;
// указываем что программа должна выводить резульат в поток привязанный к свойству StandardOutput
startInfo.RedirectStandardOutput = true;
startInfo.UseShellExecute = false;
startInfo.CreateNoWindow = true;
// запускаем процесс
Process procCommand = Process.Start(startInfo);
// получаем ответ запущенного процесса
StreamReader srIncoming = procCommand.StandardOutput;
string result = srIncoming.ReadToEnd();
 
Верх