Подтвердить что ты не робот

Как получить PID процесса, только что начатого из пакетного файла?

В пакетном сценарии Windows есть команда start, которая запускает новый процесс.

Возможно ли, чтобы PID процесса только начинался?

4b9b3361

Ответ 1

Вы можете в пакетном режиме, но не напрямую. Вам нужно либо проанализировать вывод tasklist.exe, либо использовать wmic.exe. Оба требуют от вас знать, что вы только что начали, что вы, конечно, будете.

Использование tasklist.exe:

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

Чтобы использовать это в пакете script, удвойте процентные знаки.

Использование 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%

Ответ 2

Если есть процессы, уже запущенные с тем же именем, сначала вам нужно получить список текущих pids, чем запустить локальный процесс (ы), а затем снова проверить pids. Вот пример кода, который запускает 3 процесса и убивает их в конце (в частности, они запускаются локально):

@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

Ответ 3

Это старый пост, но я думаю, что стоит поделиться следующим "простым в использовании" решением, которое отлично работает в настоящее время на Windows.

Запустите несколько процессов параллельно:

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

Пример:

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

Получите PID процессов (необязательно):

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

Убить процессы:

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

Ответ 4

ты можешь попробовать с

wmic process call create "notepad"

который вернет pid созданного процесса.

Ответ 5

Большое спасибо пользователю - npocmaka.

Есть примеры того, как запустить Mozilla Firefox и получить PID запущенного процесса.

:: 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%

Тот же пример для сценария летучей мыши

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%