StdOutput重定向仅部分成功

时间:2014-05-28 22:27:45

标签: c# windows console-application stdout named-pipes

我有一个控制台应用程序,我想要捕获它的输出。我部分成功了。大多数消息都被捕获。但有些人仍然在控制台窗口结束,并绕过我的捕获。

这是我用来读取输出的代码:

_hProcess = new Process();

_hProcess.StartInfo.FileName = _Filename;  // "bochsdbg.exe"
_hProcess.StartInfo.Arguments = Arguments;  // "-q"
_hProcess.StartInfo.WorkingDirectory = Path.GetDirectoryName(_Filename);

_hProcess.StartInfo.UseShellExecute = false;

_hProcess.StartInfo.RedirectStandardInput = true;
_hProcess.StartInfo.RedirectStandardOutput = true;

_hProcess.OutputDataReceived += (Sender, Data) => _Buffer += Data.Data + "\n";

_hProcess.Start();

_hProcess.BeginOutputReadLine();

_ProcessStdInput = _hProcess.StandardInput;

_Reporters.Call("Info", "Process " + _Filename + " is started");

我在Windows 8上,这不是一个打算投入生产的程序,而是我将要使用的工具。我在框架版本4.5上。

我尝试过的事情:

我尝试在批处理文件中打开控制台并重定向输入,如下所示:

  

cmd.exe bochsdbg.exe> output.txt的

这会捕获与我自己的应用程序相同的文本,这使我相信还有其他事情正在发生。有谁知道如何捕获其余的控制台输出?

如果这不是一个选项,是否有人知道微软公开用于打印到控制台显示内存的API?我找不到任何相关内容。

固定代码:

_hProcess = new Process();

_hProcess.StartInfo.FileName = _Filename;  // "bochs.exe"
_hProcess.StartInfo.Arguments = Arguments;  // "-q"
_hProcess.StartInfo.WorkingDirectory = Path.GetDirectoryName(_Filename);

_hProcess.StartInfo.UseShellExecute = false;

_hProcess.StartInfo.RedirectStandardError = true;
_hProcess.StartInfo.RedirectStandardInput = true;
_hProcess.StartInfo.RedirectStandardOutput = true;

_hProcess.OutputDataReceived += (Sender, Data) => _Buffer += Data.Data + "\n";
_hProcess.ErrorDataReceived += (Sender, Data) => _Buffer += Data.Data + "\n";

_hProcess.Start();

_hProcess.BeginOutputReadLine();
_hProcess.BeginErrorReadLine();

_ProcessStdInput = _hProcess.StandardInput;

_Reporters.Call("Info", "Process " + _Filename + " is started");

1 个答案:

答案 0 :(得分:1)

您看到的额外输出实际上可能是stderr,或者是.NET术语中的StandardError。如果将命令行更改为cmd.exe bochsdbg.exe > output.txt 2> error.txt,则会捕获两者。

同样,在.NET代码中,您可以使用RedirectStandardError属性。