J'utilise un fichier de commandes pour arrêter un service Windows. J'utilise la commande sc
, mais je suis ouvert à d'autres idées, étant donné la question ci-dessous. Le problème est que le fichier batch continue tandis que le service s'arrête (l'argument stop
à sc
ne semble qu'à demande l'arrêt - - ce n'est pas attendre pour l'arrêt).
Comment puis-je modifier le fichier de commandes en ne pas continuer jusqu'à ce que l'arrêt soit terminé?
Utiliser peut utiliser NET stop
, qui est synchrone, c'est-à-dire qu'il attendra l'arrêt du service.
Voir - arrêt NET
sc stop webdriveservice
:loop
sc query webdriveservice | find "STOPPED"
if errorlevel 1 (
timeout 1
goto loop
)
Comme mentionné ci-dessus, NET STOP enverra une commande d'arrêt au service, mais, si le service prend plus d'un certain temps (environ 20 secondes est mon observation), NET STOP n'attendra PAS que le service s'arrête réellement avant de revenir.
Pour suspendre réellement le fichier de commandes jusqu'à l'arrêt du service, vous devez utiliser une approche similaire à celles décrites dans ces threads:
Arrêt/Démarrage d'un service Windows distant et attente de son ouverture/fermeture
Je crois net stop [Service]
devrait attendre que le service soit complètement arrêté avant de continuer. sc stop [Service]
envoie simplement un message "stop" au service.
C'est un peu grossier mais cela a fonctionné pour moi afin de pouvoir planifier un fichier batch quotidien pour essentiellement redémarrer un service.
NET STOP [Service]
:Réessayer
TIMEOUT/T 10/NOBREAK
NET START [Service]
IF% ERRORLEVEL% NEQ 0 GOTO TryAgain
Je me rends compte avec cet extrait de code que cela pourrait entraîner une boucle sans fin si le service ne réussissait pas à démarrer. Je voulais simplement montrer comment contourner le problème en utilisant TIMEOUT où un service peut prendre plus de temps à s'arrêter que ce que permet la commande NET STOP.
Utilisez le &&
symbole entre les commandes. Le &&
le symbole attend de terminer la commande précédente avant de passer à la commande suivante.
Toutes les commandes doivent être sur la même ligne de commande. Vous pouvez utiliser autant de commandes que vous le souhaitez dans une ligne.
Vous pouvez également utiliser la commande pause
. Avec cela, demande d'appuyer sur n'importe quelle touche, avant de passer à la procédure suivante.
Par exemple:
sc qdescription "MyServiceName" && echo. && sc stop "MyServiceName" && echo. && echo [ "MyServiceName" service stopped ] && echo. && pause