2012-11-26 213 views
1

是我的代碼命令重定向問題

//Create process 
System.Diagnostics.Process pProcess = new System.Diagnostics.Process(); 

//strCommand is path and file name of command to run 
pProcess.StartInfo.FileName = "ffmpeg.exe"; 

//strCommandParameters are parameters to pass to program 
pProcess.StartInfo.Arguments = "-i " + videoName; 

pProcess.StartInfo.UseShellExecute = false; 

//Set output of program to be written to process output stream 
pProcess.StartInfo.RedirectStandardOutput = true; 

//Start the process 
pProcess.Start(); 

//Get program output 
string strOutput = pProcess.StandardOutput.ReadToEnd(); 

//Wait for process to finish 
pProcess.WaitForExit(); 

命令的作品,但strOutput字符串是空的,結果在控制檯中顯示。我在這裏錯過了什麼嗎?

回答

1

程序可能將其輸出寫入StandardError而不是StandardOutput。嘗試使用.RedirectStandardError = true,然後使用.pProcess.StandardError.ReadToEnd()來捕獲該輸出。

如果您需要捕獲標準錯誤和標準輸出(大致)適當交錯的可能性,您可能需要使用OutputDataReceivedErrorDataReceived以及使用BeginOutput/ErrorReadLine回調的異步版本。

+0

是實際解決。 我也可以做類似 string strOutput = pProcess.StandardOutput.ReadToEnd(); strOutput = pProcess.StandardError.ReadToEnd(); –

+0

你可以,但你會亂序得到消息(例如,所有的standardError將在standardOutput之後)。這可能適合您的目的,但如果您按照正確的順序一起使用它,則必須使用我的帖子中提到的異步。 – Joe

-2

嘗試捕獲Std錯誤,因爲在發生任何錯誤時都會使用它。

 //Set output of program to be written to process output stream 
     pProcess.StartInfo.RedirectStandardError = true; 
     pProcess.StartInfo.RedirectStandardOutput = true; 

     //Start the process 
     pProcess.Start(); 

     //Wait for process to finish 
     pProcess.WaitForExit(); 

     //Get program output 
     string strError = pProcess.StandardError.ReadToEnd(); 
     string strOutput = pProcess.StandardOutput.ReadToEnd(); 

我只是想知道你爲什麼讀取輸出後,等待出口WaitForExit,應該以相反的順序爲您的應用程序可能會拋售更多,直到最後完成OPS

+0

「我只是想知道爲什麼你在閱讀輸出後等待退出WaitForExit,它應該是相反的順序,因爲你的應用可能會傾倒更多,直到最終完成操作」 - 這明顯是錯誤的。這樣做可能會導致死鎖。每個MSDN:「該代碼示例通過在p.WaitForExit之前調用p.StandardOutput.ReadToEnd來避免死鎖情況。如果父進程在p.StandardOutput.ReadToEnd之前調用p.WaitForExit並且子進程將足夠的文本寫入填充重定向的流。「 – Joe

+0

鏈接:http://msdn.microsoft.com/en-us/library/system.diagnostics.processstartinfo.redirectstandardoutput.aspx – Joe

+0

明白了 - 謝謝指出 –