Я пытаюсь преобразовать вывод WMIC в переменную, чтобы иметь возможность обрабатывать его дальше.
Я создал тестовый пакетный файл, чтобы проиллюстрировать проблему:
wmic PROCESS where "commandline like '%%teststr%%'" get Processid,Caption,Commandline
for /F "usebackq" %%R in (`wmic PROCESS where "commandline like '%%teststr%%'" get Processid,Caption,Commandline`) do echo OUTPUT is %%R
Вызвав эту партию, я получаю ожидаемый вывод для первой строки, но invalid GET expression
для второй.
Поскольку первая строка работает, я думаю, что что-то не так с моим цитированием - может кто-нибудь пролить свет на это? Я трижды проверил синтаксически, и все кажется мне правильным, согласно этому другому вопросу:Вывод Wmic в переменную
Edit1: %teststr% — это просто строка для фильтрации, например, это может быть javaw для поиска определенных экземпляров Java.
Редактирование 2: Точный вывод:
Caption CommandLine ProcessId
javaw.exe "C:\Program Files (x86)\Java\jre1.8.0_91\bin\javaw.exe" -jar "J:\tools\sonst\jEdit\jedit.jar" -reuseview -background -nogui 5152
javaw.exe "C:\Program Files (x86)\Java\jre1.8.0_91\bin\javaw.exe" -jar "J:\tools\sonst\jEdit\jedit.jar" -reuseview -background -nogui 11504
javaw.exe "c:\Program Files (x86)\Java\jdk1.7.0_80\bin\javaw.exe" -jar "j:\tools\online\JBinUp\JBinUp.jar" 16336
WMIC.exe wmic PROCESS where "commandline like '%javaw%'" get Processid,Caption,Commandline 18740
Invalid GET Expression.
ВВ
решение1
Я получаю invalid GET expression
за вторую команду.
for /F "usebackq" %%R in (`wmic PROCESS where "commandline like '%%teststr%%'" get Processid,Caption,Commandline`) do echo OUTPUT is %%R
Вам необходимо экранировать ,
(запятые) в for
выражении, используя ^
символ Escape:
for /F "usebackq" %%R in (`wmic PROCESS where "commandline like '%%teststr%%'" get Processid^,Caption^,Commandline`) do echo OUTPUT is %%R
Примечания:
- Вы также можете добавить
skip=1
командуfor
, чтобы пропустить заголовок. - В конце вывода вы получите дополнительную пустую строку
wmic
. - Используйте
findstr
для удаления пустых строк изwmic
выходных данных следующим образом:
for /F "usebackq" %%R in (`wmic PROCESS where "commandline like '%%teststr%%'" get Processid^,Caption^,Commandline ^| findstr /r /v "^$"`) do echo OUTPUT is %%R
Тестовый пакетный файл:
@echo off
setlocal EnableDelayedExpansion
wmic process where "Commandline like '%%note%%'" get Processid,Caption,Commandline
for /f "usebackq" %%r in (`wmic process where "commandline like '%%note%%'" get Processid^,Caption^,Commandline ^| findstr /r /v "^$"`) do echo OUTPUT is %%r
endlocal
Пример вывода:
F:\test>test
Caption CommandLine ProcessId
GSNotes.exe "E:\GoldenSectionNotes\GSNotes.exe" 8864
LiberKeyPortabilizer.exe "E:\LiberKey\LiberKeyTools\LiberKeyPortabilizer\LiberKeyPortabilizer.exe" /app="E:\LiberKey\Apps\Notepad++\Notepad++LKL.dat" /lkpend 12324
notepad++.exe "E:\LiberKey\Apps\Notepad++\App\Notepad++\notepad++.exe" 11948
WMIC.exe wmic process where "Commandline like '%note%'" get Processid,Caption,Commandline 1364
OUTPUT is Caption
OUTPUT is GSNotes.exe
OUTPUT is LiberKeyPortabilizer.exe
OUTPUT is notepad++.exe
OUTPUT is cmd.exe
OUTPUT is WMIC.exe
Дальнейшее чтение
- Индекс AZ командной строки Windows CMD- Отличный справочник по всем вопросам, связанным с командной строкой Windows.
- findstr- Поиск строк в файлах.
- для /ф- Циклическая команда по результатам другой команды.
- синтаксис- Экранированные символы, разделители и кавычки.