有很多示例显示如何重定向另一个应用程序的stdout。但是,我想让应用程序保持其stdout,并仅在我的父进程中检索stdout的副本。这可能吗?
我的场景:我有一些测试(使用Visual Studio Test Runner)启动外部进程(服务器)来进行测试。服务器在其标准输出中输出了许多有用的调试信息,我想在测试结果中包含这些信息。
我可以捕获进程输出并通过Trace.WriteLine输出它以便稍后显示在测试详细信息中。但是,在测试运行时看到服务器窗口及其输出以查看当前进度(测试可能运行很长时间)会很高兴。
所以我正在寻找复制这些信息的方法,而不是简单地重定向它。
有什么想法吗?
答案 0 :(得分:2)
这对你有用吗?
var outputText = new StringBuilder();
var errorText = new StringBuilder();
using (var process = Process.Start(new ProcessStartInfo(
@"YourProgram.exe",
"arguments go here")
{
RedirectStandardError = true,
RedirectStandardOutput = true,
UseShellExecute = false
}))
{
process.OutputDataReceived += (sendingProcess, outLine) =>
{
outputText.AppendLine(outLine.Data); // capture the output
Console.Out.WriteLine(outLine.Data); // echo the output
}
process.ErrorDataReceived += (sendingProcess, errorLine) =>
{
errorText.AppendLine(errorLine.Data); // capture the error
Console.Error.WriteLine(errorLine.Data); // echo the error
}
process.BeginOutputReadLine();
process.BeginErrorReadLine();
process.WaitForExit();
// At this point, errorText and outputText StringBuilders
// have the captured text. The event handlers already echoed the
// output back to the console.
}
答案 1 :(得分:1)
编写一个将STDIN转发到STDOUT的小程序,同时用它做其他事情呢?
然后,您可以将启动服务器进程的命令替换为启动服务器进程的命令,并将其输出传递给上述实用程序。这样,您将对输出进行编程访问,并在输出窗口中实时查看。