Остановить пакетный файл до полной остановки службы?

Я использую командный файл, чтобы остановить службу Windows. Я использую sc команда, но я открыт для других идей, учитывая вопрос ниже. Проблема заключается в том, что пакетный файл продолжается, пока служба останавливается (stop аргумент sc кажется, только чтобы запросить остановку - он не ждет остановки).

Как я могу изменить командный файл, чтобы он не продолжался до тех пор, пока остановка не будет завершена?

7 ответов

Решение

Использование можно использовать NET stop, который является синхронным, то есть он будет ждать, пока служба не остановится.

Смотри - НЕТ стоп

sc stop webdriveservice
:loop
sc query webdriveservice | find "STOPPED"
if errorlevel 1 (
  timeout 1
  goto loop
)

Как упомянуто выше, NET STOP отправит команду остановки в службу, но, если служба занимает более определенного времени (мое наблюдение примерно 20 секунд или около того), NET STOP НЕ будет ожидать фактической остановки службы, прежде чем вернуться.

Чтобы фактически приостановить пакетный файл до тех пор, пока служба не остановится, вам необходимо использовать подход, подобный изложенному в следующих потоках:

Как проверить, запущен ли сервис через командный файл, и запустить его, если он не запущен?

Остановка / запуск удаленной службы Windows и ожидание ее открытия / закрытия

Я верю net stop [Service] следует дождаться полной остановки службы, прежде чем двигаться дальше. sc stop [Service] просто отправляет "стоп" сообщение в сервис.

У меня была аналогичная проблема с net stop. Он возвращается, когда служба действительно остановлена, но исполняемый файл все еще может быть запущен.
По причинам обновления этого недостаточно, нам нужно дождаться завершения процесса.

Я использовал простой цикл, чтобы дождаться фактического завершения исполняемого файла службы:

      net stop "ServiceName"
:loop1
set _CmdResult=""
for /f "tokens=1" %%a in ('TASKLIST ^| FINDSTR ServiceName.exe') do set _CmdResult=%%a
if not %_CmdResult% == ""  (
  timeout 5
  goto loop1
)

Как только исполняемый файл завершится, цикл прервется.

Это немного грубо, но это сработало для меня, чтобы убедиться, что я могу запланировать ежедневный пакетный файл, чтобы по существу перезапустить сервис.

NET STOP [Сервис]

:Попробуйте снова

ВРЕМЯ / T 10 / NOBREAK

NET START [Сервис]

IF% ERRORLEVEL% NEQ 0 GOTO TryAgain

С помощью этого фрагмента кода я понимаю, что это может привести к бесконечному циклу, если служба не запустится успешно. Я просто хотел показать, как обойти проблему, используя TIMEOUT, где остановка службы может занять больше времени, чем позволяет команда NET STOP.

Использовать && символ между командами. && Символ ожидает завершения предыдущей команды, прежде чем перейти к следующей команде.

Все команды должны быть в одной командной строке. Вы можете использовать столько команд, сколько захотите.

Вы можете использовать также pause команда. При этом просит нажать любую клавишу, прежде чем перейти к следующей процедуре.

Например:

sc qdescription "MyServiceName" && echo. && sc stop "MyServiceName" && echo. && echo          [ "MyServiceName" service stopped ] && echo. && pause
Другие вопросы по тегам