实时获取命令行输出不适用于所有cli

时间:2015-08-27 11:10:42

标签: c# process 7zip processstartinfo

以下代码适用于ping stackoverflow.com和大多数其他情况,但是当我使用7z.exe时,它不是实时的,它等待直到压缩目录然后显示输出。我用于压缩的参数是a test.7z dirpath。我可以做别的吗?

    private ProcessStartInfo GetProcessStartInfo(string filename, string arguments)
    {
        ProcessStartInfo ProcessStartInfo = new ProcessStartInfo();
        ProcessStartInfo.CreateNoWindow = true;
        ProcessStartInfo.UseShellExecute = false;
        ProcessStartInfo.WindowStyle = ProcessWindowStyle.Hidden;
        ProcessStartInfo.RedirectStandardOutput = true;
        ProcessStartInfo.RedirectStandardError = true;
        ProcessStartInfo.RedirectStandardInput = true;
        ProcessStartInfo.FileName = filename;
        ProcessStartInfo.Arguments = arguments;
    }

    private void ProcessRun(string filename, string arguments)
    {
        Process Process = new Process();
        Process.StartInfo = GetProcessStartInfo(filename, arguments);
        Process.ErrorDataReceived += Process_OutputDataReceived;
        Process.OutputDataReceived += Process_OutputDataReceived;
        Process.EnableRaisingEvents = true;
        Process.Start();
        Process.BeginOutputReadLine();
        Process.BeginErrorReadLine();

        Process.WaitForExit();
    }

    public ObservableList<string> Output = new ObservableList<string>();

    private void Process_OutputDataReceived(object sender, DataReceivedEventArgs e)
    {
        Output.Add(e.Data);
    }

    private void Button_Click(object sender, RoutedEventArgs e)
    {
        OutputListBox.ItemsSource = Output;
        ProcessRun("cmd.exe", "/c ping stackoverflow.com");
    }

7zip输出:

enter image description here

7zip进度:

enter image description here

1 个答案:

答案 0 :(得分:1)

如果你对百分比感兴趣,那你就不幸了 - 这不是通过标准输出完成的。标准输出仅处理数据流,而百分比输出实际上是通过直接操作控制台来完成的。它不是输出流的一部分 - 使用标准I / O流无法复制相同的效果。

所以这不是你的代码的问题。如果您只想使用命令提示符查看相同的问题,请尝试运行此命令:

7z.exe yourarguments > log.txt

>是输出重定向 - 而不是写入控制台,标准输出被重定向到文件。与ping一起使用时,它会立即打印出标准输出。当您使用7zip时,您获得与C#应用程序相同的结果。