2010-07-24 4 views
71

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

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

образцы кода я гугл до сих пор наработанный не будет работать, так что я решил не ро их.

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

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

Грязный программирование: когда единственное, что вы хотите сделать, это начать если он не запущен, просто введите команду запуска. Если он не запущен, он запустит службу. Если он запущен, вы получаете сообщение об ошибке, но служба работает (и не останавливается). Грязный, но он работает. Тем не менее, если вы хотите выполнять другие комментарии только в том случае, если вам нужно было запустить службу, то определенно перейдите с более чистой версией от lc. –

+0

@Peter Schuetze: Да, ваше возражение правильное, если запуск службы - единственная цель. Я также включил запуск регистрации и т. Д., Поэтому я придерживался решения lc. – citronas

ответ

123

Чтобы проверить состояние услуги, используйте sc query <SERVICE_NAME>. Ибо, если блоки в пакетных файлах, check the documentation.

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

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 это имя службы, не имя дисплея.

+0

Awesome. Спасибо за ваши усилия. К сожалению, это не работает? Может быть, я слишком глуп для этого. Я заменил «MyServiceName» на «SCardSvr» (экранированный) как тест, поместил все в пакетный файл, выполнил его, но служба не запустилась. Даже если я заменил net start чем-то другим, например печатью в файл, он не будет выполнен. Не могли бы вы отвлечься от второго взгляда? =) – citronas

+0

К сожалению, в первой строке там было несколько вещей ... Попробуйте это. И если это не работает, что происходит, когда вы запускаете «sc query» SCardSvr «из командной строки? –

+1

У вас есть «SCardSvr» в кавычках? Я не думаю, что это должно быть, – LittleBobbyTables

12

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

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

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

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

Когда я запускаю его для моего NOD32 Antivirus, Я получаю:

STATE      : 4 RUNNING 

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

STATE      : 1 STOPPED 

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

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

+1

Спасибо за вашу помощь, пытаясь интегрировать то, что вы отправили, я значительно увеличиваю свои навыки в партии;) – citronas

27

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

NET START "Distributed Transaction Координатора" || NET STOP "Распределенная координатор транзакций"

+1

Он работает из-за кода выхода с начала. Если команда запуска не работает, это, вероятно, потому, что она уже запущена (и в любом случае последующая остановка она не повредит), поэтому вы пытаетесь ее остановить. –

+3

команда структурирована таким образом, что если net start терпит неудачу, она затем останавливает ее (из-за того, что || это означает else), но если net start запускается, то net stop не выполняется. блестящий! –

+0

Довольно простой трюк, используемый часто в программировании! – Birla

4

Cuando себе использовать Windows, ан Español, эл Código Деба quedar аси (при использовании 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 жулик эль Nombre дель Servicio дие себе desea procesar. Puedes ver el nombre del servicio viendo las propiedades del servicio. (Заменить MYSERVICE с именем службы, подлежащих обработке. Вы можете увидеть название сервиса по эксплуатационным свойствам.)

+8

Будет лучше для каждого, если вы напишете свой ответ на английском языке. – j0k

+1

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

+2

@ lc: Было бы разумным включить ответ для каждого языка? Возможно, было бы более полезно ссылаться (или включать) ресурс, который говорит, какую строку нужно искать для данного языка. –

2
@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" 
1

Я также хотел по электронной почте отправлено, если был запущен сервис таким образом, так добавил немного на @Ic код просто думал, что я опубликую его на случай, если он кому-нибудь поможет. Я использовал SendMail, но есть и другие параметры командной строки How to send a simple email from a Windows batch file?

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 [email protected] /from [email protected] /subject Service Autostart Notification /body Autostart on service %service% succeded. 
    ) else (
     SendMail /smtpserver localhost /to [email protected] /from [email protected] /subject Service Autostart Notification /body Autostart on service %service% failed. 
    ) 
    ) 

) 
) 
5

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

+2

Это полезный ответ, однако важно отметить, что это будет работать, только если служба остановилась с выходом (-1). Если услуга вышла изящно (даже с сообщением об ошибке), Auto Recover не будет запускаться. Он также не будет запускаться, если служба была убита пользователем вручную. –

9

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

@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 
) 
+0

Да! «Космос» всегда внезапно попадает вам в спину! –

+0

Почти идеальный ответ. Я просто исправил эту строку: Net start «% ServiceName%»> nul || ( – Cesar

+0

Я сделал сценарий универсальным, поэтому он позволяет мне использовать в задачах Windows Scheduler. Просто замените 'Set ServiceName = Jenkins' на 'Set ServiceName =% ~ 1' и называть его как' watch-service.bat "Jenkins" ' –

0
@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 
1

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

Для запуска остановки службы

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

-noprofile -ExecutionPolicy байпас -file "C: \ Service Restart Scripts \ StopService.PS1"

проверить, запустив же на ЦМД, если он работает, он должен работать на планировщик задач также

$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 
} 
} 
Смежные вопросы