【问题标题】:Process RedirectStandardOutput empty and DataReceivedEventArgs.Data is null处理 RedirectStandardOutput 为空且 DataReceivedEventArgs.Data 为空
【发布时间】:2013-03-12 12:06:23
【问题描述】:

在控制台模式下运行应用程序时,会向控制台写入几行代码。

现在我想以编程方式执行此操作。这是我使用的一些示例代码: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,但它没有产生任何数据。

【问题讨论】:

    标签: c# .net process redirectstandardoutput


    【解决方案1】:

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

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

    【讨论】:

      【解决方案2】:

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

      尝试以下操作:

      a) 改变你处理它的方式

      proc.OutputDataReceived += new DataReceivedEventHandler(HandleOutputData);
      

      b)注释掉该行

      //var outPut = proc.StandardOutput.ReadToEnd();
      

      【讨论】:

      • 对不起,这只是我尝试过的,因为它是空的。请看看我更新的问题。
      • @MareInfinitus 你确定它总是为空吗?尝试跳过空值 if (e.Data != null) {...
      • 是的,它始终为空。但是如果我不重定向输出,我可以在控制台窗口中看到字符串。让我想起了批处理脚本中的某些内容,您可以在其中重定向 1> 和 2>。我尝试设置一个新的 DataReceivedHandler,它也被调用,但仍然为 null
      • @MareInfinitus 尝试将问题和我从这里stackoverflow.com/questions/14094771/… 的答案结合起来。这行得通吗?
      • 看起来和我现在的完全一样。我正在调用的应用程序有什么特别之处吗?它可以输出到标准输出以外的任何东西,因此我无法捕捉到它吗?
      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 2010-10-26
        • 2017-07-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-20
        • 2010-11-27
        • 1970-01-01
        • 2014-01-10
        • 2012-01-27
        相关资源
        最近更新 更多