如何在进程操作期间逐行捕获进程STDOUT和STDERR.(C#)

dav*_*ave 17 c# stdout process stderr

我将执行一个进程(lame.exe)将WAV文件编码为MP3.

我想处理进程的STDOUT和STDERR以显示进度信息.

我需要使用线程吗?我无法理解它.

一些简单的示例代码将不胜感激.

谢谢

Jef*_*ado 8

如果通过Process类运行,您可以重定向流,以便您可以处理它们.您可以同步或异步读取stdout或stderr.要启用重定向,请为要重定向true的流(例如,RedirectStandardOutput)设置相应的重定向属性,并将其设置UseShellExecutefalse.然后你就可以开始这个过程并从流中读取.您还可以输入重定向标准输入的输入.

例如,处理并打印进程同步写入stdout的任何内容

var proc = new Process()
{
    StartInfo = new ProcessStartInfo(@"SomeProcess.exe")
    {
        RedirectStandardOutput = true,
        UseShellExecute = false,
    }
};
if (!proc.Start())
{
    // handle error
}
var stdout = proc.StandardOutput;
string line;
while ((line = stdout.ReadLine()) != null)
{
    // process and print
    Process(line);
    Console.WriteLine(line);
}
Run Code Online (Sandbox Code Playgroud)

  • 这不会捕获STDERR. (12认同)
  • @Albin:很明显,我没有编写示例来这样做。 (2认同)

Alb*_*nbo 5

您应该能够通过该Process.OutputDataReceived事件收听STDOUT .MSDN页面上有一个示例.Process.ErrorDataReceivedSTDERR 还有一个活动.


小智 5

这里有一个MSDN示例 ...这是一个简化的版本:

var StdOut = "";
var StdErr = "";

var stdout = new StringBuilder();
var stderr = new StringBuilder();

var psi = new ProcessStartInfo();
psi.FileName = @"something.exe";
psi.CreateNoWindow = true;
psi.UseShellExecute = false;
psi.RedirectStandardOutput = true;
psi.RedirectStandardError = true;

var proc = new Process();
proc.StartInfo = psi;
proc.OutputDataReceived += (sender, e) => { stdout.AppendLine(e.Data); };
proc.ErrorDataReceived += (sender, e) => { stderr.AppendLine(e.Data); };
proc.Start();
proc.BeginOutputReadLine();
proc.BeginErrorReadLine();
proc.WaitForExit(10000); // per sachin-joseph's comment

StdOut = stdout.ToString();
StdErr = stderr.ToString();
Run Code Online (Sandbox Code Playgroud)