捕获奇怪进程的实时标准(例如:7za.exe,PsExec.exe)

时间:2018-03-12 11:43:25

标签: c# python stdout 7zip io-redirection

我设法用几种编程语言捕获了许多命令行工具的live stdout(和stderr),但是有一些工具我无法工作。 工具是:

  • 7za.exe(7-Zip的一部分)
  • PsExec.exe(Sysinternals的一部分)

下面的代码示例打印了大多数命令行工具(例如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)

我注意到了更多的事情......

运行" 7za.exe b"在基准测试完成之前,Cygwin也没有打印出任何进展。

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

0 个答案:

没有答案