Para establecer una variable en la salida de un comando, use for /f
:
for /f "tokens=*" %%a in ('command') do set _CmdResult=%%a
El problema es utilizar un tubo en el comando que necesita para escapar de ella con el carácter de escape de línea de comandos: ^
Por lo tanto: ^|
.
for /f "tokens=*" %%a in ('sc \\192.168.1.1 query <ServiceName> ^| findstr STATUS') do set _CmdResult=%%a
Ahora, no estoy seguro de qué versión de Windows está ejecutando, pero mis intentos de una sc
consulta en Windows 7 dan el siguiente resultado:
>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
Esto significa findstr STATE
que sería necesario, lo que da el resultado:
>sc query SamSs | findstr STATE
STATE : 4 RUNNING
Ahora, en el ejemplo anterior, tokens=*
significa que cada ficha se establece en la variable %%a
, donde las fichas están separadas por espacios. En este caso, puede usar el tercer token ( 4
) o el cuarto token ( RUNNING
). Por cierto, con las pruebas, 1
corresponde a STOPPED
mí.
Para facilitar las cosas, usaré la cadena RUNNING
en este ejemplo. Entonces queremos la cuarta ficha.
for /f "tokens=4" %%a in ('sc \\192.168.1.1 query <ServiceName> ^| findstr STATE') do set _CmdResult=%%a
Por supuesto, dependiendo de cuáles sean sus sc query
resultados, los suyos pueden ser ligeramente diferentes, así que siga cómo llegué allí y modifique según sea necesario. O publique en un comentario el resultado de su sc query
y lo modificaré según sea necesario.
Para verificar el valor, puede usar:
if %_CmdResult%==STOPPED (
REM do something here
)
En su caso, el ciclo sería algo como esto.
: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
Tenga en cuenta que timeout
es una utilidad que solo se incluye en Windows Vista y versiones posteriores. Windows XP puede usar algo como ping 1.1.1.1 -n 1 -w 5000 > nul
.