我正在尝试确定是否有办法在命令提示符中通过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
读取并以我自己的方式显示输出,但我更愿意只显示一个命令提示符。
答案 0 :(得分:3)
Windows没有提供任何机制来追溯性地为另一个进程提供标准输出句柄(如果它是在没有处理的情况下创建的)。 (此外,在大多数情况下,应用程序仅在启动期间检查标准输出句柄。)
如果您知道(或可以成功猜测)特定应用程序如何生成输出,则原则上可以通过将您自己的代码注入流程来开始捕获该输出。例如,如果您知道应用程序使用C ++并且动态链接到VS2015运行时库,则可能会注入调用freopen
as shown here的代码。 (在这种情况下,您必须知道应用程序使用哪个运行时库,因为您在查找freopen
的地址时已指定它。)
但是,代码注入并非易事,并且存在无意中导致进程出现故障的风险。此外,任何已生成已的输出几乎肯定会被丢弃并且不可挽回地丢失。