Comment obtenir PID de processus vient de commencer à partir d'un fichier batch?
3 réponses
vous pouvez en fournée mais pas directement par say. Vous devez analyser la sortie de tasklist.exe ou utilisez wmic.EXE. Dans les deux cas, vous devez savoir ce que vous venez de commencer et ce que vous allez faire.
en utilisant 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 doubler les signes de pourcentage.
en utilisant 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%
S'il y a des processus déjà en cours d'exécution avec le même nom, vous devez d'abord obtenir une liste des pids courants, puis démarrer votre(s) processus local (s) et ensuite vérifier les pids à nouveau. Voici un exemple de code qui commence 3 processus et les tue à la fin (spécialement ceux démarré 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
C'est un vieux post mais je pense qu'il vaut la peine de partager la solution suivante 'facile à utiliser' qui fonctionne bien de nos jours sur Windows.
Départ de 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 du processus (facultatif):
tasklist /V /FI "WindowTitle eq service1*"
tasklist /V /FI "WindowTitle eq service2*"
Tuer le processus:
taskkill /FI "WindowTitle eq service1*" /T /F
taskkill /FI "WindowTitle eq service2*" /T /F