Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/279.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ruby-on-rails-3/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实时获取命令行输出不适用于所有cli_C#_Process_7zip_Processstartinfo - Fatal编程技术网

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

C# 实时获取命令行输出不适用于所有cli,c#,process,7zip,processstartinfo,C#,Process,7zip,Processstartinfo,下面的代码适用于ping stackoverflow.com和大多数其他情况,但当我使用它时不是实时的,它会等待目录被压缩,然后显示输出。我用于压缩的参数是test.7z dirpath。我还能做点什么吗 private ProcessStartInfo GetProcessStartInfo(string filename, string arguments) { ProcessStartInfo ProcessStartInfo = new ProcessSt

下面的代码适用于
ping stackoverflow.com
和大多数其他情况,但当我使用它时不是实时的,它会等待目录被压缩,然后显示输出。我用于压缩的参数是
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");
    }
private ProcessStartInfo GetProcessStartInfo(字符串文件名、字符串参数)
{
ProcessStartInfo ProcessStartInfo=新的ProcessStartInfo();
ProcessStartInfo.CreateNoWindow=true;
ProcessStartInfo.UseShellExecute=false;
ProcessStartInfo.WindowsStyle=ProcessWindowsStyle.Hidden;
ProcessStartInfo.RedirectStandardOutput=true;
ProcessStartInfo.RedirectStandardError=true;
ProcessStartInfo.RedirectStandardInput=true;
ProcessStartInfo.FileName=文件名;
ProcessStartInfo.Arguments=参数;
}
私有void ProcessRun(字符串文件名、字符串参数)
{
流程=新流程();
Process.StartInfo=GetProcessStartInfo(文件名、参数);
Process.ErrorDataReceived+=Process_OutputDataReceived;
Process.OutputDataReceived+=进程\u OutputDataReceived;
Process.EnableRaisingEvents=true;
Process.Start();
Process.BeginOutputReadLine();
Process.BeginErrorReadLine();
Process.WaitForExit();
}
公共ObservableList输出=新ObservableList();
私有无效进程\u OutputDataReceived(对象发送方,DataReceivedEventArgs e)
{
输出。添加(如数据);
}
私有无效按钮\u单击(对象发送者,路由目标e)
{
OutputListBox.ItemsSource=输出;
ProcessRun(“cmd.exe”,“/c ping stackoverflow.com”);
}
7zip输出:

7zip进度:


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

所以这不是代码的问题。如果只想在命令提示符下看到相同的问题,请尝试运行以下命令:

7z.exe yourarguments > log.txt

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

那么7Z输出是什么?是否有可能在完成之前不换行?@MatthewWatson当目录非常小时,它不显示百分比,只显示上面的消息see edits,否则,它会显示同一行的进度百分比,然后再次显示与上述消息相同的进度百分比。这就是问题所在,然后-
OutputDataReceived
仅在向输出中写入换行符时才会引发。@MatthewWatson但我既没有得到第一行,也没有得到最后一行。是的,你说得对,我希望百分比或者至少在压缩时不显示空白页。。它应该至少显示前面的第一行progress@Almis是的,但是在压缩完成之前,这些行永远不会发送到标准输出中。除非您编写自己的控制台并将其注入7zip,否则您的应用程序无法访问它们。还有别的办法吗?Hacky-way?@Almis好吧,7zip是开源的-如果你能处理LGPL,最简单的方法可能是简单地改变7z打印状态的方式。也可以使用DLL钩子将所有控制台操作重定向到您,但不能在托管代码中重定向-您必须在非托管助手应用程序中执行;当然,它有点脆弱和危险。@Almis如果您不选择这个选项,并且您不介意显示一个实际的控制台,那么您可以使用P/Invoke调用
alloconsole
(然后将其清除),然后您运行的任何进程都将使用它。或者干脆让它用自己的控制台运行。