2012-11-27 38 views
0

我有一個應用程序正在做一些視頻處理。進程調用CLI exe不返回輸出

我需要在處理媒體之前分析它。

ffmpeg實用程序ffprobe.exe提供了我需要的所有信息。

但是我使用不會返回時,該命令在cmd窗口運行出現的文本代碼:

public static string RunConsoleCommand(string command, string args) 
{ 
    var consoleOut = ""; 

    using (var process = new Process()) 
    { 
     process.StartInfo = new ProcessStartInfo 
     { 
      FileName = command, 
      Arguments = args, 
      UseShellExecute = false, 
      CreateNoWindow = true, 
      RedirectStandardOutput = true 
     }; 

     process.Start(); 
     consoleOut = process.StandardOutput.ReadToEnd(); 
     process.WaitForExit(); 

     return consoleOut; 
    } 
} 

什麼想法?

回答

0

Process類有一些事件來處理:

public static string RunConsoleCommand(string command, string args) 
{ 
    var consoleOut = ""; 

    using (var process = new Process()) 
    { 
     process.StartInfo = new ProcessStartInfo 
     { 
      FileName = command, 
      Arguments = args, 
      UseShellExecute = false, 
      CreateNoWindow = true, 
      RedirectStandardOutput = true 
     }; 

     // Register for event and do whatever 
     process.OutputDataReceived += new DataReceivedEventHandler((snd, e) => { consoleOut += e.Data; }); 

     process.Start(); 
     process.WaitForExit(); 

     return consoleOut; 
    } 
} 

你也有ErrorDataReceived,它的工作方式相同。

我在一些項目中使用這些事件,它的作用就像一個魅力。希望有所幫助。

編輯:修復了代碼,您需要在啓動過程之前附加處理程序。

+0

Thanks @ T.Fabre您對ErrorDataReveived的評論是關鍵。 ffmpeg應用程序將其日誌輸出到此錯誤流。 –

+0

我在'RedirectStandardOutput = true'和'process.OutputDataReceived + = new DataReceivedEventHandler((snd,e)=> {consoleOut + = e.Data;});''之間存在衝突。我必須刪除第一個,我的程序正確地返回了我的輸出,爲什麼? – Apaachee

+0

不太確定。 [MSDN](http://msdn.microsoft.com/zh-cn/library/system.diagnostics.process.outputdatareceived.aspx)指出應該啓用RedirectStandardOutput以將輸出發送到您的事件處理程序。你應該用一個代碼示例來開啓一個新的問題,kindda很難像這樣說。 –