【问题标题】:Reading output of console app读取控制台应用程序的输出
【发布时间】:2018-07-05 19:58:34
【问题描述】:

我正在尝试捕获从 .net 应用程序启动的外部程序(它是一个控制台应用程序)的输出。就这样开始了。

var process = new Process();
process.StartInfo = new ProcessStartInfo
{
    FileName = "c:\app.exe,
    Arguments = "-x 0 -server http://foo.com",
    RedirectStandardOutput = true,
    RedirectStandardInput = true,
    RedirectStandardError = true,
    UseShellExecute = false
};
process.Start();
process.OutputDataReceived += Process_OutputDataReceived;
process.ErrorDataReceived += Process_ErrorDataReceived;
process.BeginOutputReadLine();
process.WaitForExit();

此控制台应用程序一直在运行,直到手动停止并不断向控制台窗口写入内容。我想做的是从控制台捕获输出,如果有一行,可以说“错误”,我会重新启动该过程。

上面的代码不起作用。 Process_OutputDataReceived 仅在我关闭 app.exe 控制台窗口时调用。 我想我可以将输出写入某个文件并分析该文件,但我不太喜欢那样,因为我需要每秒打开/读取该文件。

有没有办法在 app.exe 写入控制台时捕获其输出?

编辑:

将输出写入文件是一种选择,但文件可能会变得非常非常大,直到我收到一条带有“ERROR”的行,只有在那时我才会重新启动进程并删除文件。在此之前每秒打开/读取几个 100MB 以上的文件并不是我想要这样做的方式。

【问题讨论】:

  • 为什么不在 texxtfile 上写输出?
  • 我猜这是选项,但前提是没有其他方法可以读取输出。另外,这个文件可以变得非常大,非常快。删除文件需要停止进程,我不想这样做,直到我在输出中得到“错误”。但正如我所说,在我收到错误消息之前,文件可能会变得非常大。
  • 写入标准输出是处理输出的一种完全有效的方式。您确定您正在运行的应用程序正在写入标准输出,而不是在最后一次全部写入,并且它是通过写入标准输出流而不是操作控制台窗口来执行此操作的?
  • 正在运行的控制台应用程序是一些外部应用程序,是的,它逐行写入控制台窗口,而不是最后,因为它可以运行数天/数周并在发生时显示输出。例如,假设 ping.exe 有 100 万次重复

标签: c# .net


【解决方案1】:

在您的 Process_OutputDataReceived 方法实现中,在如下数据中查找“ERROR”:

 private static void Process_OutputDataReceived(object sender, DataReceivedEventArgs e)
        {
            if (e.Data == "ERROR")
            {
                //Restart your App
            }
        }

【讨论】:

  • 就像我说的:只有在我关闭 app.exe 控制台窗口时才会调用 Process_OutputDataReceived。
  • 这可能是因为 app.exe 在关闭之前不会写入控制台。在您尝试关闭控制台之前,它是否向控制台写入任何内容?可能你需要发布你的 app.exe 代码来了解它在做什么
  • 它正在写入输出。以及它的第 3 方应用,没有源代码
  • 您是否看到数据是否以某种方式进入“Process_ErrorDataReceived”方法?
猜你喜欢
  • 1970-01-01
  • 2023-04-03
  • 1970-01-01
  • 2023-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多