我有多个同名的进程(比如多个 FIREFOX.exe 进程)。然后批处理脚本打开另一个 firefox.exe 进程,并在预定的一段时间后终止它打开的进程。
我有以下解决方案
start "" "C:\Program Files (x86)\Mozilla Firefox\firefox.exe" -P "ABC" -no-remote
PING 127.0.0.1 -n 10 -w 1000 >NUL
for /F "TOKENS=1,2,*" %%a in ('tasklist /FI "IMAGENAME eq firefox.exe"') do set MyPID=%%b
taskkill /PID %MyPID% /T
一切正常,除了如果在第一个命令(即运行 Firefox)之后打开了另一个同名进程(firefox.exe),则 taskkill 命令实际上会终止最新的进程,而不是它启动的进程
那么我如何确保脚本只终止它启动的进程而不终止其他进程。
答案1
无论如何,我自己解决了这个问题。
实际上,上述解决方案本身需要稍作调整。就这样
start "" "C:\Program Files (x86)\Mozilla Firefox\firefox.exe" -P "ABC" -no-remote
for /F "TOKENS=1,2,*" %%a in ('tasklist /FI "IMAGENAME eq firefox.exe"') do set MyPID=%%b
PING 127.0.0.1 -n 10 -w 1000 >NUL
taskkill /PID %MyPID% /T
之前发生的事情是我在 PING 命令之后设置了 %MyPID%(这只是一个时间延迟)。因此,在此期间,任何打开的新进程(具有相同名称)都会将其 PID 注册为 taskkill。我只是简单地将命令移动到进程打开命令之后,现在它就可以正常工作了。
但从技术上来说,如果有太多相同的进程通过多个脚本打开(比如在几毫秒内),这仍然会导致问题,并且 taskill 可能会终止错误的进程(也许有人可以就此写一个答案。我现在不会接受我的答案...但会等待一两天):)