2011-05-31 76 views
1
返回
ProcessStartInfo psi = new ProcessStartInfo(BatchFile) 

Process p = Process.Start(psi) 

为什么p.ID比进程id不同可见WindowsTaskManager不同的参考距离的Process.Start

BatchFile是路径与适当的参数外部程序)

+0

http://stackoverflow.com/questions/2316596/system-diaganostics-process-id-isnt-the -same-process-id-shown-in-task-manger-wh – 2011-05-31 08:17:56

+0

你的意思是'Process p = Process.Start(psi);'? – 2011-05-31 08:20:05

+0

为了说明,BatchFile是一个真正的可执行文件,还是它是一个“正常”意义上的批处理文件(即调用其他可执行文件的脚本,其中一个是您感兴趣的文件?)。如果它是前者,那么它应该如你所期望的那样。但是,如果是后者,那么进程ID将是执行脚本的进程的ID,然后该脚本将启动感兴趣的程序,该程序将具有不同的ID。 – cristobalito 2011-05-31 08:22:09

回答

1

进程ID启动可执行文件是唯一有意义的,而这个过程是活的。首先要检查的是.HasExited - 如果是这样,忽略进程ID;它不再有任何意义。

有很多,你可以开始做,没有任何过程中遗留即使你能明显看到它仍然在屏幕上方式:

  • ,如果它是一个脚本/ BAT/CMD会派生的东西并退出(请记住:您正在看剧本,而不是“某些东西”)
  • 如果exe在内部执行某些inter-exe voodoo - 例如,大多数办公应用程序和Internet Explorer都这样做;如果有一个现有的流程,将其转发参数传递给进程来处理,并立即退出
+0

关于HasExited的精确观察。但最后我怎么能运行外部程序,并赶上它的ID? – Saint 2011-05-31 11:27:45

+0

@Saint_pl如果你的启动程序正在退出,那么你将不得不以困难的方式找到它......或者:不要使用启动程序(有些应用程序允许你添加开关来说“不要那么做”,但是这完全是特定用法) – 2011-05-31 11:33:22

+0

解决方案是CommandLine和文件名specific * .jou来识别正在运行的进程 – Saint 2011-07-15 15:47:25

2

我以为批处理文件是某种形式的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不同。

2

我会假设,这是因为p.ID是正在运行的批处理文件,而不是进程的ID通过批处理文件启动的进程的ID。

您可以直接通过Process.Start使用correct overload

+0

不,TaskManager中的ID完全不同,并且不适合任务管理器中的任何进程 – Saint 2011-05-31 08:24:24

+0

@Saint_pl - 如果批处理文件刚刚启动另一个exe,那么它的进程不会持续很长时间,因此您可能不会看到它是任务管理器。 – ChrisF 2011-05-31 08:25:50

+0

如果我理解正确 - p.ID是运行批处理文件的标识(例如“start.bat”)?不是从这个start.bat里面运行的这个程序吗? – Saint 2011-05-31 08:31:02