2011-08-08 9 views
2

コマンドラインアプリケーションを使用してビデオをエンコードします。完全コマンドラインからの応答を再解析する

%:34%

をこれはメディアエンコードのように更新されたアプリが言う行を返します。プロセスクラスを使用して標準出力をチェックし、メイン実行スクリプトに渡す方法はありますか?私はプロセスを開始し、標準出力をstringbuilderに書き込むクラスを持っていますが、それをチェックし続ける方法を知りたいのです。これは、あなたがProcess.OutputDataRecievedイベントの発火を開始することProcess.BeginOutputReadLineを使用することができます...

public static Dictionary<string, string> StartProcess(string exePathArg, string argumentsArg, int timeToWaitForProcessToExit) 
    { 
     //the dictionary with the 
     Dictionary<string, string> retDirects = new Dictionary<string, string>(); 

     using (Process p = new Process()) 
     { 
      p.StartInfo.FileName = exePathArg; 
      p.StartInfo.RedirectStandardOutput = true; 
      p.StartInfo.RedirectStandardError = true; 
      p.StartInfo.Arguments = argumentsArg; 
      p.StartInfo.UseShellExecute = false; 
      p.StartInfo.CreateNoWindow = true; 

      try 
      { 

       p.Start(); 

       p.WaitForExit(timeToWaitForProcessToExit); 

       int exitCode; 
       try 
       { 
        exitCode = p.ExitCode; 

        StreamReader standardOutput = p.StandardOutput; 
        StreamReader standardError = p.StandardError; 

        retDirects.Add("StandardOutput", standardOutput.ReadToEnd()); 
        retDirects.Add("StandardError", standardError.ReadToEnd()); 
       } 
       catch { } 


      } 
      catch { } 
      finally 
      { 
       try 
       { 
        p.Kill(); 
        p.CloseMainWindow(); 
       } 
       catch { } 
      } 
     } 

     return retDirects; 
    } 
+0

新しいデータが到着すると "CalledBack"になるStartInfoの一部としてデリゲートを渡すことができます。 – Jodrell

答えて

0

海流コードです。 UseShellExecuteは、コード例のように、falseで、Redirect<StreamOfChoice>Outputである必要があります。

MSDNの例がありますが、ここでは取り消しません。私はいくつかのプログラムが予期しない目的のために異なるストリームを使用していることに気づいたので、異なるストリームのイベントに対して同じハンドラを使用するのが適切かもしれません。

0

"ReadToEnd"を使用する代わりに、ループで数バイト(時には1バイト)の "読み取り"を使用します。読み込みは、指定したバイト数が読み取られるまでブロックされます。正しいバイト数を見つけると、標準出力から文字列を読み取ることができるはずです。