Чтобы установить переменную для вывода команды, используйте 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
.