Как получить PID процесса, только что запущенного из пакетного файла? - PullRequest
25 голосов
/ 28 февраля 2012

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

Можно ли получить PID только что начавшегося процесса?

Ответы [ 5 ]

17 голосов
/ 29 февраля 2012

Вы можете в партии, но не прямо, скажем. Вам нужно либо проанализировать вывод файла 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%

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

Использование 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%
12 голосов
/ 17 июня 2014

Если есть процессы, уже запущенные с тем же именем, вам сначала нужно получить список текущих 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
11 голосов
/ 13 июля 2018

Это старый пост, но я думаю, что стоит поделиться следующим «простым в использовании» решением, которое прекрасно работает в настоящее время в 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
0 голосов
/ 17 апреля 2019

Большое спасибо пользователю - 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%

0 голосов
/ 19 марта 2019

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

wmic process call create "notepad"

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...