在控制台模式下运行应用程序时,有一些行写入控制台。
现在我想以编程的方式来做这件事。下面是我使用的一些示例代码:关于OutputDataReceived事件的MSDN
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,但它不产生任何数据。
发布于 2013-03-12 12:24:18
它是空的,因为您在var outPut中读取数据
尝试以下几个方面:
( a)改变你处理它的方式
proc.OutputDataReceived += new DataReceivedEventHandler(HandleOutputData);(B)注释掉这一行
//var outPut = proc.StandardOutput.ReadToEnd();发布于 2015-10-20 23:24:38
正如其他人所发现的那样,存在一个_sortOutput将为空的bug。但无论如何,您都是完全正确的:e.Data可以并且将是空的!
实际上,当正在执行调用的e.Data到达被重定向的标准输出的EOF时,您的处理程序应该总是以等于null的形式调用--这将在您运行的进程退出时发生。当然,除非首先取消OutputDataReceived事件处理程序的注册,或者取消异步输出重定向。
发布于 2016-06-23 15:38:34
Null表示异步流的结束。您必须同时使用WaitForExit并等待终止null通过e.Data
https://stackoverflow.com/questions/15360756
复制相似问题