将一个进程对象的stdout重定向到另一个进程对象的stdin

时间:2009-08-28 21:43:59

标签: c# ipc

如何设置两个外部可执行文件从c#应用程序运行,其中第一个stdout从第二个传递到stdin?

我知道如何使用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);

$ pipes [1]将成为链中最后一个程序的标准输出。有没有办法在c#中实现这个目标?

4 个答案:

答案 0 :(得分:11)

这是将一个过程的标准输出连接到另一个过程的标准输入的基本示例。

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

答案 1 :(得分:0)

您可以使用System.Diagnostics.Process类创建2个外部进程,并通过StandardInput和StandardOutput属性将输入和输出粘在一起。

答案 2 :(得分:0)

使用System.Diagnostics.Process启动每个进程,在第二个进程中将RedirectStandardOutput设置为true,并将第一个RedirectStandardInput设置为true。最后将第一个的StandardInput设置为第二个的StandardOutput。您需要使用ProcessStartInfo来启动每个进程。

以下是example of one重定向。

答案 3 :(得分:0)

您可以使用我创建的名为CliWrap的库。它支持非常有表现力的语法,用于管道化Shell命令。它直接与二进制流一起使用,因此比解码字符串或在内存中缓冲数据更有效。

print(df1)
     A  B     C
0  YES  x   BAD
1   NO  y  FINE
2  YES  z  GOOD

此处有关管道的更多信息:https://github.com/Tyrrrz/CliWrap#piping