在控制台模式下运行应用程序时,会有一些行写入控制台。
现在我想以编程方式执行此操作。以下是我使用的一些示例代码:MSDN on OutputDataReceived Event
private static StringBuilder _sortOutput = null;
var proc = new Process();
var info = new ProcessStartInfo();
info.FileName = @"C:\SomeApp.exe";
info.UseShellExecute = false;
info.WindowStyle = ProcessWindowStyle.Normal;
info.CreateNoWindow = false;
proc.StartInfo = info;
info.RedirectStandardOutput = true;
info.RedirectStandardError = true;
proc.OutputDataReceived += HandleOutputData;
proc.ErrorDataReceived += HandleOutputData;
proc.Start();
proc.BeginOutputReadLine();
proc.BeginErrorReadLine();
proc.WaitForExit();
var exitCode = proc.ExitCode;
var output = _sortOutput.ToString();
private void HandleOutputData(object sender, DataReceivedEventArgs e)
{
_sortOutput.Append(e.Data);
}
但DataReceivedEventArgs.Data始终为null,我没有收到我在打开的控制台窗口中看到的结果。
我如何收到输出?有没有办法实现这个目标?
更新
我还尝试直接阅读proc.StandardOutput
,但它不会产生任何数据。
答案 0 :(得分:2)
正如其他人发现的那样,有一个错误_sortOutput
将为空。但无论如何,你完全正确:e.Data
可以并且将为空!
实际上,当执行调用的AsyncStreamReader到达正在重定向的标准输出的 EOF 时,应始终调用e.Data
等于null的处理程序 - 这将发生当您运行的进程退出时。当然,除非您首先取消注册OutputDataReceived事件处理程序,否则取消异步输出重定向。
答案 1 :(得分:1)
它为空,因为您在var outPut
请尝试以下操作:
a)改变你的处理方式
proc.OutputDataReceived += new DataReceivedEventHandler(HandleOutputData);
b)注释掉
行//var outPut = proc.StandardOutput.ReadToEnd();
答案 2 :(得分:1)
Null表示异步流的结束。 您必须同时使用WaitForExit并等待终止null来通过e.Data