【问题标题】:How to capture a Processes STDOUT and STDERR line by line as they occur, during process operation. (C#)如何在流程操作期间逐行捕获流程 STDOUT 和 STDERR。 (C#)
【发布时间】:2011-05-05 22:55:03
【问题描述】:

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

我要处理进程的STDOUT和STDERR来显示进度信息。

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

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

谢谢

【问题讨论】:

标签: c# process stdout stderr


【解决方案1】:

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

例如,处理并打印进程同步写入标准输出的任何内容

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);
}

【讨论】:

  • 这不会捕获 STDERR。
  • @Albin:很明显,我没有写这个例子。
【解决方案2】:

这里有an MSDN example...这是一个简化版:

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();

【讨论】:

  • 始终调用waitForExit 并设置超时时间,以防止出现无限等待的机会。 waitForExit(10000) => 等待 10 秒。
【解决方案3】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-06-23
    • 1970-01-01
    • 2016-09-04
    • 2013-01-12
    • 1970-01-01
    • 2018-10-31
    相关资源
    最近更新 更多