【问题标题】:How to get the output of a running CMD process?如何获取正在运行的 CMD 进程的输出?
【发布时间】:2023-01-10 18:44:28
【问题描述】:

我必须使用的程序在处理一些数据后打开一个带有消息的 CMD 窗口。 该消息类似于“已完成处理”,我无权访问其他程序背后的代码。

我想要实现的目标是:

  1. 从 CMD 窗口获取消息并将其写入我自己程序中的文本框(或类似框)。
  2. 关闭 CMD 窗口

    我设法使用Process[] localByName = Process.GetProcessesByName("cmd"); 将该过程附加到我的程序,但我无法设法获得输出。

    谢谢您的帮助。

    编辑: 进一步详细说明问题的情况: 我使用命令行命令启动另一个程序。我传递了一些参数,过了一会儿,另一个程序打开了一个带有消息的 cmd 窗口。 如果我正常打开其他程序,则消息会显示在应用程序中。 没有一个参数给我操作输出的选项,我无法将输出传输到另一个文件。

    至于为什么我必须这样做:我的任务是为其他程序增加生活质量改进,使用命令行是访问其他程序功能的最简单方法。另一种可用的解决方案是对数据进行反向工程处理。

【问题讨论】:

  • 它使用一个分离cmd 窗口只是显示一条“完成”消息?真的吗?您能够/允许寻找替代品吗?听起来很可疑。
  • 您是否阅读了 Process Class 的 Microsoft 文档页面,它是 Windows 内核库函数 CreateProcess 的 C# 包装类,调用时没有或带有 STARTUPINFO 结构?
  • 为什么 64 位 %SystemRoot%\System32\cmd.exe 或 32 位 %SystemRoot%\SysWOW64\cmd.exe 从 C# 编码的 64 位或 32 位程序中执行,而不是运行真正的可执行文件? cmd.exe 还使用 CreateProcessSTARTUPINFO 结构来运行可执行文件。我不清楚为什么使用 CreateProcess 运行 cmd(没有完整路径和扩展名)和 Process 类,让 cmd.exe 在完全启动时运行另一个带有 CreateProcess 的可执行文件。对于提供的有关任务的信息,这对我来说毫无意义。
  • @Fildor 我在我的问题中添加了更多信息。我希望现在更清楚了
  • @Mofi 我在我的问题中添加了更多信息。我希望现在更清楚了

标签: c# cmd


【解决方案1】:

Process 类有一个 StreamReader 类型的 StandardOutput 属性,您可以使用它来读取进程的输出。使用你的例子:

Process[] localByName = Process.GetProcessesByName("cmd");
if (localByName.Length > 0)
{
    var cmdProcess = localByName[0];
    var reader = cmdProcess.StandardOutput;
    var output = reader.ReadToEnd();

    Console.WriteLine($"The output from the cmd process is: {output}");
}

完成消息处理后,您可以使用 Process 类的 CloseMainWindow() 方法关闭 cmd 窗口:

cmdProcess.CloseMainWindow();

这个答案假设你想捕获 cmd 的输出它已附加到您的流程中。

【讨论】:

  • 我不确定这是否会读取已写入的输出附加到过程中。
  • @Fildor 正确,这是我所做的假设。我会相应地修改我的答案。
猜你喜欢
  • 2017-09-02
  • 1970-01-01
  • 2013-05-09
  • 2014-09-03
  • 2015-04-25
  • 1970-01-01
  • 2020-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多