Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/335.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# 捕获怪异进程的实时标准输出(例如:7za.exe、PsExec.exe)_C#_Python_Stdout_7zip_Io Redirection - Fatal编程技术网

C# 捕获怪异进程的实时标准输出(例如:7za.exe、PsExec.exe)

C# 捕获怪异进程的实时标准输出(例如:7za.exe、PsExec.exe),c#,python,stdout,7zip,io-redirection,C#,Python,Stdout,7zip,Io Redirection,我已经设法用一些编程语言捕获了许多命令行工具的实时stdout(和stderr),但是有一些工具我无法使用。 这些工具包括: 7za.exe(7-Zip的一部分) PsExec.exe(系统内部的一部分) 下面的代码示例可以很好地打印大多数命令行工具(例如robocopy)的实时进度。 然而,“7za.exe b”将首先运行完整的基准测试,然后一次性打印所有标准输出(即不实时) 如果在cmd提示符下运行相同的命令,可以看到基准在基准测试期间打印到控制台 我尝试过刷新、同步、异步,为子流程创建

我已经设法用一些编程语言捕获了许多命令行工具的实时stdout(和stderr),但是有一些工具我无法使用。 这些工具包括:

  • 7za.exe(7-Zip的一部分)
  • PsExec.exe(系统内部的一部分)
下面的代码示例可以很好地打印大多数命令行工具(例如robocopy)的实时进度。 然而,“7za.exe b”将首先运行完整的基准测试,然后一次性打印所有标准输出(即不实时)

如果在cmd提示符下运行相同的命令,可以看到基准在基准测试期间打印到控制台

我尝试过刷新、同步、异步,为子流程创建无缓冲的输出流,其中大部分都是在C#和Python中实现的

似乎什么都不管用

namespace ConsoleApp
{
    class Program
    {
        static void Main()
        {
            var process = new System.Diagnostics.Process
            {
                StartInfo = new System.Diagnostics.ProcessStartInfo
                {
                    FileName = "7za.exe",
                    Arguments = "b",
                    UseShellExecute = false,
                    RedirectStandardOutput = true
                }
            };
            process.OutputDataReceived += (sender, args) => System.Console.WriteLine(args.Data);
            process.Start();
            process.BeginOutputReadLine();
            process.WaitForExit();
        }
    }
}
我快速浏览了一下7-Zip源代码,没有发现任何异常。 以下是7-Zip的大致功能:

CStdOutStream g_StdOut(stdout);
CStdOutStream &so = (g_StdStream ? *g_StdStream : g_StdOut);
CStdOutStream &so = g_StdOut;
FILE* _file = (FILE*)so;
fputs("blah", _file)
我还注意到了一些事情

在Cygwin中运行“7za.exe b”也不会打印任何进度,直到基准测试完成


ConEmu能够打印实时输出,但是调试代码和阅读文档并没有告诉我它是如何工作的。我认为它与“Windows控制台”(不是cmd.exe)和CSRSS有关。

对于一些
7za.exe
命令,您可以使用设置输出流。例如
-bsp1-bso1-bse1
。但是,这不适用于
b
(“基准”)命令。似乎相关:。我正在尝试从7za获取python子流程输出,它甚至无法使用
-bs
开关。你有没有找到获得输出的方法?