1

私は、いくつかのビデオファイルに対していくつかの後処理を行うためにいくつかのコマンドラインアプリケーションを呼び出すアプリケーションに取り組んでいます。

現在、 Comskipを使用して、ケーブルカードチューナーからのビデオ録画のコマーシャルの中断を特定しようとしています。これは問題なく動作しますが、必要な画面出力を取得するのに問題があります。

String stdout = null;

using (var process = new Process())
{
    var start = new ProcessStartInfo(comskip, cmdLine);

    start.WindowStyle = ProcessWindowStyle.Normal;
    start.CreateNoWindow = true;
    start.UseShellExecute = false;
    start.RedirectStandardOutput = true;

    process.StartInfo = start;

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

    stdout = process.StandardOutput.ReadToEnd();
}

stdoutアプリケーションが手動で起動されたときと同じように画面に表示されるもの(下のスクリーンショット)を取得することを期待しています。これは、アプリケーションが実行していることの継続的なフィードであり、出力に%進捗を示す行が混在しています。 、プログレスバーを更新するために使用したい

コマンドラインからの出力

しかし、上記のコードを実行すると、次のことがわかります。

使用したコマンドラインは次のとおりです。"C:\ Users \ Chris \ Google Drive \ Tools \ ComSkip \ comskip.exe" "C:\ Users \ Chris \ Desktop \ ComSkip Tuning Files \ Modern Family.wtv" "--ini = C: \ Users \ Chris \ Desktop \ ComSkip Tuning Files \ comskip_ModernFamily.ini "

コマンドラインに従って、iniファイルをC:\ Users \ Chris \ Desktop \ ComSkip Tuning Files \ comskip_ModernFamily.iniに設定します。開始値にC:\ Users \ Chris \ Desktop \ ComSkip Tuning Files\comskip_ModernFamily.iniを使用します。

StandardErrorまた、ストリームをリダイレクトして取得しようとしましprocess.StandardError.ReadToEnd();たが、これらのオプションを使用して実行すると、プロセスがハングしているように見えます。

期待しているものをキャプチャするための何かが不足していますか、それともこのアプリケーションの出力ストリームがアクセスできない別の場所に移動している可能性がありますか?

4

2 に答える 2

2

のドキュメントを参照してくださいRedirectStandardOutput。出力を読み取る前に子プロセスが終了するのを待つと、ハングする可能性があります。

特に、例はあなたがしたことをしないように言っています:

 Process p = new Process();
 // Redirect the output stream of the child process.
 p.StartInfo.UseShellExecute = false;
 p.StartInfo.RedirectStandardOutput = true;
 p.StartInfo.FileName = "Write500Lines.exe";
 p.Start();
 // Do not wait for the child process to exit before
 // reading to the end of its redirected stream.
 // p.WaitForExit();
 // Read the output stream first and then wait.
 string output = p.StandardOutput.ReadToEnd();
 p.WaitForExit();

イベントOutputDataReceivedを使用し、場合によってErrorDataReceivedはハンドラーの進行状況バーを更新する必要があります。

于 2012-12-30T21:25:04.510 に答える
2

以下を設定する必要があります。

     process.StartInfo.RedirectStandardOutput = true;
     process.StartInfo.RedirectStandardError = true;
     process.StartInfo.UseShellExecute = false;
     process.OutputDataReceived += new DataReceivedEventHandler(ReadOutput);
     process.ErrorDataReceived += new DataReceivedEventHandler(ErrorOutput);

     process.Start();
     process.BeginOutputReadLine();
     process.BeginErrorReadLine();
     process.WaitForExit();

出力をキャッチしReadOutputErrorOutput

  private static void ErrorOutput(object sender, DataReceivedEventArgs e)
  {
     if (e.Data != null)
     {
        stdout = "Error: " + e.Data;
     }
  }

  private static void ReadOutput(object sender, DataReceivedEventArgs e)
  {
     if (e.Data != null)
     {
        stdout = e.Data;
     }
  }
于 2012-12-30T21:27:00.560 に答える