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


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

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

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

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

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

12 ответов:

чтобы проверить состояние службы, используйте sc query <SERVICE_NAME>. Для блоков if в пакетных файлах,Регистрация документации.

следующий код будет проверять состояние службы MyServiceName и запустить его, если он не запущен (блок if будет выполнен, если служба не запущена):

for /F "tokens=3 delims=: " %%H in ('sc query "MyServiceName" ^| findstr "        STATE"') do (
  if /I "%%H" NEQ "RUNNING" (
   REM Put your code you want to execute here
   REM For example, the following line
   net start "MyServiceName"
  )
)

объяснение того, что он делает:

  1. запрашивает свойства сервиса.
  2. ищет строку, содержащую текст "Государство"
  3. маркирует эту строку и вытаскивает третий токен, который содержит состояние службы.
  4. проверяет полученное состояние по строке "RUNNING"

что касается вашего второго вопроса, аргумент, который вы хотите передать net start - это имя службы, не отображаемое имя.

для переключения службы используйте следующее;

NET START "распределенная транзакция Координатор "/ / чистая остановка " распространяется Координатор Транзакций"

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

sc query [ServiceName] | findstr /i "STATE"

когда я запускаю его для своего антивируса NOD32, я получаю:

STATE                       : 4 RUNNING

Если бы это было остановлено, я бы получил:

STATE                       : 1 STOPPED

вы можете использовать это в переменной, чтобы затем определить, используете ли вы NET START или нет.

имя службы должно быть именем службы, а не отображаемым именем.

Это должно сделать это:

FOR %%a IN (%Svcs%) DO (SC query %%a | FIND /i "RUNNING"
IF ERRORLEVEL 1 SC start %%a)

независимая от языка версия.

@Echo Off
Set ServiceName=Jenkins


SC queryex "%ServiceName%"|Find "STATE"|Find /v "RUNNING">Nul&&(
    echo %ServiceName% not running 
    echo Start %ServiceName%

    Net start "%ServiceName%">nul||(
        Echo "%ServiceName%" wont start 
        exit /b 1
    )
    echo "%ServiceName%" started
    exit /b 0
)||(
    echo "%ServiceName%" working
    exit /b 0
)

Я только что нашел эту ветку и хотел бы добавить к обсуждению, если человек не хочет использовать пакетный файл для перезапуска служб. В Windows есть опция, если вы идете в службы, свойства службы, а затем восстановление. Здесь можно задать параметры для сервиса. Как перезапустить службу, если служба останавливается. Кроме того, вы даже можете иметь вторую неудачную попытку сделать что-то другое, как в перезагрузке компьютера.

Cuando se использовать Windows en Español, el código debe quedar asi (при использовании Windows на испанском языке, код):

for /F "tokens=3 delims=: " %%H in ('sc query MYSERVICE ^| findstr "        ESTADO"') do (
  if /I "%%H" NEQ "RUNNING" (
    REM Put your code you want to execute here
    REM For example, the following line
    net start MYSERVICE
  )
)

Reemplazar MYSERVICE con el nombre del servicio que se desea procesar. Puedes ver в Эль номбре-дель-службе просмотр Лас-сайт propiedades-дель-службе. (Замените MYSERVICE именем сервиса, который будет обработан. Вы можете увидеть имя службы в свойствах службы.)

@echo off

color 1F


@sc query >%COMPUTERNAME%_START.TXT


find /I "AcPrfMgrSvc" %COMPUTERNAME%_START.TXT >nul

IF ERRORLEVEL 0 EXIT

IF ERRORLEVEL 1 NET START "AcPrfMgrSvc"

Я также хотел отправить электронное письмо, если служба была запущена таким образом, поэтому добавил немного в код @Ic, просто подумал, что я опубликую его, если это кому-то поможет. Я использовал SendMail, но есть и другие параметры командной строки Как отправить простое письмо из пакетного файла Windows?

set service=MyServiceName

