標籤:
使用事件和委託,進程有2個事件OutputDataReceived、ErrorDataReceived可用於重新導向標準輸出和標準錯誤輸出;
需要注意的是InputDataReceived並不是process的事件,所以標準輸入並不可以如此重新導向;
使用前需加上: using System.Diagnostics; //可使用process
第一步:確定必要成分
1 Process StartInfostartInfo =newProcessStartInfo(.exe);2 startInfo.CreateNoWindow = true; //不建立視窗3 startInfo.UseShellExecute = false;4 //不使用系統外殼程式啟動,重新導向輸出的話必須設為false5 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。
C#輸入輸出重新導向 方法二:非同步process