Я ищу что-то вроде chp.exe, он может запустить команду и возвращает свой pid. Я не могу использовать CHP.EXE, потому что в некоторых антивирусах он отображается как зараженный файл.
Спасибо
Wmic process where (Name like '%CHP%') get caption, name, commandline, ProcessId | more
реальный образец:
Wmic process where (Name like '%ie%') get caption, name, commandline, ProcessId | more
Выход:
Wmic process get ProcessId
извлеките только processId в переменную из результатов запроса:
ProcID.cmd:
@ECHO OFF
FOR /F %%T IN ('Wmic process where^(Name^="explorer.exe"^)get ProcessId^|more +1') DO (
SET /A ProcessId=%%T) &GOTO SkipLine
:SkipLine
echo ProcessId = %ProcessId%
Выход:
ProcessId = 2372
Это довольно просто сделать в PowerShell. Start-Process notepad.exe -PassThru
запустит Блокнот и вернет:
Handles NPM(K) PM(K) WS(K) VM(M) CPU(s) Id ProcessName
------- ------ ----- ----- ----- ------ -- -----------
45 6 1672 4240 61 0.02 9212 notepad
Оттуда вы можете использовать его как объект, сохраняя вывод ($notepad = Start-process notepad.exe -PassThru
и затем $notepad.ID
) и закончите все сценарии, которые вы делали с ним.
Возвращение его к пакетному сценарию (если это абсолютно необходимо) немного сложнее. Если вы абсолютно застряли в использовании пакетного файла, возможно, было бы проще всего написать сценарий PowerShell, который записывает соответствующую информацию в файл или раздел реестра, вызвать сценарий PowerShell из пакетного файла, а затем прочитать файл или рег. ключ позже в пакетном скрипте.
Если вы вообще не хотите трогать PowerShell, вам придется прибегнуть к WMIC или списку задач, чтобы найти процесс после его создания.
Вы можете запустить программу и затем выполнить эту команду, заменив firefox
именем процесса, которое вы хотите:
for /f "tokens=2" %a in ('tasklist /nh /fi "imagename eq firefox.exe"') do echo %a
это будет выводить pid исключительно, в моем случае, вывод 5540
Другой способ :: Вы можете создать командный файл и поместить следующий код в командный файл. Его первая команда netstat запускает, чтобы получить processId для порта 9797. И затем установите его в переменную.
@ECHO OFF
FOR /F "tokens=5" %%T IN ('netstat -a -n -o ^| findstr "9797" ') DO (
SET /A ProcessId=%%T) &GOTO SkipLine
:SkipLine
echo ProcessId = %ProcessId%
PAUSE