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

本文关键字:复制 重定向 进程 何复制 标准输出 | 更新日期: 2023-09-27 18:11:51

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

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

我可以捕获过程输出并通过Trace输出它。WriteLine让它在稍后的测试细节中显示。但是,在测试运行时看到服务器窗口及其输出将是很好的,以查看当前进度(测试可以运行很长时间)。

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

任何想法?

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

这对你有用吗?

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

编写一个将STDIN转发到STDOUT的小程序,同时也用它做其他事情怎么样?

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