【问题标题】:Capturing process output via OutputDataReceived event通过 OutputDataReceived 事件捕获过程输出
【发布时间】:2012-07-22 19:19:27
【问题描述】:

我正在尝试“实时”捕获进程输出(在它运行时)。我使用的代码相当简单(见下文)。由于某些奇怪的原因,从未调用 OutputDataReceived 事件。为什么?

private void button2_Click(object sender, EventArgs e)
    {
      // Setup the process start info
      var processStartInfo = new ProcessStartInfo("ping.exe", "-t -n 3 192.168.100.1")
      {
        UseShellExecute = false,
        RedirectStandardOutput = true
      };

      // Setup the process
      mProcess = new Process { StartInfo = processStartInfo, EnableRaisingEvents = true };

      // Register event
      mProcess.OutputDataReceived += OnOutputDataReceived;

      // Start process
      mProcess.Start();
      mProcess.WaitForExit();
    }

    void OnOutputDataReceived(object sender, DataReceivedEventArgs e)
    {
       //Never gets called...
    }

【问题讨论】:

    标签: c# process stdout


    【解决方案1】:

    你需要打电话

    mProcess.BeginOutputReadLine();
    

    BeginOutputReadLine - “开始对应用程序的重定向 StandardOutput 流进行异步读取操作。”

    【讨论】:

    • 此外,外部进程需要在输出某些内容时刷新其输出缓冲区。如果不刷新,输出缓冲区可能会持续到外部进程退出;这使得主应用程序无法“实时”捕获输出。
    • @BobKruithof: 确实如此。外部进程确实需要实际发送数据,但没有任何其他信息,最容易保留所提出的问题。 :)
    • 另外,一些应用程序正在写入标准错误而不是标准输出。通常,您在手动查看输出时不会有所作为。因此,请尝试添加以防万一:分别为“RedirectStandardError = true”和“mProcess.BeginErrorReadLine();”。
    • @altumano:有点切题,但如果您确实想从 ERROR 流中捕获内容,那么您当然最重要的是必须绑定到 ErrorDataReceived 事件。 :)
    • 请注意,此调用需要在 mProcess.Start() 之后进行。输出将在两次调用之间保留。
    【解决方案2】:

    void ExecuteCommand(string cmdpath, string cmdargs)
    {
        string command = cmdpath + " " + cmdargs;
    
        tabc_results.SelectTab(1); 
        DoConsole("\r\nCmd>> " + command + "\r\n");
    
        var processInfo = new System.Diagnostics.ProcessStartInfo("cmd.exe", "/c " + command);
        processInfo.CreateNoWindow = true;
        processInfo.UseShellExecute = false;
        processInfo.RedirectStandardError = true;
        processInfo.RedirectStandardOutput = true;
    
        var process = System.Diagnostics.Process.Start(processInfo);
    
        process.OutputDataReceived += (
            object sender, System.Diagnostics.DataReceivedEventArgs e
        ) => DoConsole("stdout>>  " + e.Data + "\r\n");
        //Console.WriteLine("output>>" + e.Data);
        process.BeginOutputReadLine();
    
        process.ErrorDataReceived += (
            object sender, System.Diagnostics.DataReceivedEventArgs e
        ) =>DoConsole("stderr>>  " + e.Data + "\r\n");
        //Console.WriteLine("error>>" + e.Data);
        process.BeginErrorReadLine();
    
        process.WaitForExit();
    
        DoConsole("retcode>> " + process.ExitCode.ToString() + "\r\n");
        //Console.WriteLine("ExitCode: {0}", process.ExitCode);
        process.Close();
    }
    

    【讨论】:

      猜你喜欢
      • 2013-04-27
      • 2012-07-30
      • 1970-01-01
      • 1970-01-01
      • 2023-03-12
      • 1970-01-01
      • 2018-05-15
      • 2014-09-19
      • 2014-12-01
      相关资源
      最近更新 更多