web-dev-qa-db-ja.com

OutputDataReceivedイベントを介したプロセス出力のキャプチャ

プロセスの出力を(リアルタイムで)(実行中に)キャプチャしようとしています。私が使用するコードはかなり単純です(以下を参照)。何らかの奇妙な理由で、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...
    }
38
Boris

電話する必要があります

mProcess.BeginOutputReadLine();

BeginOutputReadLine -"リダイレクトされたアプリケーションのStandardOutputストリームで非同期読み取り操作を開始します。"

68
Chris
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();
}
0
guest1