捕捉怪异过程的实时标准(例如:7za.exe文件, PsExec.exe文件)

2024-10-08 20:15:42 发布

您现在位置:Python中文网/ 问答频道 /正文

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

  • 七za.exe文件(7-Zip的一部分)
  • 你知道吗PsExec.exe文件(系统内部的一部分)

下面的代码示例可以很好地打印大多数命令行工具(例如robocy)的进度。 "7za.exe文件但是,它将首先运行完整的基准测试,然后一次性打印所有标准输出(即not live)。你知道吗

如果在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)

我还注意到一些事情。。。你知道吗

运行“7za.exe文件在Cygwin中,在基准测试完成之前,也不会打印任何进度。你知道吗

ConEmu能够打印实时输出,但是调试代码和阅读文档并没有告诉我它是如何工作的。我认为它与“Windows控制台”有关(而不是命令提示符)和CSRSS。你知道吗


Tags: 文件工具代码命令行newsostdout基准

热门问题