6

Я хочу остановить и запустить службу Windows с удаленного ПК с помощью командной строки Windows в командном файле.

sc \\192.168.1.1 stop <ServiceName>

rem sc \\192.168.1.1 query <ServiceName> | findstr STATUS | SET VAR=

Однако я хочу подождать, пока статус службы не будет остановлен или запущен. Так что я планировал непрерывно проверять и проверять состояние до тех пор, пока оно не будет остановлено.

Я думаю, что повторный запрос к серверу может потребовать много ресурсов процессора, но для командной строки не нужно ждать, за исключением некоторых попыток проверки времени. Но мой главный вопрос - как мне получить статус службы Windows, чтобы я мог проверить с помощью оператора IF, если все в порядке, чтобы перейти к следующей команде?

4 ответа4

8

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

1

Более сложный пример с более высоким уровнем сложности

(но также и более высокое удобство использования)

  • используя несколько распространенных приложений (cURL , GREP , SED), вы можете либо загрузить предварительно подготовленные версии Win32, либо использовать exe-файлы cygwin в Windows - оба прекрасно работают (для cygwin лучше просто поставить c:\cygwin\bin\ расположение папки в переменной PATH вашей системы для более легкого доступа).
  • Обработка ТРУБЫ (STDOUT и STDERR обрабатываются через).
  • экранированные символы (| , > , &) - рекомендуется / рекомендуется для Windows7+.
  • нет петель , нет goto
  • работа с числовыми данными (заголовок ответа curl Content-Length)
  • А также.. НЕТ ВРЕМЕННЫХ ФАЙЛОВ!


@echo off

setlocal enableextensions
  for /f "tokens=*" %%a in ('curl --head --ipv4 --sslv3 --silent --location-trusted --url "https://storage.googleapis.com/chromium-browser-continuous/Win_x64/362418/mini_installer.exe" 2^>^&1 ^| grep "Content-Length" 2^>^&1 ^| sed "s/\r\n$//g" 2^>^&1 ^| sed "s/content-length\:\ //gi" 2^>^&1') do ( set /a num=%%a )

  set /a num=%num% / 1024 / 1024

  echo it is %num%MB
endlocal

будет выводить it is 41MB

(оригинальный заголовок Content-Length: 43597312)


взял это отсюда: - CMD/Bash Script Ninja - Манипуляция номера заголовка ответа cURL

0

Вы можете проверить PsTools от Microsoft (Sysinternals). Существует инструмент под названием PsService, где вы можете удаленно проверять сервисы через параметр \\computer

-2

это просто пример, чтобы узнать, как можно "установить yyy" из "yyy = 1 toto" в первый ун () из "yyy = 1 toto", но после строки произнесите "переменная среды yyy не определена"

echo toto tata titi|awk.exe -F"tata" "{print NR,$1}"|(set /p yyy=&set yyy)
set yyy

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .