6

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

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

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

4

2 回答 2

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();
}
于 2009-04-24T17:08:18.343 回答
3

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

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

于 2009-04-24T17:02:59.777 回答