web-dev-qa-db-ja.com

バッチファイル内から開始したばかりのプロセスのPIDを取得する方法は?

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%
17
Andy Arismendi

同じ名前で既に実行されているプロセスがある場合は、ローカルプロセスを開始してから現在の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
14
Oliver Zendel

これは古い記事ですが、現在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
13
zappee

あなたが試すことができます

wmic process call create "notepad"

作成されたプロセスのpidを返します。

0
npocmaka

ユーザーに感謝します-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%

0
German Geraskin