2011-02-01 69 views
3

我需要在我的c#程序中執行此操作。運行命令並等待在c#中完成#

  Process process = LaunchCommandWindow("Special args and environment set") 
      process.StandardInput.WriteLine("cmd1"); 
      process.StandardInput.WriteLine("cmd2"); 

      //Parse logs 
      using (Streamreader sr = new()) 
      { etc etc..} 

我的命令執行正確,但問題是,解析記錄代碼犯規等待CMD1和CMD2執行完成。我無法致電退出和處理。 waitforexit因爲在解析日誌之後,我有更多的命令可以執行。

以下是如何設置流程啓動信息。 LaunchCommandWindow()

  ProcessStartInfo startInfo = new ProcessStartInfo(); 

     startInfo.FileName = Path.Combine(Environment.SystemDirectory, "cmd.exe"); 
     startInfo.Arguments = "/K " + newEnvironmentArgs; 

     startInfo.UseShellExecute = false; 
     startInfo.RedirectStandardInput = true; 
     Process process = new Process(); 
     process.StartInfo = startInfo; 
     process.Start(); 

     return process; 

我如何解析日誌代碼等待CMD2完成?

謝謝。

回答

3

如果「cmd2」向標準輸出流寫入完成,則可以在標準輸出上監聽,直到看到該事件,然後從那裏進行處理。

+0

這將工作,雖然主線程將進入忙碌的等待狀態,同時它會查找完成消息。一個新的線程會阻止程序進入「無響應」狀態。 – Jeff 2011-02-01 19:10:40

+1

+1爲了做到這一點,他還需要將`RedirectStandardOutput`設置爲true。 – 2011-02-01 19:10:54

1

創建一個新線程來運行任務。

使用BackgroundWorker

完成後,它會引發一個事件(在您的主線程中),您可以繼續運行該事件。

這樣可以防止程序掛起,如果還有其他工作要做,可以讓其他線程運行。

Here's a tutorial

----- -----編輯

經過進一步研究,這裏是爲休息一個念頭: 你必須設置RedirectStandardOutput爲true,如果你想讀輸出。

如果你不這樣做運行在同一窗口中兩個命令,你可以叫 process.WaitForExit(int) 其中int是等待的毫秒數,然後啓動一個新的進程(或process與新的論據)發射cmd2。

0

我認爲Process.WaitForExit()方法正是你所需要的。還有Process.HasExited屬性。
而對於啓動使用類似的東西「cmd/C cmd1 & cmd2」