windows - Hvordan får man PID af proces lige startet fra en batchfil?

Indlæg af Hanne Mølgaard Plasc

Problem



I Windows-batch scripting er der start kommando, der starter en ny proces.


Er det muligt at få PID af processen lige startet?

Bedste reference


Du kan i batch men ikke direkte pr. Siger. Du skal enten analysere output fra tasklist.exe eller bruge wmic.exe. Begge kræver, at du ved, hvad du lige har startet, hvilket selvfølgelig du vil.


Brug af tasklist.exe:


for /F "TOKENS=1,2,*" \%a in ('tasklist /FI "IMAGENAME eq powershell.exe"') do set MyPID=\%b
echo \%MyPID\%


Hvis du vil bruge dette i et batch script, fordobles procentdelen af ​​tegnene.


Brug af 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\%

Andre referencer 1


Hvis der findes processer, der allerede kører med samme navn, skal du først få en liste over de aktuelle pids, end start din lokale proces (er), og tjek derefter pids igen. Her er en prøvekode, der starter 3 proces og dræber dem i slutningen (specielt de startede lokalt):


@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

Andre referencer 2


Dette er et gammelt indlæg, men jeg synes, at det er værd at dele den følgende 'let at bruge' løsning, der fungerer fint i dag på Windows.


Start flere processer parallelt:


start "<window title>" <command will be executed>


Eksempel:


start "service1" mvn clean spring-boot:run
start "service2" mvn clean spring-boot:run


Hent procesens PID (valgfrit):


tasklist /V /FI "WindowTitle eq service1*"
tasklist /V /FI "WindowTitle eq service2*"


Dræb processerne:


taskkill /FI "WindowTitle eq service1*" /T /F
taskkill /FI "WindowTitle eq service2*" /T /F