我设法用几种编程语言捕获了许多命令行工具的live stdout(和stderr),但是有一些工具我无法工作。 工具是:
下面的代码示例打印了大多数命令行工具(例如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。