C# 如何复制进程的标准输出(复制,而不是重定向)?

C# 如何复制进程的标准输出(复制,而不是重定向)?,c#,.net,unit-testing,mstest,stdout,C#,.net,Unit Testing,Mstest,Stdout,有很多例子说明了如何重定向另一个应用程序的stdout。但是,我希望应用程序保留其标准输出,并且只在父进程中检索标准输出的副本。这可能吗 我的场景:我有一些测试(使用VisualStudioTestRunner),它们启动一个外部进程(服务器)来进行测试。服务器在其标准输出中输出了许多有用的调试信息,我希望将这些信息包括在测试结果中 我可以捕获流程输出,并通过Trace.WriteLine将其输出,以便稍后在测试详细信息中显示。不过,最好在测试运行时看到服务器窗口及其输出,以查看当前进度(测试可

有很多例子说明了如何重定向另一个应用程序的stdout。但是,我希望应用程序保留其标准输出,并且只在父进程中检索标准输出的副本。这可能吗

我的场景:我有一些测试(使用VisualStudioTestRunner),它们启动一个外部进程(服务器)来进行测试。服务器在其标准输出中输出了许多有用的调试信息,我希望将这些信息包括在测试结果中

我可以捕获流程输出,并通过Trace.WriteLine将其输出,以便稍后在测试详细信息中显示。不过,最好在测试运行时看到服务器窗口及其输出,以查看当前进度(测试可能会运行很长时间)

因此,我正在寻找复制此信息的方法,而不是简单地重定向它


有什么想法吗?

写一个小程序,把STDIN转发给STDOUT,同时用它做些别的事情怎么样


然后,您可以将启动服务器进程的命令替换为启动服务器进程并将其输出传输到上述实用程序的命令。这样,您既可以通过编程访问输出,又可以在输出窗口中实时查看输出。

这对您有用吗

        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.
        }

嗯,也许回声/T形流会有帮助?(谷歌“c#tee stream”获得更多点击)我不确定这一点,因为我无法在这里测试,但Process.OutputDataReceived事件可能会为您提供所需的行为,请参阅:OutputDataReceived是我正在使用的,但它需要流重定向,因此会从服务器控制台窗口中删除输出…是的,这是一个解决方案,我考虑过了,只是在我的测试中使用它似乎有点过头了。我希望有一个更简单的解决办法。另一个(小)缺点是,我的服务器使用的是在转发器应用程序中看不到的彩色输出。我认为显示服务器窗口的小好处不足以使测试代码进一步复杂化。不过,您的想法需要做一些小的修改:在测试代码中捕获服务器的输出,并将其发送到这个“echo”程序,该程序只需在控制台中显示即可。通过重定向到将输出“广播”给多个“侦听器”的复合输出类来复制控制台输出。有很多模式;这可能是实现起来不太复杂的代码之一。问题是,此代码是作为microsoft visual studio测试运行程序内部单元测试的一部分运行的。测试运行程序本身没有控制台窗口。。。