Para definir uma variável para a saída de um comando, use for /f
:
for /f "tokens=*" %%a in ('command') do set _CmdResult=%%a
O problema é que, para usar um pipe no comando, você precisa escapar com o caractere de escape da linha de comando: ^
, portanto: ^|
.
for /f "tokens=*" %%a in ('sc \192.168.1.1 query <ServiceName> ^| findstr STATUS') do set _CmdResult=%%a
Agora, não sei qual versão do Windows você está executando, mas minhas tentativas em uma consulta sc
no Windows 7 fornecem a seguinte saída:
>sc query SamSs
SERVICE_NAME: SamSs
TYPE : 20 WIN32_SHARE_PROCESS
STATE : 4 RUNNING
(NOT_STOPPABLE, NOT_PAUSABLE, IGNORES_SHUTDOWN)
WIN32_EXIT_CODE : 0 (0x0)
SERVICE_EXIT_CODE : 0 (0x0)
CHECKPOINT : 0x0
WAIT_HINT : 0x0
Isso significa que findstr STATE
seria necessário, o que dá a saída:
>sc query SamSs | findstr STATE
STATE : 4 RUNNING
Agora, no exemplo acima, tokens=*
significa que cada token é definido para a variável %%a
, em que os tokens são separados por espaços. Nesse caso, você pode usar o terceiro token ( 4
) ou o quarto token ( RUNNING
). By the way, com o teste, 1
corresponde a STOPPED
para mim.
Para facilitar as coisas, usarei a string RUNNING
neste exemplo. Então, queremos o quarto token.
for /f "tokens=4" %%a in ('sc \192.168.1.1 query <ServiceName> ^| findstr STATE') do set _CmdResult=%%a
É claro que, dependendo do seu sc query
, o seu pode ser um pouco diferente, então siga como eu cheguei lá e modifique conforme necessário. Ou poste em um comentário a saída do seu sc query
e modificarei conforme necessário.
Para verificar o valor, você pode usar:
if %_CmdResult%==STOPPED (
REM do something here
)
No seu caso, o loop seria algo assim.
:loop
for /f "tokens=*" %%a in ('sc \192.168.1.1 query <ServiceName> ^| findstr STATUS') do set _CmdResult=%%a
if %_CmdResult%==STOPPED (
sc \192.168.1.1 start <ServiceName>
goto endloop
)
timeout /t 5
goto loop
:endloop
Observe que timeout
é um utilitário incluído apenas no Windows Vista e posterior. O Windows XP pode usar algo como ping 1.1.1.1 -n 1 -w 5000 > nul
.