从 Process.Start 返回不同的引用
Posted
技术标签:
【中文标题】从 Process.Start 返回不同的引用【英文标题】:Different reference returned from Process.Start 【发布时间】:2011-05-31 08:15:18 【问题描述】:ProcessStartInfo psi = new ProcessStartInfo(BatchFile)
Process p = Process.Start(psi)
为什么p.ID
与 WindowsTaskManager 中可见的进程 ID 不同
(BatchFile
是带有适当参数的外部程序的路径)
【问题讨论】:
***.com/questions/2316596/… 你的意思是Process p = Process.Start(psi);
吗?
澄清一下,BatchFile 是一个实际的可执行文件还是“正常”意义上的批处理文件(即调用其他可执行文件的脚本,其中一个是您感兴趣的? )。如果是前者,那么应该如你所愿。但是,如果是后者,则进程 ID 将是执行脚本的进程的 ID,然后启动感兴趣的程序,该程序将具有不同的 ID。
【参考方案1】:
我认为这是因为p.ID
是运行批处理文件的进程的 ID,而不是由 批处理文件启动的进程的 ID。
您可以使用correct overload 直接通过Process.Start
启动可执行文件
【讨论】:
不,TaskManager中的ID完全不同,不适合TaskManager中的任何进程 @Saint_pl - 如果批处理文件只是启动另一个 exe,那么它的进程不会持续很长时间,因此您可能在任务管理器中看不到它。 如果我理解正确 - p.ID 是运行批处理文件的 ID(例如“start.bat”)?不是从这个 start.bat 内部运行的这个程序吗? @ChrisF - 但是如果我按照你的建议使用 msdn.microsoft.com/en-us/library/h6ak8zt5.aspx,我仍然会得到与 TaskManager 中不同的 p.ID @Marc Gravell - Process p = Process.Start(@"C:\Program Files\MyProgram.exe", @"abc -i jouFile.jou");【参考方案2】:我假设 BatchFile 是某种 cmd 或 bat 文件,它会一个接一个地运行其他进程。 因此,在 Windows 任务管理器中,您实际上会看到由批处理文件运行的那些进程的 ID。
例子
如果我这样做
var p = Process.Start("notepad.exe");
p.Id
将匹配任务管理器中的 PID
。
但是,如果我这样做:
var p = Process.Start("test.cmd"); // test.cmd has notepad.exe call inside
p.Id
将不同于任务管理器中显示的PID
。
【讨论】:
【参考方案3】:进程 ID 仅在进程处于活动状态时才有意义。首先要检查的是.HasExited
- 如果这是真的,忽略进程 ID;已经没有任何意义了。
您可以通过多种方式启动某项操作而无需留下任何进程即使您显然仍可以在屏幕上看到它:
如果它是一个脚本/bat/cmd,它会产生一些东西然后退出(记住:你正在观看脚本,而不是“某物”) 如果 exe 在内部执行了一些 inter-exe voodoo - 例如,大多数办公应用程序和 Internet Explorer 都会执行此操作;如果存在进程,则将args转发给那个进程处理,并立即退出【讨论】:
对 HasExited 的准确观察。但最后我怎样才能运行外部程序并捕获它的 id? @Saint_pl 如果您的启动器正在退出,那么您将不得不以艰难的方式找到它......或者:不要使用启动器(某些应用程序允许您添加开关以说“不要'不要那样做”,但这完全是特定于使用的) 解决方案是命令行和文件的特定名称 *.jou 以识别正在运行的进程以上是关于从 Process.Start 返回不同的引用的主要内容,如果未能解决你的问题,请参考以下文章
winform process.start() 调用外部EXE引用程序, 如何实现用户登录
Mono Process.Start 返回 ExitCode 255?