2012-08-04 84 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