Перенаправление stdout одного объекта процесса на stdin другого - PullRequest
4 голосов
/ 29 августа 2009

Как настроить два внешних исполняемых файла для запуска из приложения c #, в котором стандартный вывод первого перенаправляется на стандартный ввод второго?

Я знаю, как запускать внешние программы, используя объект Process, но я не вижу способа сделать что-то вроде «myprogram1 -some -options | myprogram2 -some -options». Мне также нужно поймать стандартный вывод второй программы (в этом примере myprogram2).

В PHP я бы просто сделал это:

$descriptorspec = array(
            1 => array("pipe", "w"),  // stdout
        );

$this->command_process_resource = proc_open("myprogram1 -some -options | myprogram2 -some -options", $descriptorspec, $pipes);

И $ pipe [1] будет выводом из последней программы в цепочке. Есть ли способ сделать это в C #?

Ответы [ 3 ]

11 голосов
/ 29 августа 2009

Вот базовый пример подключения стандартного выхода одного процесса к стандартному входу другого.

Process out = new Process("program1.exe", "-some -options");
Process in = new Process("program2.exe", "-some -options");

out.UseShellExecute = false;

out.RedirectStandardOutput = true;
in.RedirectStandardInput = true;

using(StreamReader sr = new StreamReader(out.StandardOutput))
using(StreamWriter sw = new StreamWriter(in.StandardInput))
{
  string line;
  while((line = sr.ReadLine()) != null)
  {
    sw.WriteLine(line);
  }
}
0 голосов
/ 29 августа 2009

Используйте System.Diagnostics.Process для запуска каждого процесса, а во втором процессе установите для RedirectStandardOutput значение true, а для первого RedirectStandardInput - true. Наконец, установите StandardInput первого в StandardOutput второго. Вам нужно использовать ProcessStartInfo для запуска каждого процесса.

Вот пример одного перенаправления.

0 голосов
/ 29 августа 2009

Вы можете использовать класс System.Diagnostics.Process, чтобы создать 2 внешних процесса и соединить входы и выходы вместе через свойства StandardInput и StandardOutput.

...