web-dev-qa-db-fra.com

Comment obtenir le PID du processus démarré à partir d'un fichier batch?

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?

26

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

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
14
Oliver Zendel

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
13
zappee

vous pouvez essayer avec

wmic process call create "notepad"

qui renverra le pid du processus créé.

0
npocmaka

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%

0
German Geraskin