2009-04-24 104 views
5

我生成了一個在可見控制檯窗口中運行的子進程(這是一個運行MSBuild的批處理文件),並且我希望生成由進程顯示在可見控制檯窗口中,並捕獲該輸出以便我可以在代碼中處理它。我讀過其他一些問題和MSDN文檔處理ProcessStartInfo.RedirectStandardOutput之類的,我可以捕捉從重定向數據流輸出,並在代碼處理它只是罰款:捕獲標準輸出並仍將其顯示在控制檯窗口中

Process msBuild = new Process(); 
msBuild.StartInfo.FileName = "Build.bat"; 
msBuild.StartInfo.UseShellExecute = false; 
msBuild.StartInfo.RedirectStandardOutput = true; 
msBuild.Start(); 
string output = msBuild.StandardOutput.ReadToEnd(); 
msBuild.WaitForExit(); 

的問題是,輸出不顯示在子進程的控制檯窗口中;當進程運行時,我只是在屏幕上看到一個空白的控制檯窗口,當它完成時消失。

我想我可以隱藏實際的子進程窗口,並顯示第二個窗口,我只是簡單地將輸出寫入,因爲它被捕獲,但這似乎是更多的工作比必要的。有沒有辦法讓輸出顯示在控制檯窗口中,並在完成後仍然捕獲它進行處理?

回答

3

將標準重定向後,它不再指向控制檯。要寫入控制檯,您必須手動完成。

如果要在執行過程時顯示輸出,而不是在最後一個大轉儲中顯示,則可以使用Process類的「OutputDataReceived」事件。

+0

哇 - 我從來沒有見過OutputDataReceived。整齊! – 2009-04-24 17:05:19

+0

這似乎回答了我是否可以將輸出顯示在子進程擁有的控制檯窗口中,並同時將其重定向到父進程。 我的下一個問題是,是否有可能不重定向輸出,並且在進程退出時從控制檯捕獲所有內容? 或者,如果不是,手動創建控制檯窗口的最佳方式是什麼,以便在進程執行時使用OutputDataReceived'來將重定向的輸出寫入它? – mjl5007 2009-04-24 17:35:25

+1

看看http://msdn.microsoft.com/en-us/library/system.diagnostics.process.outputdatareceived.aspx。它有一個例子(你可能想關閉所有語言,但C#) – 2009-04-24 17:47:03

4

這是我用過的,而無需使用一個單獨的線程:


using(System.Diagnostics.Process proc = new System.Diagnostics.Process()) 
{ 
    proc.EnableRaisingEvents = false; 
    proc.StartInfo.RedirectStandardOutput = true; 
    proc.StartInfo.CreateNoWindow = true; 
    proc.StartInfo.UseShellExecute = false; 
    proc.StartInfo.Verb = "open"; 
    proc.StartInfo.FileName = "XXXX"; 
    proc.Start(); 
    String sLine = ""; 
    while ((sLine = proc.StandardOutput.ReadLine()) != null) 
    { 
     System.Console.WriteLine(sLine); 
    } 
    proc.WaitForExit(); //Jon Skeet was here! 
    errorCode = proc.ExitCode; 
    proc.Close(); 
} 
+0

我假設操作系統希望產卵過程繼續運行 - 我沒有注意到對WaitForExit的調用。我會使用WaitForExit而不是你的while循環 - 緊密循環不是一個好主意。 – 2009-04-24 17:10:39

+0

我想記住是否有一個原因,我沒有在那裏使用WaitForExit。 – crashmstr 2009-04-24 17:19:38

+0

看看我的SVN歷史,這是因爲我曾經把它當作「while(!proc.HasExited){/ *在這裏讀取東西* /}」,但是沒有得到所有的文本,當我移動它在閱讀循環之外,沒有想到將它改爲WaitForExit。 – crashmstr 2009-04-24 17:24:46

相關問題