有没有办法获取我刚刚在后台启动的控制台程序的进程 ID?

Is there a way to get the process ID of a console program I've just started in the background?

假设我刚刚在后台启动了以下程序:

START /B CMD /C tomcat.exe
START /B CMD /C tomcat.exe
START /B CMD /C tomcat.exe

而且我想杀死第二个。因为它们具有相同的图像名称,所以我不能使用 taskkill 来使用 tomcat.exe 杀死它们,否则我会杀死比我想要的更多。

我想要的是获取每个进程启动时的进程 ID。

我的问题是:有没有办法获取我刚刚在后台启动的控制台程序的进程 ID?

你可以使用wmic来帮你获取ProcessId:

wmic process where "Name='tomcat.exe'" get processid, commandline

您必须获取每个新 tomcat 实例的 Pid 以存储在文件中(pid1.txt、pid2.txt、...),这样您就可以杀死您想要的那个.

您还可以看看:

这是一个实用程序 batch function,它可以让您生成一个进程并将其 PID 设置为一个变量。将其复制粘贴到脚本底部,在最后的 exit /bgoto :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%"