使用事件和委托,進程有2個事件OutputDataReceived、ErrorDataReceived可用於重定向標准輸出和標准錯誤輸出;
需要注意的是InputDataReceived並不是process的事件,所以標准輸入並不可以如此重定向;
使用前需加上: using System.Diagnostics; //可使用process
第一步:確定必要成分
1 Process StartInfostartInfo =newProcessStartInfo(.exe); 2 startInfo.CreateNoWindow = true; //不創建窗口 3 startInfo.UseShellExecute = false; 4 //不使用系統外殼程序啟動,重定向輸出的話必須設為false 5 startInfo.RedirectStandardOutput = true; //重定向輸出, 6 startInfo.RedirectStandardError = true;
第二步:使用try catch塊
1 try 2 { 3 Processprocess = Process.Start(startInfo); 4 process.OutputDataReceived += (s, _e)=> Console.WriteLine(_e.Data); 5 process.ErrorDataReceived += (s, _e) =>Console.WriteLine(_e.Data); 6 //當EnableRaisingEvents為true,進程退出時Process會調用下面的委托函數 7 process.Exited += (s, _e) => Console.WriteLine("Exited with " + _process.ExitCode); 8 process.EnableRaisingEvents = true; 9 process.BeginOutputReadLine(); 10 process.BeginErrorReadLine(); 11 process.WaitForExit(); 12 } 13 catch (Exception e) 14 { 15 Console.WriteLine(ex.Message); 16 }
需要注意的是,不能對同一個重定向流混合使用異步和同步讀取操作。
在異步或同步模式下打開 Process 的重定向流后,對該流的所有進一步的讀取操作都必須在同一模式下進行。
例如,不要對StandardOutput 流調用BeginOutputReadLine 后接着調用ReadLine,反之亦然。
但是,可以在不同的模式下讀取兩個不同的流。例如,可以先調用BeginOutputReadLine,然后再為StandardError 流調用 ReadLine。