C#重定向(管道)进程输出到另一个进程

13

我正在尝试使用Process类在C#中运行一个进程。

Process p1  = new process();
p1.startinfo.filename =  "xyz.exe";
p1.startinfo.arguments = //i am building it based on user's input.
p1.start();

根据用户输入,我正在构建参数值。现在我有一个情况,在这种情况下,我必须将p1的输出输送到另一个进程中,比如说grep。所以我基本上尝试了这个:

p1.startinfo.arguments = "-info |grep 1234" ;

我的意图是像这样:xyz.exe -info|grep 1234

但在.NET中似乎不起作用。实际上,我可以创建另一个进程变量并将“grep”作为单独的进程运行。但我想知道是否有办法像我上面尝试的那样做。


我找到了一篇博客文章,正好涵盖了这个问题:在Process/ProcessStartInfo类上使用管道输出重定向... - Sam Harwell
如果您不想使用CMD,请查看MedallionShell库。它可以使进程流重定向(以及其他进程管理方面)更加简单。 - ChaseMedallion
1个回答

22

更简单的方法是只需使用 cmd 作为您的进程。

Process test = new Process();
test.StartInfo.FileName = "cmd";
test.StartInfo.Arguments = @"/C ""echo testing | grep test""";
test.Start();

你可以像处理任何普通进程一样捕获输出或者其他你想要的东西。这只是我编写的一个快速测试,但它可以将测试输出到控制台,因此我希望这对你计划使用管道执行的任何其他操作也是有效的。如果你想让命令保持打开状态,请使用 /K 而不是 /C,窗口在进程完成后不会关闭。


1
我需要在Linux上不使用cmd来完成同样的操作。我该如何将源进程的StreamReader连接到目标进程的StreamWriter? - feedc0de
1
在Linux中如何做到这一点? :) - knocte
如何在Linux上做完全相同的事情 :) - Saw
基本上,对于Linux系统,您需要将“cmd”替换为“bash -c”。结果类似于info.FileName = "/bin/bash"; info.Arguments = "-c "top -bn1 | grep 'Cpu(s)' | sed 's/.*, \([0-9.]\)% id./\1/' ""; 这个示例可以获取我可用的CPU%。 - Nick Kovalsky

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接