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 scconsulta 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 STATEque 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, 1corresponde a STOPPEDmí.
Para facilitar las cosas, usaré la cadena RUNNINGen 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 queryresultados, 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 queryy 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 timeoutes 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 .