.net 捕获标准输出并仍在控制台窗口中显示

.net 捕获标准输出并仍在控制台窗口中显示,.net,process,stdout,.net,Process,Stdout,我正在生成一个在可见控制台窗口中运行的子进程(它是一个运行MSBuild的批处理文件),我希望在可见控制台窗口中显示该进程生成的输出,并捕获该输出,以便在代码中对其进行处理。我已经阅读了其他几个问题以及处理ProcessStartInfo.RedirectStandardOutput等的MSDN文档,我可以从重定向流中捕获输出并用代码处理它: Process msBuild = new Process(); msBuild.StartInfo.FileName = "Build.bat"; ms

我正在生成一个在可见控制台窗口中运行的子进程(它是一个运行MSBuild的批处理文件),我希望在可见控制台窗口中显示该进程生成的输出,并捕获该输出,以便在代码中对其进行处理。我已经阅读了其他几个问题以及处理ProcessStartInfo.RedirectStandardOutput等的MSDN文档,我可以从重定向流中捕获输出并用代码处理它:

Process msBuild = new Process();
msBuild.StartInfo.FileName = "Build.bat";
msBuild.StartInfo.UseShellExecute = false;
msBuild.StartInfo.RedirectStandardOutput = true;
msBuild.Start();
string output = msBuild.StandardOutput.ReadToEnd();
msBuild.WaitForExit();
问题是输出没有显示在子进程的控制台窗口中;我只是在进程运行时在屏幕上看到一个空白的控制台窗口,当进程完成时,它就会消失


我想我可以隐藏实际的子进程窗口,并显示第二个窗口,我只需在捕获输出时将其写入该窗口,但这似乎需要做更多的工作。有没有办法让输出显示在控制台窗口中,并在完成后仍捕获它以进行处理?

一旦将标准输出重定向出去,它就不再指向控制台。要写入控制台,您必须手动执行


如果希望在进程执行时显示输出,而不是在最后的一个大转储中,可以使用进程类的“OutputDataReceived”事件。

以下是我使用的,而不使用单独的线程:


using(System.Diagnostics.Process proc = new System.Diagnostics.Process())
{
   proc.EnableRaisingEvents = false;
   proc.StartInfo.RedirectStandardOutput = true;
   proc.StartInfo.CreateNoWindow = true;
   proc.StartInfo.UseShellExecute = false;
   proc.StartInfo.Verb = "open";
   proc.StartInfo.FileName = "XXXX";
   proc.Start();
   String sLine = "";
   while ((sLine = proc.StandardOutput.ReadLine()) != null)
   {
      System.Console.WriteLine(sLine);
   }
   proc.WaitForExit(); //Jon Skeet was here!
   errorCode = proc.ExitCode;
   proc.Close();
}

哇-我以前没见过收到的输出数据。整洁的这似乎回答了这样一个问题:是否可以在控制台窗口中显示子进程拥有的输出,并同时将其重定向到父进程。我的下一个问题是,是否可以不重定向输出,只在进程退出时从控制台捕获所有输出?或者,如果没有,手动创建控制台窗口的最佳方法是什么,以便在进程执行时(使用
OutputDataReceived
)将重定向的输出写入控制台窗口?请查看。它有一个例子(您可能希望关闭除C#之外的所有语言),我假设OP希望生成过程继续运行-我没有注意到调用WaitForExit。我会使用WaitForExit而不是你的while循环-紧密循环不是一个好主意。我试图记住我没有在那里使用WaitForExit是否有原因。看看我的SVN历史记录,这是因为我以前使用它作为“while(!proc.HasExited){/*在这里读东西*/}”,但这并没有得到所有的文本,当我把它移出阅读循环时,我没有想到要把它改成WaitForExit。