Как проверить, запущен ли сервис через командный файл, и запустить его, если он не запущен? - PullRequest
81 голосов
/ 24 июля 2010

Я хочу написать пакетный файл, который выполняет следующие операции:

  • Проверьте, запущена ли служба
    • Если она запущена, выйдите из пакета
    • Если он не запущен, запустите службу

Образцы кода, которые я до сих пор гуглил, оказались не работающими, поэтому я решил не публиковать их.

Запуск службы выполняется с помощью:

net start "SERVICENAME"
  1. Как проверить, работает ли служба, и как сделать оператор if в пакетном файле?
  2. Я немного растерялся.Какой аргумент я должен передать на чистый старт?Название сервиса или его отображаемое имя?

Ответы [ 14 ]

0 голосов
/ 02 мая 2019

Для Windows server 2012 ниже это то, что у меня сработало.Замените только "SERVICENAME" на фактическое имя службы:

@ECHO OFF
SET SvcName=SERVICENAME

SC QUERYEX "%SvcName%" | FIND "STATE" | FIND /v "RUNNING" > NUL && (
    ECHO %SvcName% is not running 
    ECHO START %SvcName%

    NET START "%SvcName%" > NUL || (
        ECHO "%SvcName%" wont start 
        EXIT /B 1
    )
    ECHO "%SvcName%" is started
    EXIT /B 0
) || (
    ECHO "%SvcName%" is running
    EXIT /B 0
)
0 голосов
/ 06 февраля 2019

Может быть, намного проще?Просто добавив в список ответов здесь:

@for /f "tokens=1,* delims=: " %%a in ('sc queryex state=Inactive') do net start "%%b"
0 голосов
/ 22 июня 2018

В связи с ответом @DanielSerrano, меня недавно немного поразила локализация команды sc.exe, а именно на испанском. Мое предложение состоит в том, чтобы точно указать строку и токен, который содержит числовое состояние обслуживания, и интерпретировать его, который должен быть гораздо более надежным:

@echo off

rem TODO: change to the desired service name
set TARGET_SERVICE=w32time

set SERVICE_STATE=
rem Surgically target third line, as some locales (such as Spanish) translated the utility's output
for /F "skip=3 tokens=3" %%i in ('""%windir%\system32\sc.exe" query "%TARGET_SERVICE%" 2>nul"') do (
  if not defined SERVICE_STATE set SERVICE_STATE=%%i
)
rem Process result
if not defined SERVICE_STATE (
  echo ERROR: could not obtain service state!
) else (
  rem NOTE: values correspond to "SERVICE_STATUS.dwCurrentState"
  rem https://msdn.microsoft.com/en-us/library/windows/desktop/ms685996(v=vs.85).aspx
  if not %SERVICE_STATE%==4 (
    echo WARNING: service is not running
    rem TODO: perform desired operation
    rem net start "%TARGET_SERVICE%"
  ) else (
    echo INFORMATION: service is running
  )
)

Проверено с:

  • Windows XP (32-разрядная версия) Английский
  • Windows 10 (32-разрядная версия) испанский
  • Windows 10 (64-разрядная версия) Английский
0 голосов
/ 12 января 2017
@Echo off

Set ServiceName=wampapache64

SC queryex "%ServiceName%"|Find "STATE"|Find /v "RUNNING">Nul&&(

echo %ServiceName% not running
echo  

Net start "%ServiceName%"


    SC queryex "%ServiceName%"|Find "STATE"|Find /v "RUNNING">Nul&&(
        Echo "%ServiceName%" wont start
    )
        echo "%ServiceName%" started

)||(
    echo "%ServiceName%" was working and stopping
    echo  

    Net stop "%ServiceName%"

)


pause
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...