0

我正在为命令行程序 rtmp-plugin 制作 gui。我需要从 cmd 程序读取输出数据到三个变量的方法:下载、时间和完成。在 cmd 输出中是示例“3000 kb / 12 sec (12%)”,没有“”。如何在没有 kb 的情况下获得 3000 个下载变量,在没有 sec 的情况下获得 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 回答