Comment redémarrer un service Windows à partir d'un script?

38

J'ai un script batch qui ressemble à:

sc stop myservice
sc start myservice

il se trompe car sc n'attend pas que le service soit arrêté. Comment redémarrer un service avec un script?

Josué
la source
Qu'en est- ce ?
PQD

Réponses:

47

L’affiche veut s’assurer que le service est arrêté avant d’essayer de le redémarrer. Vous pouvez utiliser une boucle sur le résultat de "sc query" en procédant comme suit:

: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
la source
9
Belle utilisation de ping comme un délai.
David Yu
Merci, il n'y a pas de sommeil en lot, donc c'est tout ce que vous pouvez faire pour attendre :)
crb
4
+1 et un badge GOTO. Remis à ceux qui utilisent une déclaration GOTO avec un visage impassible.
Joseph Kern
Si seulement les boucles do / while supportées par lots ... C'est vraiment trivial en C #, vraiment!
crb
3
Dans Windows Server 2008, le niveau d'erreur est 0 lorsqu'il est trouvé et 1 s'il est introuvable. J'ai donc dû inverser la logique et ensuite cela a fonctionné.
Kirk Woll
26

Peut-être qu'il manque quelque chose, mais je l'utilise tout le temps:

net stop "myservice"
net start "myservice"

ou plus court:

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

Skawt
la source
24

Dead simple avec powershell:

PS >Restart-Service MySrvcHere

Encore mieux, en utilisant les noms d'affichage:

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

Get-Help Restart-Service pour plus

Facteur Mystique
la source
6

S'il s'agit uniquement de redémarrer le service, vous pouvez utiliser

Net stop myservice
Net start myservice

Toutefois, si vous souhaitez accéder aux options de sc, vous pouvez utiliser la commande start / wait.

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

Cette technique est une solution plus générale qui peut être appliquée à n'importe quelle commande.

Peter Stuer
la source
sc stop myserviceenverra simplement la commande stop et reviendra avant que le service ne soit arrêté. Appeler sc avec start / b ne vous aidera pas.
Jürgen Steinblock le
5

Pour que le redémarrage silencieux d’un service demande l’arrêt des confirmations (en tant que service Serveur, par exemple), vous pouvez ajouter / y à la commande de fin d’arrêt.

net stop Server /y
net start Server

Cela serait utile pour l'exécution automatique de scripts.

Fedir RYKHTIK
la source
3

Si vous souhaitez redémarrer un service en échec, vous n'avez pas besoin d'exécuter de script. Dans le composant logiciel enfichable MMC des services, cliquez avec le bouton droit de la souris sur un service, sélectionnez Propriétés, cliquez sur l'onglet Récupération. Ici, vous pouvez définir les actions que vous souhaitez entreprendre si le service s’arrête. Il y a beaucoup de flexibilité disponible. Vous aurez besoin d’un script si vous essayez d’arrêter le service, faites quelque chose puis démarrez le script, faites précéder le fichier de commandes par net stop "myserviceshortname"et terminez parnet start "myserviceshortname"

Dans vbscipt, c'est un peu plus de code pour arrêter un service et ses dépendants:

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

Voici comment démarrer un service et tout ce dont il dépend (cela devrait être familier)

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
la source
1

Vous pouvez utiliser les commandes suivantes:

@echo off
sc Stop <Name of Agentry Service Here>
timeout 30
sc start <Name of Agentry Service Here>
Ganesh
la source