C# 通过 OutputDataReceived 事件捕获进程输出

声明:本页面是StackOverFlow热门问题的中英对照翻译,遵循CC BY-SA 4.0协议,如果您需要使用它,必须同样遵循CC BY-SA许可,注明原文地址和作者信息,同时你必须将它归于原作者(不是我):StackOverFlow 原文地址: http://stackoverflow.com/questions/11631443/
Warning: these are provided under cc-by-sa 4.0 license. You are free to use/share it, But you must attribute it to the original authors (not me): StackOverFlow

提示:将鼠标放在中文语句上可以显示对应的英文。显示中英文
时间:2020-08-09 18:35:40  来源:igfitidea点击:

Capturing process output via OutputDataReceived event

c#processstdout

提问by Boris

I'm trying to capture process output in "realtime" (while it's running). The code I use is rather simple (see below). For some strange reason the OutputDataReceived event is never called. Why?

我正在尝试“实时”(在运行时)捕获进程输出。我使用的代码相当简单(见下文)。由于某种奇怪的原因,从未调用 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...
    }

采纳答案by Chris

You need to call

你需要打电话

mProcess.BeginOutputReadLine();

BeginOutputReadLine- "Begins asynchronous read operations on the redirected StandardOutput stream of the application."

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

回答by guest1

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