Jak zrestartować usługę Windows ze skryptu?

38

Mam skrypt partii, który wygląda następująco:

sc stop myservice
sc start myservice

wyskakuje, ponieważ sc nie czeka aż usługa zostanie zatrzymana. Jak zrestartować usługę za pomocą skryptu?

Jozuego
źródło
co z tego ?
pQd

Odpowiedzi:

47

Plakat chce się upewnić, że usługa została zatrzymana przed próbą jej ponownego uruchomienia. Możesz użyć pętli na wyjściu „zapytania sc”, wykonując coś takiego:

: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
crb
źródło
8
Dobre wykorzystanie ping jako opóźnienia czasowego.
David Yu,
Dzięki, nie ma spania w partii, więc to wszystko, co możesz zrobić, aby poczekać :)
crb
4
+1 i znaczek GOTO. Przyznawany tym, którzy używają wyrażenia GOTO o prostej twarzy.
Joseph Kern
Jeśli tylko obsługiwane przez pętle do / while pętle ... To banalne w C #, naprawdę!
crb,
3
W systemie Windows Server 2008 poziom błędu wynosi 0, gdy zostanie znaleziony, i 1, gdy nie zostanie znaleziony. Musiałem więc odwrócić logikę, a potem zadziałało.
Kirk Woll
26

Może czegoś brakuje, ale używam tego cały czas:

net stop „myservice”
net start „myservice”

lub krócej:

net stop „myservice” i& net start „myservice”

Skawt
źródło
24

Zupełnie prosty w PowerShell:

PS >Restart-Service MySrvcHere

Jeszcze lepiej, używając wyświetlanych nazw:

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

Get-Help Restart-Service po więcej

Factor Mystic
źródło
6

Jeśli służy to wyłącznie do ponownego uruchomienia usługi, możesz użyć

Net stop myservice
Net start myservice

Jeśli jednak chcesz uzyskać dostęp do opcji sc, możesz użyć polecenia start / wait

start /B /WAIT CMD /C "sc stop myservice"
start /B /WAIT CMD /C "sc start myservice"

ta technika jest bardziej ogólnym rozwiązaniem, które można zastosować do dowolnego polecenia.

Peter Stuer
źródło
sc stop myservicewyśle ​​po prostu polecenie stop i wróci przed zatrzymaniem usługi. Wywołanie sc za pomocą start / b nie pomoże.
Jürgen Steinblock
5

Aby mieć cichy restart niektórych usług, które wymagają zatrzymania potwierdzeń (na przykład usługi serwera), możesz dodać / y do komendy zakończenia stop.

net stop Server /y
net start Server

Byłoby pomocne w przypadku automatycznego wykonywania skryptu.

Fedir RYKHTIK
źródło
3

Jeśli chcesz zrestartować uszkodzoną usługę, nie musisz uruchamiać skryptu. W usłudze MMC Snap kliknij prawym przyciskiem myszy usługę, wybierz właściwości, kliknij kartę odzyskiwania. Tutaj możesz ustawić, jakie działania chcesz podjąć, aby usługa przestała działać. Dostępna jest duża elastyczność. Będziesz potrzebował skryptu, jeśli próbujesz zatrzymać usługę, zrób coś, a następnie uruchom skrypt, poprzedzaj plik wsadowy net stop "myserviceshortname"i zakończnet start "myserviceshortname"

W vbscipt jest trochę więcej kodu, aby zatrzymać usługę i jej „zależności”:

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

Oto rozpoczęcie usługi i wszystko, od czego to zależy (powinno być znane)

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
Jim B.
źródło
1

Możesz użyć następujących poleceń:

@echo off
sc Stop <Name of Agentry Service Here>
timeout 30
sc start <Name of Agentry Service Here>
Ganesh
źródło