Comment obtenir PID de processus vient de commencer à partir d'un fichier batch?

dans Windows batch scripting il y a start commande qui démarre un nouveau processus.

est-il possible d'obtenir un PID du processus qui vient de commencer?

22
demandé sur Mofi 2012-02-28 21:39:57

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%
17
répondu Andy Arismendi 2012-02-28 21:02:41

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
12
répondu Oliver Zendel 2014-06-17 13:59:41

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
2
répondu zappee 2018-08-28 05:59:14