for /F "tokens=3 delims=: " %%H in ('sc query %service% ^| findstr "        STATE"') do (
  if /I "%%H" NEQ "RUNNING" (

    net start %service%

    for /F "tokens=3 delims=: " %%H in ('sc query %service% ^| findstr "        STATE"') do (
      if /I "%%H" EQ "RUNNING" (
        SendMail /smtpserver localhost /to me@mydomain.com /from watchdog@mydomain.com /subject Service Autostart Notification /body Autostart on service %service% succeded.
      ) else (
        SendMail /smtpserver localhost /to me@mydomain.com /from watchdog@mydomain.com /subject Service Autostart Notification /body Autostart on service %service% failed.
      )
    )

  )
)

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

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

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

-noprofile -параметра ExecutionPolicy байпас-файл "C:\Service перезапустить Скрипты\StopService.ПС1"

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

$Password = "Enter_Your_Password"
$UserAccount = "Enter_Your_AccountInfor"
$MachineName = "Enter_Your_Machine_Name"
$ServiceList = @("test.SocketService","test.WcfServices","testDesktopService","testService")
$PasswordSecure = $Password | ConvertTo-SecureString -AsPlainText -Force
$Credential = new-object -typename System.Management.Automation.PSCredential -argumentlist $UserAccount, $PasswordSecure 

$LogStartTime = Get-Date -Format "MM-dd-yyyy hh:mm:ss tt"
$FileDateTimeStamp = Get-Date -Format "MM-dd-yyyy_hh"
$LogFileName = "C:\Users\krakhil\Desktop\Powershell\Logs\StartService_$FileDateTimeStamp.txt" 


#code to start the service

"`n####################################################################" > $LogFileName
"####################################################################" >> $LogFileName
"######################  STARTING SERVICE  ##########################" >> $LogFileName

for($i=0;$i -le 3; $i++)
{
"`n`n" >> $LogFileName
$ServiceName = $ServiceList[$i]
"$LogStartTime => Service Name: $ServiceName" >> $LogFileName

Write-Output "`n####################################"
Write-Output "Starting Service - " $ServiceList[$i]

"$LogStartTime => Starting Service: $ServiceName" >> $LogFileName
Start-Service $ServiceList[$i]

$ServiceState = Get-Service | Where-Object {$_.Name -eq $ServiceList[$i]}

if($ServiceState.Status -eq "Running")
{
"$LogStartTime => Started Service Successfully: $ServiceName" >> $LogFileName
Write-Host "`n Service " $ServiceList[$i] " Started Successfully"
}
else
{
"$LogStartTime => Unable to Stop Service: $ServiceName" >> $LogFileName
Write-Output "`n Service didn't Start. Current State is - "
Write-Host $ServiceState.Status
}
}

#code to stop the service

"`n####################################################################" > $LogFileName
"####################################################################" >> $LogFileName
"######################  STOPPING SERVICE  ##########################" >> $LogFileName

for($i=0;$i -le 3; $i++)
{
"`n`n" >> $LogFileName
$ServiceName = $ServiceList[$i]
"$LogStartTime => Service Name: $ServiceName" >> $LogFileName

Write-Output "`n####################################"
Write-Output "Stopping Service - " $ServiceList[$i]

"$LogStartTime => Stopping Service: $ServiceName" >> $LogFileName
Stop-Service $ServiceList[$i]

$ServiceState = Get-Service | Where-Object {$_.Name -eq $ServiceList[$i]}

if($ServiceState.Status -eq "Stopped")
{
"$LogStartTime => Stopped Service Successfully: $ServiceName" >> $LogFileName
Write-Host "`n Service " $ServiceList[$i] " Stopped Successfully"
}
else
{
"$LogStartTime => Unable to Stop Service: $ServiceName" >> $LogFileName
Write-Output "`nService didn't Stop. Current State is - "
Write-Host $ServiceState.Status
}
}
@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

связанный с ответом @DanielSerrano, я недавно был бит локализацией