已在命令提示符中获取 运行 windows 进程的控制台输出?将 StreamReader 定向到命令提示符
Get already running windows process' console output in a command prompt? Direct StreamReader to command prompt
我正在尝试确定是否有办法通过 C# 在命令提示符下获取 windows 环境中已经 运行 进程的控制台输出。我看过 for linux based systems through the shell and also a way to retrieve a 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);
}
我还找到了供应 "A StreamReader that can be used to read the standard output stream of the application." 的 Process.StandardOutput
property。 有没有办法将此 StreamReader
输入定向到命令提示符输出?
我也知道我可以启动一个进程并显示命令提示符(进程输出),但这只是在进程启动时"by me"。
Process.Start(new ProcessStartInfo("notepad.exe") { CreateNoWindow = false })
我也知道我可以简单地从 StreamReader
读取并以我自己的方式显示输出,但我真的更愿意只显示命令提示符。
Windows 不提供任何机制来追溯给另一个进程一个标准输出句柄,如果它是在没有标准输出句柄的情况下创建的。 (此外,在大多数情况下,应用程序只会在启动期间检查标准输出句柄。)
如果您知道(或能够成功猜出)特定应用程序如何生成输出,原则上 可以通过将您自己的代码注入进程来开始捕获该输出.例如,如果您知道该应用程序使用 C++ 并动态链接到 VS2015 运行时库,您可能会注入调用 freopen
as shown here 的代码。 (在这种情况下,您必须知道应用程序使用哪个运行时库,因为您在查找 freopen
的地址时已经指定了它。)
但是,代码注入并非微不足道,并且会产生无意中导致进程故障的风险。此外,任何 已经 生成的输出几乎肯定会被丢弃并且不可撤销地丢失。
我正在尝试确定是否有办法通过 C# 在命令提示符下获取 windows 环境中已经 运行 进程的控制台输出。我看过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);
}
我还找到了供应 "A StreamReader that can be used to read the standard output stream of the application." 的 Process.StandardOutput
property。 有没有办法将此 StreamReader
输入定向到命令提示符输出?
我也知道我可以启动一个进程并显示命令提示符(进程输出),但这只是在进程启动时"by me"。
Process.Start(new ProcessStartInfo("notepad.exe") { CreateNoWindow = false })
我也知道我可以简单地从 StreamReader
读取并以我自己的方式显示输出,但我真的更愿意只显示命令提示符。
Windows 不提供任何机制来追溯给另一个进程一个标准输出句柄,如果它是在没有标准输出句柄的情况下创建的。 (此外,在大多数情况下,应用程序只会在启动期间检查标准输出句柄。)
如果您知道(或能够成功猜出)特定应用程序如何生成输出,原则上 可以通过将您自己的代码注入进程来开始捕获该输出.例如,如果您知道该应用程序使用 C++ 并动态链接到 VS2015 运行时库,您可能会注入调用 freopen
as shown here 的代码。 (在这种情况下,您必须知道应用程序使用哪个运行时库,因为您在查找 freopen
的地址时已经指定了它。)
但是,代码注入并非微不足道,并且会产生无意中导致进程故障的风险。此外,任何 已经 生成的输出几乎肯定会被丢弃并且不可撤销地丢失。