有没有一种方法可以像通过shell启动进程一样获得进程输出?基本上,我需要启动一些外部流程(A&B)。当我通过cmd或UseShellExecute = true启动它们时,输出将连续打印。 进程A逐行打印其进度。进程B显示并更新基于文本的进度栏。
对于进程A,如果通过外壳启动进程,则在正常打印的每条输出行之后均不会触发OutputDataReceived。它大约每20行触发一次(触发20次,所以我有全部输出,但我无法实时捕获输出)。我想它在stdOut刷新后会触发,但是如何用cmd来打印部分输出,我该怎么做呢?
对于流程B,仅在流程完成后才触发OutputDataReceived。
我的代码:
public static bool ExecuteProcess(string Path, string CommandLine, Action<string> OutputLineDelegate)
{
using (Process ChildProcess = new Process())
{
ChildProcess.StartInfo.FileName = Path;
ChildProcess.StartInfo.Arguments = CommandLine;
ChildProcess.StartInfo.UseShellExecute = false;
ChildProcess.StartInfo.CreateNoWindow = true;
ChildProcess.StartInfo.RedirectStandardOutput = true;
ChildProcess.OutputDataReceived += delegate (object sender, DataReceivedEventArgs e)
{
OutputLineDelegate(e.Data);
};
ChildProcess.Start();
ChildProcess.WaitForExit();
var ExitCode = ChildProcess.ExitCode;
OutputLineDelegate(string.Format("Exit code {0}", ExitCode));
return ExitCode == 0 ? true : false;
}
}
我尝试按char读取stdOut char,但是StreamReader.Read()和StreamReader.Peek()都等到输出中有任何内容为止。