我有一个控制台应用程序,我想要捕获它的输出。我部分成功了。大多数消息都被捕获。但有些人仍然在控制台窗口结束,并绕过我的捕获。
这是我用来读取输出的代码:
_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");
答案 0 :(得分:1)
您看到的额外输出实际上可能是stderr
,或者是.NET术语中的StandardError
。如果将命令行更改为cmd.exe bochsdbg.exe > output.txt 2> error.txt
,则会捕获两者。
同样,在.NET代码中,您可以使用RedirectStandardError属性。