В пакетном сценарии Windows есть команда start
, которая запускает новый процесс.
Возможно ли, чтобы PID процесса только начинался?
В пакетном сценарии Windows есть команда start
, которая запускает новый процесс.
Возможно ли, чтобы PID процесса только начинался?
Вы можете в пакетном режиме, но не напрямую. Вам нужно либо проанализировать вывод 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%
Если есть процессы, уже запущенные с тем же именем, сначала вам нужно получить список текущих 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
Это старый пост, но я думаю, что стоит поделиться следующим "простым в использовании" решением, которое отлично работает в настоящее время на 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
ты можешь попробовать с
wmic process call create "notepad"
который вернет pid созданного процесса.
Большое спасибо пользователю - 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%