C# 捕获怪异进程的实时标准输出(例如:7za.exe、PsExec.exe)
我已经设法用一些编程语言捕获了许多命令行工具的实时stdout(和stderr),但是有一些工具我无法使用。 这些工具包括: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提示符下运行相同的命令,可以看到基准在基准测试期间打印到控制台 我尝试过刷新、同步、异步,为子流程创建
- 7za.exe(7-Zip的一部分)
- PsExec.exe(系统内部的一部分)
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
开关。你有没有找到获得输出的方法?