从命令行重新解析响应

时间:2011-08-08 11:08:08

标签: c# process console-application

使用命令行应用程序对视频进行编码。该应用返回一行说明:

%完成:34%

这是在媒体编码时更新的。有没有办法使用流程类来继续检查标准输出并将其传递回主执行脚本?我有一个类启动进程,然后将标准输出写入stringbuilder但我想知道如何继续检查它。这是代码......

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;
    }

2 个答案:

答案 0 :(得分:0)

您可以使用Process.BeginOutputReadLine启动Process.OutputDataRecieved事件的触发。 UseShellExecute必须为falseRedirect<StreamOfChoice>Output必须为true,如示例代码中所示。

MSDN上有一个例子,我不会在这里反刍。我注意到有些程序使用不同的流来实现我认为的意外目的,因此对来自不同流的事件使用相同的处理程序可能是合适的。

答案 1 :(得分:0)

不使用“ReadToEnd”,而是在循环中使用几个字节(甚至一个字节)的“Read”。读取将阻塞,直到它读取您指定的字节数。找到正确的字节数,您应该能够从标准输出中读取字符串。