Dans les scripts batch de Windows, il existe une commande start
qui démarre un nouveau processus.
Est-il possible d'obtenir le PID du processus qui vient de commencer?
Vous pouvez le faire par lots mais pas directement par mot. Vous devez analyser la sortie de tasklist.exe ou utiliser wmic.exe. Les deux nécessitent que vous sachiez ce que vous venez de commencer, ce que vous allez bien sûr faire.
Utilisation de tasklist.exe:
for /F "TOKENS=1,2,*" %a in ('tasklist /FI "IMAGENAME eq powershell.exe"') do set MyPID=%b
echo %MyPID%
Pour l'utiliser dans un script batch, doublez les signes de pourcentage.
Utilisation de 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%
Si des processus sont déjà en cours d'exécution avec le même nom, vous devez d'abord obtenir une liste des pids actuels, puis démarrer votre ou vos processus locaux, puis vérifier à nouveau les pids. Voici un exemple de code qui démarre 3 processus et les tue à la fin (en particulier ceux démarrés localement):
@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
Il s'agit d'un ancien article, mais je pense qu'il vaut la peine de partager la solution suivante "facile à utiliser" qui fonctionne bien de nos jours sous Windows.
Démarrer plusieurs processus en parallèle:
start "<window title>" <command will be executed>
Exemple:
start "service1" mvn clean spring-boot:run
start "service2" mvn clean spring-boot:run
Obtenir le PID des processus (facultatif):
tasklist /V /FI "WindowTitle eq service1*"
tasklist /V /FI "WindowTitle eq service2*"
Tuez les processus:
taskkill /FI "WindowTitle eq service1*" /T /F
taskkill /FI "WindowTitle eq service2*" /T /F
vous pouvez essayer avec
wmic process call create "notepad"
qui renverra le pid du processus créé.
Merci beaucoup à l'utilisateur - npocmaka.
Il existe des exemples sur la façon de démarrer Mozilla Firefox et d'obtenir le PID du processus démarré.
:: 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%
Le même exemple pour le script 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%