Получение выходных данных из одного исполняемого файла в другом - PullRequest
1 голос
/ 09 ноября 2009

В настоящее время я пытаюсь получить вывод исполняемого консольного приложения в другое. Если быть точным, небольшой обзор того, что я пытаюсь сделать:

У меня есть один исполняемый файл, который я не могу отредактировать и не вижу его кода. При выполнении он записывает несколько (честно говоря) строк в консоль.

Теперь я хочу написать еще один исполняемый файл, который запускает приведенный выше и читает то, что он пишет.

Мне это кажется простым, поэтому я начал кодировать, но в итоге получил сообщение об ошибке, в котором говорилось, что StandardOut has not been redirected or the process hasn't started yet.

Я попробовал это с помощью такой структуры (C #):

Process MyApp = Process.Start(@"C:\some\dirs\foo.exe", "someargs");
MyApp.Start();
StreamReader _Out = MyApp.StandardOutput;

string _Line = "";

while ((_Line = _Out.ReadLine()) != null)
    Console.WriteLine("Read: " + _Line);

MyApp.Close();

Я могу открыть исполняемый файл, и он тоже открывает тот, который внутри, но как только дело доходит до чтения возвращаемых значений, приложение вылетает.

Что я делаю не так?!

Ответы [ 3 ]

6 голосов
/ 09 ноября 2009

Ознакомьтесь с документацией для свойства Process.StandardOutput . Вам нужно будет установить логическое значение, указывающее, что вы хотите перенаправить поток, а также отключить выполнение оболочки.

Примечание из документации:

Чтобы использовать StandardOutput, необходимо установить для ProcessStartInfo .. ::. UseShellExecute значение false, а для ProcessStartInfo .. ::. RedirectStandardOutput необходимо установить значение true. В противном случае чтение из потока StandardOutput вызывает исключение

Вам нужно немного изменить свой код, чтобы скорректировать изменения:

Process myApp = new Process(@"C:\some\dirs\foo.exe", "someargs");
myApp.StartInfo.UseShellExecute = false;
myApp.StartInfo.RedirectStandardOutput = false;

myApp.Start();

string output = myApp.StandardOutput.ReadToEnd();
p.WaitForExit();
2 голосов
/ 09 ноября 2009

вы можете попробовать установить processStartInfo.RedirectStandardOutput = true;

0 голосов
/ 09 ноября 2009

Как отмечено выше, вы можете использовать RedirectStandardOutput как здесь .

Другой, более грязный способ - это что-то вроде

using (Process child = Process.Start
  ("cmd", @"/c C:\some\dirs\foo.exe someargs > somefilename"))
  {
    exeProcess.WaitForExit();
  }

, а затем читать его вывод из somefilename

...