Antworten:
Das Poster möchte sicherstellen, dass der Dienst beendet wird, bevor versucht wird, ihn neu zu starten. Sie können eine Schleife an der Ausgabe von "sc query" verwenden, um Folgendes zu tun:
: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
Ganz einfach mit Powershell:
PS >Restart-Service MySrvcHere
Noch besser, wenn Sie Anzeigenamen verwenden:
PS >Restart-Service -displayname "My Service Name Here"
Get-Help Restart-Service
für mehr
Wenn es nur zum Neustarten des Dienstes dient, können Sie verwenden
Net stop myservice
Net start myservice
Wenn Sie jedoch auf die Optionen von sc zugreifen möchten, können Sie den Befehl start / wait verwenden
start /B /WAIT CMD /C "sc stop myservice"
start /B /WAIT CMD /C "sc start myservice"
Diese Technik ist eine allgemeinere Lösung, die auf jeden Befehl angewendet werden kann.
sc stop myservice
Sendet einfach den Befehl stop und kehrt zurück, bevor der Dienst beendet wird. Es hilft nicht, sc mit start / b aufzurufen.
Um einen leisen Neustart eines Dienstes zu erhalten, bei dem zum Beenden aufgefordert wird (z. B. als Serverdienst), können Sie am Ende des Stoppbefehls / y hinzufügen .
net stop Server /y
net start Server
Es wäre hilfreich für die automatische Skriptausführung.
Wenn Sie einen fehlgeschlagenen Dienst neu starten möchten, müssen Sie kein Skript ausführen. Klicken Sie im MMC-Snap-In für Dienste mit der rechten Maustaste auf einen Dienst, wählen Sie Eigenschaften aus und klicken Sie auf die Registerkarte Wiederherstellung. Hier können Sie festlegen, welche Aktionen Sie ausführen möchten, wenn der Dienst beendet wird. Es steht eine Menge Flexibilität zur Verfügung. Sie benötigen ein Skript, wenn Sie versuchen, den Dienst zu beenden, etwas zu tun und dann das Skript zu starten, die Batch-Datei mit einem Vorwort zu versehen net stop "myserviceshortname"
und mit zu beendennet start "myserviceshortname"
In vbscipt ist es ein bisschen mehr Code, um einen Dienst und seine abhängigen Elemente zu stoppen:
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
Hier wird ein Dienst gestartet und alles, wovon es abhängt (dies sollte vertraut sein)
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