WMIC em loop for

1

Estou tentando obter a saída da WMIC em uma variável para poder processá-la ainda mais.

Eu fiz um arquivo de 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

Tendo chamado esse lote, recebo a saída esperada para a primeira linha, mas invalid GET expression para a segunda.

Desde que a primeira linha funciona, acho que há algo errado com a minha citação - alguém poderia por favor lançar uma luz sobre isso? Eu verifiquei-o sintaticamente e tudo parece correto para mim de acordo com essa outra pergunta: Wmic output into variable

Editar1:% teststr% é apenas uma string para filtrar, pode ser javaw, por exemplo, para procurar determinadas instâncias de java.

Edit2: 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

    
por beerbear 19.05.2016 / 18:30

1 resposta

2

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 do , (vírgulas) na expressão for , 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 adicionar skip=1 ao comando for para pular o cabeçalho.
  • Você receberá uma linha extra em branco no final da saída wmic .
  • Use findstr para remover as linhas em branco de wmic output, da seguinte maneira:
for /F "usebackq" %%R in ('wmic PROCESS where "commandline like '%%teststr%%'" get Processid^,Caption^,Commandline ^| findstr /r /v "^$"') do echo OUTPUT is %%R

Teste de arquivo em lote:

@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

por 19.05.2016 / 19:50