2012-08-04 80 views
2

我正在使用exec()函数执行相同的外部程序,我想在某些情况下停止其中的一个。但是下面的命令:是否有可能在Windows XP中获取由exec()启动的进程的PID?

taskkill /IM program.exe 

会得到全部program.exe死亡。所以我认为最好的方式是通过其PID来杀死程序进程。

所以,我认为每次程序执行时都要获取PID,然后杀死它。

我在Windows XP上使用PHP 5.3。

+0

您可以使用'tasklist'命令在窗口下找到关于PID的信息。我无法提供演示,因为taskkill和tasklist在我的计算机上被破坏,我不知道如何解决它们。 – hakre 2012-08-04 09:53:33

+0

这个问题可能会有所帮助:http://stackoverflow.com/questions/9348572/execute-bat-file-without-waiting-for-end/9348938#9348938 – 2012-08-04 09:55:22

回答

1

Windows上的exec挂起,直到子进程结束。你需要一个孩子的PID,所以我想你想要一个孩子。

试试这个代码,它为我工作。它nohups的notepad.exe,并显示其PID

$command = 'notepad.exe'; 
$WshShell = new COM("WScript.Shell"); 
$oExec = $WshShell->exec("notepad.exe"); 
print_r ($oExec->ProcessID) 

留意$ WshShell-> EXEC而不是$ WshShell->运行一些一派ressources要求。

可以帮助其他人

0

PID应作为$output数组的第一个元素返回。

exec($command, $output); 
$pid = (int)$output[0]; 
+0

我运行你的代码并得到任何PID结果,它只是午餐cmd.exe和program.exe [我使用的外部程序] .... – qinHaiXiang 2012-08-04 10:09:25

+0

@qinHaiXiang如果启动'cmd.exe'并使用它启动'program.exe',那么当然你会得到PID从'cmd.exe',这是相当无用的。你为什么不直接启动'program.exe'? – Tomalak 2012-08-04 10:19:19

+0

我正在使用fastcopy [命令行模式]在background.My命令中复制文件:“'fastcopy.exe .....';”,exec()自动启动cmd.exe,然后fastcopy.exe ..... – qinHaiXiang 2012-08-04 11:49:09