【问题标题】:Capture standard output and still display it in the console window捕获标准输出并仍然在控制台窗口中显示
【发布时间】:2010-10-21 15:58:30
【问题描述】:

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

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

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

【问题讨论】:

    标签: .net process stdout


    【解决方案1】:

    这是我使用的,没有使用单独的线程:

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

    【讨论】:

    • 我假设 OP 希望生成过程继续运行 - 我没有注意到对 WaitForExit 的调用。我会使用 WaitForExit 而不是你的 while 循环 - 紧密循环不是一个好主意。
    • 我试图记住我没有在那里使用 WaitForExit 的原因。
    • 查看我的 SVN 历史记录,这是因为我曾经将其设置为“while(!proc.HasExited) { /*read stuff in here*/ }”,但这并没有得到全部文本,当我将它移到阅读循环之外时,没想到将其更改为 WaitForExit。
    【解决方案2】:

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

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

    【讨论】:

    • 哇——我以前没见过 OutputDataReceived。整洁!
    • 这似乎回答了我是否可以在子进程拥有的控制台窗口中显示输出并同时重定向到父进程的问题。我的下一个问题是,是否可以不重定向输出,而在进程退出时只从控制台捕获它?或者,如果没有,手动创建控制台窗口的最佳方法是什么,以便我可以在进程执行时将重定向的输出写入它(使用OutputDataReceived)?
    • 看看msdn.microsoft.com/en-us/library/… 。它有一个示例(您可能想要关闭除 C# 之外的所有语言)
    猜你喜欢
    • 2010-11-19
    • 1970-01-01
    • 2012-09-09
    • 1970-01-01
    • 1970-01-01
    • 2016-05-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多