【问题标题】:Process.Start () with passed through StdoutProcess.Start() 通过 Stdout 传递
【发布时间】:2013-06-03 20:27:37
【问题描述】:

我想启动一个进程并读取标准输出,但还要让这个读取输出显示在生成进程的控制台窗口中。当前使用process.StartInfo.RedirectStandardOutput = true; 结合BeginOutputReadLine() 会导致输出不显示在控制台窗口中。这是不可取的。有谁知道如何做到这一点,或者是否有可能?

为 cmets 澄清。

我有一个响应进程输出的函数,我设置了该函数:

    ProcessHandle.OutputDataReceived += new DataReceivedEventHandler(ProcessHandle_OutputDataReceived);

    void ProcessHandle_OutputDataReceived(object sender, DataReceivedEventArgs e)
    {
         ... //React to output here.
    }

但是这样做时输出不会进入生成进程的控制台窗口,有没有办法手动将其反馈到该控制台,以便它显示为好像我的应用程序没有拦截它?

【问题讨论】:

  • 所以您希望它同时出现在标准窗口和应用程序的标准输出中?
  • 你不能同时拥有它,只是没有选择。
  • 在 Linux 中有一个名为 tee 的命令,您也许可以在 Windows 上找到类似的东西,但我不能 100% 确定这样的东西是否适用于 Windows。它可以让您将 stdout 复制到 stderr,并捕获 stdout 以在应用程序中显示,并允许 stderr 仍然输出到其他进程的控制台窗口。
  • 是的,Console.Write 或 Console.WriteLine 应该做你想做的事。
  • Err... 如果我使用 Console.Write 它将显示在我的应用程序控制台中,而不是在生成的应用程序控制台中。 tee 和我想要的很相似,我会从那里环顾四周。

标签: c# process stdout


【解决方案1】:
        var pi = new ProcessStartInfo
        {
            FileName = prog,
            Arguments = args,
            UseShellExecute = false,
            CreateNoWindow = true,
            RedirectStandardOutput = true,
            RedirectStandardError = false
        };

        var proc = new Process { StartInfo = pi };
        try
        {
            if (!proc.Start())
            {
                throw new ApplicationException("Starting proc failed!");
            }

            Console.WriteLine(proc.StandardOutput.ReadToEnd());
            proc.WaitForExit();
            if (proc.ExitCode != 0)
            {
                //throw new ApplicationException(String.Format("proc returned exit code {0}", proc.ExitCode));
            }
        }
        catch (Exception ex)
        {
            throw new ApplicationException("Unknown problem in proc", ex);
        }
        finally
        {
            if (!proc.HasExited)
                proc.Kill();
        }

【讨论】:

  • 如您所见,我使用 ReadToEnd 读取了 proc 的整个输出,然后将其写入控制台。这适用于我的目的,但我也做了一个循环,从 StandardOutput 读取一行,并将一行写入控制台,这也有效,但占用了更多 CPU,并且因为这会产生一个非常 CPU 密集型的任务,所以我选择以这种方式最小化它。输出实际上只是用于确定是否出现任何问题以及是否出现问题,因此我不需要实时更新。我还可以保证输出的大小相当静态,因此我不必担心内存限制。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-07
  • 1970-01-01
相关资源
最近更新 更多