3

在控制台模式下运行应用程序时,有几行写入控制台。

现在我想以编程方式执行此操作。这是我使用的一些示例代码: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 始终为空,我没有得到在打开的控制台窗口中可以看到的结果。

我怎样才能收到输出?有没有办法做到这一点?

更新

我也尝试proc.StandardOutput直接读取,但它不会产生任何数据。

4

3 回答 3

3

正如其他人所发现的那样,存在一个错误,该错误_sortOutput将为空。但不管怎样,你是完全正确的:e.Data可以而且将是空的!

实际上,当正在执行调用的 AsyncStreamReader 到达被重定向的标准输出的EOFe.Data时,您的处理程序应该始终以等于 null 的方式被调用- 这将在您正在运行的进程退出时发生。当然,除非您首先取消注册 OutputDataReceived 事件处理程序,或者取消异步输出重定向。

于 2015-10-20T23:24:38.157 回答
2

它是空的,因为你读取了数据var outPut

尝试以下操作:

a) 改变你处理它的方式

proc.OutputDataReceived += new DataReceivedEventHandler(HandleOutputData);

b) 注释掉该行

//var outPut = proc.StandardOutput.ReadToEnd();
于 2013-03-12T12:24:18.970 回答
2

Null 表示异步流的结束。您必须同时 WaitForExit 并等待终止的 null 通过 e.Data

于 2016-06-23T15:38:34.913 回答