假设我刚刚在后台启动了以下程序:
START /B CMD /C tomcat.exe
START /B CMD /C tomcat.exe
START /B CMD /C tomcat.exe
我想要杀死第二个。因为它们具有相同的图像名称,所以我无法使用taskkill
使用tomcat.exe
来杀死它们,或者我会比我想要的更多地杀死它们。
我想要的是在他们开始时获取每个进程ID。
我的问题是:有没有办法获取我刚刚在后台启动的控制台程序的进程ID?
答案 0 :(得分:4)
这是一个实用程序batch function,它可以让您生成一个进程并将其PID设置为一个变量。在最后的exit /b
或goto :EOF
之后,将其复制到脚本的底部,以便只能由call
执行。它看起来很复杂(事实上可以说它可能比目前的情况要复杂得多),但如果您需要将其回收用于未来的项目,它应该处理反斜杠和引用的参数。
:spawn command args
:: sets %PID% on completion
setlocal
set "PID="
set "return="
set "args=%*"
set "args=%args:\=\\%"
for /f "tokens=2 delims==;" %%I in (
'wmic process call create "%args:"=\"%" ^| find "ProcessId"'
) do set "return=%%I"
endlocal & set "PID=%return: =%"
goto :EOF
如果你从控制台wmic process call create "ping localhost"
,你会看到它是如何工作的。与start /b
不同,使用wmic process call create
运行新的异步进程将在进程启动时输出进程的PID。
像这样调用上面的函数:
call :spawn tomcat.exe
set "instance1=%PID%"
call :spawn tomcat.exe
set "instance2=%PID%"
call :spawn tomcat.exe
set "instance3=%PID%"
:: kill the 2nd one:
taskkill /PID "%instance2%"
答案 1 :(得分:0)
您可以使用wmic
来帮助您获取ProcessId:
wmic process where "Name='tomcat.exe'" get processid, commandline
你必须让每个新的tomcat实例的Pid存储在一个文件中(pid1.txt,pid2.txt,...),这样你就可以杀掉你想要的那个。