0

コマンドラインプログラムであるrtmp-pluginへのGUIを作成しています。出力データを cmd プログラムから 3 つの変数 (downloaded、time、done) に読み取る方法が必要です。cmd の出力は、"" なしの例 "3000 kb / 12 秒 (12%)" です。kbなしでダウンロードされた変数に3000、秒なしで時間に12、()と%なしで完了に12を取得する方法。以下のcmdプロセスを実行する私のコード。

    int downloaded, time, done;
    var proc = new Process
        {
            StartInfo = new ProcessStartInfo
            {
                FileName = "Data/yle-dl/yle-dl.exe",
                Arguments = "-o pasila.flv http://areena.yle.fi/tv/1755554 --rtmpdump rtmpdump.exe ",
                UseShellExecute = false,
                RedirectStandardOutput = true,
                CreateNoWindow = false
            }
        };

        proc.Start();
4

2 に答える 2

2

プログラムの出力をキャッチし、正規表現を使用して値を解析できます。通常の出力はエラーとして処理されるため、エラー出力も頻繁に発生するため、キャッチする必要があることに注意してください。

 Process process = new Process();
 process.StartInfo.FileName = "Data/yle-dl/yle-dl.exe";
 process.StartInfo.Arguments = "-o pasila.flv http://areena.yle.fi/tv/1755554 --rtmpdump rtmpdump.exe ";
 process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
 process.StartInfo.CreateNoWindow = true;
 process.StartInfo.RedirectStandardOutput = true;
 process.StartInfo.RedirectStandardError = true;
 process.StartInfo.UseShellExecute = false;
 process.OutputDataReceived += new DataReceivedEventHandler(ReadOutput);
 process.ErrorDataReceived += new DataReceivedEventHandler(ReadOutput);

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

 process.WaitForExit();


  private static void ReadOutput(object sender, DataReceivedEventArgs e)
  {
     if (e.Data != null)
     {
       Match m = Regex.Match(e.Data, "(\\d+)[^0-9]*(\\d+)[^0-9]*(\\d+)[^0-9]");
       if (m.Success)
       {
        textBox1.Text = m.Result("$1");
        string time = m.Result("$2");
        string percent = m.Result("$3");
       }
     }
  }
于 2013-01-19T12:33:52.630 に答える
0

コマンドラインから何らかの出力がすでにある場合は、BeginOutputReadLineを使用してそれをキャッチできます。

それ以外の場合は、アセンブリをプログラム参照に追加し、プログラムが状態を示すために使用する(存在する場合)変数にアクセスできます。

于 2013-01-19T12:21:42.327 に答える