Чтобы установить переменную для вывода команды, используйте for /f:
for /f "tokens=*" %%a in ('command') do set _CmdResult=%%a
Проблема в том, что для использования канала в команде вам нужно экранировать его с помощью escape-символа командной строки: ^ , поэтому: ^| ,
for /f "tokens=*" %%a in ('sc \\192.168.1.1 query <ServiceName> ^| findstr STATUS') do set _CmdResult=%%a
Теперь я не уверен, какую версию Windows вы используете, но мои попытки выполнить запрос sc в Windows 7 дают следующий результат:
>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
Это означает, что потребуется findstr STATE , который выдает:
>sc query SamSs | findstr STATE
STATE : 4 RUNNING
Теперь, в примере выше, tokens=* означает, что каждый токен установлен в переменную %%a , где токены разделены пробелами. В этом случае вы можете использовать либо третий токен (4), либо четвертый токен (RUNNING). Кстати, с тестированием, 1 соответствует STOPPED для меня.
Чтобы упростить задачу, я буду использовать строку RUNNING в этом примере. Итак, мы хотим четвертый токен.
for /f "tokens=4" %%a in ('sc \\192.168.1.1 query <ServiceName> ^| findstr STATE') do set _CmdResult=%%a
Конечно, в зависимости от того, что выводит ваш sc query , ваш может немного отличаться, поэтому следуйте тому, как я туда попал, и вносите изменения по мере необходимости. Или опубликуйте в комментариях вывод вашего sc query и я внесу необходимые изменения.
Чтобы проверить значение, вы можете использовать:
if %_CmdResult%==STOPPED (
REM do something here
)
В вашем случае цикл будет выглядеть примерно так.
: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
Обратите внимание, что timeout - это утилита, включенная только в Windows Vista и более поздних версиях. Windows XP может использовать что-то вроде ping 1.1.1.1 -n 1 -w 5000 > nul .