我正在产生一个在可见控制台窗口中运行的子进程(它是一个运行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();
问题是输出没有显示在子进程的控制台窗口中;我只是在进程运行时屏幕上出现一个空白的控制台窗口,它在完成时消失。
我想我可以隐藏实际的子进程窗口,并显示第二个窗口,我只需将输出写入捕获的内容,但这似乎比必要的更多工作。有没有办法让输出显示在控制台窗口中,并在完成后仍然捕获它以进行处理?
答案 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”事件。