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

时间:2009-04-24 16:53:29

标签: .net process stdout

我正在产生一个在可见控制台窗口中运行的子进程(它是一个运行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();

问题是输出没有显示在子进程的控制台窗口中;我只是在进程运行时屏幕上出现一个空白的控制台窗口,它在完成时消失。

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

2 个答案:

答案 0 :(得分:4)

以下是我使用的内容,不使用单独的帖子:


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();
}

答案 1 :(得分:3)

重定向标准后,它不再指向控制台。要写入控制台,您必须手动执行此操作。

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