У меня есть пакетный сценарий, который выглядит так:
sc stop myservice
sc start myservice
он выдает ошибку, потому что sc не ждет, пока служба будет остановлена. Как перезапустить службу с помощью сценария?
Автор сообщения хочет убедиться, что служба остановлена, прежде чем пытаться ее перезапустить. Вы можете использовать цикл на выходе «sc query», делая что-то вроде этого:
:stop
sc stop myservice
rem cause a ~10 second sleep before checking the service state
ping 127.0.0.1 -n 10 -w 1000 > nul
sc query myservice | find /I "STATE" | find "STOPPED"
if errorlevel 1 goto :stop
goto :start
:start
net start | find /i "My Service">nul && goto :start
sc start myservice
Может чего-то не хватает, но я использую это все время:
чистая остановка "myservice"
чистый старт "myservice"
или короче:
net stop "myservice" && net start "myservice"
Мертвый простой с PowerShell:
PS >Restart-Service MySrvcHere
Еще лучше, используя отображаемые имена:
PS >Restart-Service -displayname "My Service Name Here"
Get-Help Restart-Service
для большего
Если это чисто для перезапуска службы, вы можете использовать
Net stop myservice
Net start myservice
Однако, если вам нужен доступ к параметрам sc, вы можете использовать команду start / wait
start /B /WAIT CMD /C "sc stop myservice"
start /B /WAIT CMD /C "sc start myservice"
этот метод - более общее решение, которое можно применить к любой команде.
Иметь тихо перезапуск некоторой службы, которая запрашивает остановку подтверждения (например, в качестве службы сервера), вы можете добавить / г до конца команды остановки.
net stop Server /y
net start Server
Это было бы полезно для автоматического выполнения скрипта.
Если вы хотите перезапустить отказавшую службу, вам не нужно запускать скрипт. В оснастке MMC служб щелкните правой кнопкой мыши службу, выберите свойства, щелкните вкладку восстановления. Здесь вы можете указать, какие действия вы хотите предпринять в случае остановки службы. Доступна большая гибкость. Вам понадобится сценарий, если вы пытаетесь остановить службу, сделайте что-нибудь, затем запустите сценарий, поставив перед пакетным файлом net stop "myserviceshortname"
и закончить net start "myserviceshortname"
В vbscipt это еще немного кода для остановки службы и ее зависимостей:
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colServiceList = objWMIService.ExecQuery("Associators of " _
& "{Win32_Service.Name='myservice'} Where " _
& "AssocClass=Win32_DependentService " & "Role=Antecedent" )
For each objService in colServiceList
objService.StopService()
Next
Wscript.Sleep 20000
Set colServiceList = objWMIService.ExecQuery _
("Select * from Win32_Service where Name='myservice'")
For each objService in colServiceList
errReturn = objService.StopService()
Next
Здесь запускается служба и все, от чего она зависит (это должно быть знакомо)
strComputer = "."
Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colServiceList = objWMIService.ExecQuery _
("Select * from Win32_Service where Name='Myservice'")
For each objService in colServiceList
errReturn = objService.StartService()
Next
Wscript.Sleep 20000
Set colServiceList = objWMIService.ExecQuery("Associators of " _
& "{Win32_Service.Name='myservice'} Where " _
& "AssocClass=Win32_DependentService " & "Role=Dependent" )
For each objService in colServiceList
objService.StartService()
Next
Вы можете использовать следующие команды:
@echo off
sc Stop <Name of Agentry Service Here>
timeout 30
sc start <Name of Agentry Service Here>