Как проверить, запущена ли служба через пакетный файл и запустить ее, если она не запущена?
Я хочу написать пакетный файл, который выполняет следующие операции:
- проверьте, работает ли служба
- если он работает, выйти из пакета
- если он не работает, запустите службу
примеры кода, которые я искал до сих пор, оказались неработающими, поэтому я решил не публиковать их.
запуск службы выполняется с помощью:
net start "SERVICENAME"
- как я могу проверить, если служба запущена, и как сделать оператор if в пакетном файле?
- Я немного запутался. Какой аргумент я должен передать на чистый старт? Имя сервиса или его отображаемое имя?
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" ) )
объяснение того, что он делает:
- запрашивает свойства сервиса.
- ищет строку, содержащую текст "Государство"
- маркирует эту строку и вытаскивает третий токен, который содержит состояние службы.
- проверяет полученное состояние по строке "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