Сложной вещью с tasklist
является ее формат вывода по умолчанию.Например, когда выполняется командная строка:
tasklist /FI "ImageName eq cmd.exe" /FI "Status eq Running"
, мы получаем:
Image Name PID Session Name Session# Mem Usage
========================= ======== ================ =========== ============
cmd.exe 12740 Console 1 3'328 K
cmd.exe 11020 Console 1 3'304 K
Если ширина столбцов не фиксирована, на которую я бы не рассчитывализвлечение PID не так тривиально, потому что имя изображения может содержать ПРОБЕЛЫ , поэтому использование таких разделителей не будет работать.
Возможный способ - подсчитать число =
-символы во второй строке до первой SPACE , поэтому мы знаем количество символов, которые нужно обрезать, чтобы удалить имя изображения, но для этого требуется какой-то цикл (использующий goto
), поэтомупроизводительность может быть довольно плохой.
Однако есть и другие выходные форматы, доступные для tasklist
.Командная строка:
tasklist /FI "ImageName eq cmd.exe" /FI "Status eq Running" /FO CSV
приводит к таким выводам:
"Image Name","PID","Session Name","Session#","Mem Usage"
"cmd.exe","12740","Console","1","3'328 K"
"cmd.exe","11020","Console","1","3'304 K"
Теперь довольно просто извлечь PID:
@echo off
for /F "delims=" %%R in ('
tasklist /FI "ImageName eq cmd.exe" /FI "Status eq Running" /FO CSV /NH
') do (
set "FLAG1=" & set "FLAG2="
for %%C in (%%R) do (
if defined FLAG1 (
if not defined FLAG2 (
echo %%~C
)
set "FLAG2=#"
)
set "FLAG1=#"
)
)
Другие выходные форматы используются следующей командной строкой:
tasklist /FI "ImageName eq cmd.exe" /FI "Status eq Running" /FO LIST
, что приводит к таким выводам:
Image Name: cmd.exe
PID: 12740
Session Name: Console
Session#: 1
Mem Usage: 3'328 K
Image Name: cmd.exe
PID: 11020
Session Name: Console
Session#: 1
Mem Usage: 3'304 K
При этом получить еще прощежелаемый вывод:
@echo off
for /F "tokens=2" %%K in ('
tasklist /FI "ImageName eq cmd.exe" /FI "Status eq Running" /FO LIST ^| findstr /B "PID:"
') do (
echo %%K
)
Кстати, для параметров фильтра /FI
доступны следующие операторы:
eq
- равно; ne
- не равно; gt
- больше чем; lt
- меньше чем; ge
- больше или равно; le
- меньше или равно;
Документация Microsoft и сообщение справки (tasklist /?
) делаютНе объяснить их значение, но я нашел следующие внешние ресурсы: