Назад | Перейти на главную страницу

Как перезапустить службу Windows из сценария?

У меня есть пакетный сценарий, который выглядит так:

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>