已经运行的Windows进程'控制台输出命令提示符?直接StreamReader命令提示符

时间:2016-03-30 19:07:13

标签: c# windows process

我正在尝试确定是否有办法在命令提示符中通过C#获取Windows环境中已在运行的进程的控制台输出。我通过shell看到了an answer基于linux的系统,也是一种检索Process object的方法。虽然两者都没有提供解决方案来获得流程的输出。

我的代码我目前以这种方式找到一个进程(MongodDB守护进程)

Process[] procs = Process.GetProcessesByName("mongod");
if (procs.Length > 0)
{
    MongoProcess = procs[0];
    Console.Out.WriteLine("Found mongod.exe, process id: " + MongoProcess.Id);
}

我还发现Process.StandardOutput property提供了一个StreamReader,可以用来读取应用程序的标准输出流。"。 有没有办法将此StreamReader输入定向到命令提示符输出?

我也知道我可以启动一个进程并显示命令提示符(进程输出),但这只是在进程启动时#34;由我"。

Process.Start(new ProcessStartInfo("notepad.exe") { CreateNoWindow = false })

我也知道我可以简单地从StreamReader读取并以我自己的方式显示输出,但我更愿意只显示一个命令提示符。

1 个答案:

答案 0 :(得分:3)

Windows没有提供任何机制来追溯性地为另一个进程提供标准输出句柄(如果它是在没有处理的情况下创建的)。 (此外,在大多数情况下,应用程序仅在启动期间检查标准输出句柄。)

如果您知道(或可以成功猜测)特定应用程序如何生成输出,则原则上可以通过将您自己的代码注入流程来开始捕获该输出。例如,如果您知道应用程序使用C ++并且动态链接到VS2015运行时库,则可能会注入调用freopen as shown here的代码。 (在这种情况下,您必须知道应用程序使用哪个运行时库,因为您在查找freopen的地址时已指定它。)

但是,代码注入并非易事,并且存在无意中导致进程出现故障的风险。此外,任何已生成的输出几乎肯定会被丢弃并且不可挽回地丢失。