Як перезапустити службу Windows із сценарію?


38

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

sc stop myservice
sc start myservice

вона помиляється, тому що sc не чекає, поки сервіс не буде зупинений. Як перезапустити послугу зі сценарієм?


що з цим ?
pQd

Відповіді:


47

Плакат хоче переконатися, що послуга зупинена перед тим, як спробувати її перезапустити. Ви можете використовувати цикл на виході "sc запиту", роблячи щось подібне:

: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

8
Добре використовувати пінг як затримку часу.
Девід Юй

Дякую, спати в партії немає, тому це все, що можна зробити, щоб зачекати :)
crb

4
+1 і значок GOTO. Присуджується тим, хто використовує заяву GOTO з прямим обличчям.
Джозеф Керн

Якщо підтримується лише цикл циклів do / while ... Це справді тривожно в C #!
крб

3
У Windows Server 2008 рівень помилки становить 0 при знаходженні та 1, коли не знайдено. Тож мені довелося перевернути логіку, і тоді вона спрацювала.
Кірк Волл

26

Може щось бракувати, але я постійно користуюся цим:

net stop "myservice"
net start "myservice"

або коротше:

net stop "myservice" && net start "myservice"


24

Мертвий простий з повноцінною оболонкою:

PS >Restart-Service MySrvcHere

Ще краще, використовуючи відображувані імена:

PS >Restart-Service -displayname "My Service Name Here"

Get-Help Restart-Service для більш


6

Якщо це виключно для перезавантаження послуги, ви можете використовувати

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"

ця методика є більш загальним рішенням, яке можна застосувати до будь-якої команди.


sc stop myserviceпросто надішле команду stop та повернеться до того, як послуга буде зупинена. Виклик sc із запуском / b не допоможе.
Юрген Штейнблок

5

Щоб тихо перезапустити деяку службу, яка вимагає зупинити підтвердження (наприклад, серверну службу), Ви можете додати / y до кінця команди зупинки.

net stop Server /y
net start Server

Було б корисно для автоматичного виконання сценарію.


3

Якщо ви хочете перезапустити збій служби, вам не потрібно запускати скрипт. У сервісах оснащення 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

1

Ви можете використовувати такі команди:

@echo off
sc Stop <Name of Agentry Service Here>
timeout 30
sc start <Name of Agentry Service Here>
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.