![WMIC em loop for](https://rvso.com/image/1493930/WMIC%20em%20loop%20for.png)
Estou tentando obter a saída WMIC em uma variável para poder processá-la ainda mais.
Criei um arquivo em lote de teste para ilustrar o problema:
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
Depois de chamar esse lote, obtenho a saída esperada para a primeira linha, mas invalid GET expression
para a segunda.
Como a primeira linha funciona, acho que há algo errado com minha citação - alguém poderia esclarecer isso? Verifiquei três vezes sintaticamente e tudo me parece correto de acordo com esta outra pergunta:Saída Wmic em variável
Edit1: %teststr% é apenas uma string para filtrar, poderia ser javaw, por exemplo, para procurar certas instâncias java.
Edit2: A saída exata é:
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.
BB
Responder1
Eu recebo invalid GET expression
para o segundo comando.
for /F "usebackq" %%R in (`wmic PROCESS where "commandline like '%%teststr%%'" get Processid,Caption,Commandline`) do echo OUTPUT is %%R
Você precisa escapar das ,
(vírgulas) na for
expressão, usando o ^
caractere Escape:
for /F "usebackq" %%R in (`wmic PROCESS where "commandline like '%%teststr%%'" get Processid^,Caption^,Commandline`) do echo OUTPUT is %%R
Notas:
- Você também pode querer adicionar
skip=1
aofor
comando para pular o cabeçalho. - Você receberá uma linha extra em branco no final da
wmic
saída. - Use
findstr
para retirar as linhas em branco dawmic
saída, como segue:
for /F "usebackq" %%R in (`wmic PROCESS where "commandline like '%%teststr%%'" get Processid^,Caption^,Commandline ^| findstr /r /v "^$"`) do echo OUTPUT is %%R
Arquivo em lote de teste:
@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
Exemplo de saída:
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
Leitura adicional
- Um índice AZ da linha de comando do Windows CMD- Uma excelente referência para todas as coisas relacionadas à linha cmd do Windows.
- encontrarstr- Procure strings em arquivos.
- para /f- Comando de loop em relação aos resultados de outro comando.
- sintaxe- Caracteres de escape, delimitadores e citações.