Получение вывода из одного исполняемого файла в другой

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

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

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

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

Я попробовал это, используя эту структуру (С#):

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

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

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


person F.P    schedule 09.11.2009    source источник
comment
Вас может заинтересовать мой ответ на этот вопрос: stackoverflow.com/questions/1096591/   -  person Joel Goodwin    schedule 09.11.2009


Ответы (3)


Ознакомьтесь с документацией по 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();
person Kasper Holdum    schedule 09.11.2009
comment
Это было быстро ... извините, что не попробовал TFM сначала :( В следующий раз получится лучше - person F.P; 09.11.2009

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

person brysseldorf    schedule 09.11.2009

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

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

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

А затем прочитать его вывод из somefilename

person yu_sha    schedule 09.11.2009