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

时间:2011-10-21 13:50:38

标签: c# .net unit-testing mstest stdout

有很多示例显示如何重定向另一个应用程序的stdout。但是,我想让应用程序保持其stdout,并仅在我的父进程中检索stdout的副本。这可能吗?

我的场景:我有一些测试(使用Visual Studio Test Runner)启动外部进程(服务器)来进行测试。服务器在其标准输出中输出了许多有用的调试信息,我想在测试结果中包含这些信息。

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

所以我正在寻找复制这些信息的方法,而不是简单地重定向它。

有什么想法吗?

2 个答案:

答案 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的小程序,同时用它做其他事情呢?

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