Windowsバッチスクリプトには、新しいプロセスを開始するstart
コマンドがあります。
開始したばかりのプロセスのPIDを取得することは可能ですか?
バッチではできますが、直接言うことはできません。 tasklist.exeの出力を解析するか、wmic.exeを使用する必要があります。どちらの場合も、最初に何を始めたのかを知る必要があります。
Tasklist.exeを使用:
for /F "TOKENS=1,2,*" %a in ('tasklist /FI "IMAGENAME eq powershell.exe"') do set MyPID=%b
echo %MyPID%
これをバッチスクリプトで使用するには、パーセント記号を2倍にします。
Wmic.exeの使用:
for /f "TOKENS=1" %a in ('wmic PROCESS where "Name='powershell.exe'" get ProcessID ^| findstr [0-9]') do set MyPID=%a
echo %MyPID%
同じ名前で既に実行されているプロセスがある場合は、ローカルプロセスを開始してから現在のPIDのリストを取得してからPIDを再度確認する必要があります。次に、3つのプロセスを開始し、最後にそれらを強制終了するサンプルコードを示します(具体的には、ローカルで開始されたコード)。
@echo off
set PROCESSNAME=notepad.exe
::First save current pids with the wanted process name
setlocal EnableExtensions EnableDelayedExpansion
set "RETPIDS="
set "OLDPIDS=p"
for /f "TOKENS=1" %%a in ('wmic PROCESS where "Name='%PROCESSNAME%'" get ProcessID ^| findstr [0-9]') do (set "OLDPIDS=!OLDPIDS!%%ap")
::Spawn new process(es)
start %PROCESSNAME%
start %PROCESSNAME%
start %PROCESSNAME%
::Check and find processes missing in the old pid list
for /f "TOKENS=1" %%a in ('wmic PROCESS where "Name='%PROCESSNAME%'" get ProcessID ^| findstr [0-9]') do (
if "!OLDPIDS:p%%ap=zz!"=="%OLDPIDS%" (set "RETPIDS=/PID %%a !RETPIDS!")
)
::Kill the new threads (but no other)
taskkill %RETPIDS% /T > NUL 2>&1
endlocal
これは古い記事ですが、現在Windowsで正常に機能する次の「使いやすい」ソリューションを共有する価値があると思います。
複数のプロセスを並行して開始:
start "<window title>" <command will be executed>
例:
start "service1" mvn clean spring-boot:run
start "service2" mvn clean spring-boot:run
プロセスのPIDを取得する(オプション):
tasklist /V /FI "WindowTitle eq service1*"
tasklist /V /FI "WindowTitle eq service2*"
プロセスを終了します:
taskkill /FI "WindowTitle eq service1*" /T /F
taskkill /FI "WindowTitle eq service2*" /T /F
あなたが試すことができます
wmic process call create "notepad"
作成されたプロセスのpidを返します。
ユーザーに感謝します-npocmaka。
Mozilla Firefoxを起動し、開始されたプロセスのPIDを取得する方法の例があります。
:: Example for cmd window
set AppCmdLine="C:\Program Files (x86)\Mozilla Firefox\firefox.exe -new-window http://www.google.com/"
set ProcessCmd=wmic process call create %AppCmdLine%
for /f "tokens=3 delims=; " %a in ('%ProcessCmd% ^| find "ProcessId"') do set PID=%a
echo %PID%
Batスクリプトの同じ例
set AppCmdLine="C:\Program Files (x86)\Mozilla Firefox\firefox.exe -new-window http://www.google.com/"
set ProcessCmd=wmic process call create %AppCmdLine%
for /f "tokens=3 delims=; " %%a in ('%ProcessCmd% ^| find "ProcessId"') do set PID=%%a
echo %PID%