97 votes

Comment vérifier si un service fonctionne via un fichier batch et le démarrer s'il ne fonctionne pas?

Je veux écrire un fichier batch qui effectue les opérations suivantes :

  • Vérifier si un service est en cours d'exécution
    • Si le service est en cours d'exécution, quitter le lot
    • Si le service n'est pas en cours d'exécution, démarrer le service

Les exemples de code que j'ai trouvés sur Google ne fonctionnaient pas, donc j'ai décidé de ne pas les publier.

Démarrer un service se fait en exécutant :

net start "NOMDUSERVICE"
  1. Comment puis-je vérifier si un service est en cours d'exécution, et comment faire une déclaration if dans un fichier batch?
  2. Je suis un peu confus. Quel est l'argument que je dois passer au net start ? Le nom du service ou son nom d'affichage?

3 votes

Programmation sale : lorsque la seule chose que vous voulez faire est de démarrer le service s'il ne fonctionne pas, il suffit d'émettre la commande de démarrage. S'il ne fonctionne pas, le service démarrera. S'il fonctionne déjà, vous obtiendrez un message d'erreur mais le service continuera de fonctionner. Sale mais ça marche. Cependant, lorsque vous voulez exécuter d'autres commandes uniquement si vous avez dû démarrer le service, alors allez définitivement avec la version plus propre de lc.

0 votes

@Peter Schuetze : Oui, votre objection est correcte si le seul but est de démarrer le service. J'ai également inclus le journal des départs, et cetera, donc je suis resté avec la solution de lc.

170voto

lc. Points 50297

Pour vérifier l'état d'un service, utilisez sc query . Pour les blocs if dans les fichiers batch, consultez la documentation.

Le code suivant vérifiera l'état du service MyServiceName et le démarrera s'il n'est pas en cours d'exécution (le bloc if sera exécuté si le service n'est pas en cours d'exécution) :

for /F "tokens=3 delims=: " %%H in ('sc query "MyServiceName" ^| findstr "        STATE"') do (
  if /I "%%H" NEQ "RUNNING" (
   REM Mettez votre code que vous souhaitez exécuter ici
   REM Par exemple, la ligne suivante
   net start "MyServiceName"
  )
)

Explication de ce qu'il fait :

  1. Interroge les propriétés du service.
  2. Cherche la ligne contenant le texte "STATE".
  3. Tokenise cette ligne et extrait le 3ème jeton, qui contient l'état du service.
  4. Teste l'état obtenu par rapport à la chaîne "RUNNING".

Quant à votre deuxième question, l'argument que vous voudrez passer à net start est le nom du service, pas le nom d'affichage.

0 votes

Génial. Merci pour tes efforts. Malheureusement, ça ne fonctionne pas ? Peut-être que je suis trop stupide pour ça. J'ai remplacé "MyServiceName" par "SCardSvr" (échappé) comme test, mis tout dans un fichier batch, exécuté, mais le service ne démarre pas. Même si je remplace net start par autre chose, comme l'impression dans un fichier, cela ne sera pas exécuté. Pourrais-tu jeter un second coup d'œil s'il te plaît ? =)

0 votes

Oops j'avais ajouté des choses supplémentaires dans la première ligne là... Essayez ceci. Et si cela ne fonctionne pas, que se passe-t-il lorsque vous exécutez sc query "SCardSvr" à partir d'une ligne de commande ?

1 votes

Avez-vous "SCardSvr" entre guillemets ? Je ne crois pas que cela devrait être.

34voto

CodeBlend Points 1789

Pour basculer un service, utilisez la commande suivante ;

NET START "Coordinateur de transactions distribuées" ||NET STOP "Coordinateur de transactions distribuées"

1 votes

Cela fonctionne en raison du code de sortie du démarrage. Si la commande de démarrage échoue, c'est probablement parce qu'elle est déjà en cours d'exécution (et dans tous les cas, l'arrêter par la suite ne fera pas de mal), donc vous essayez de l'arrêter.

3 votes

La commande est structurée de telle manière que si net start échoue, alors elle s'arrête (en raison du || qui signifie sinon), mais si net start s'exécute, alors le net stop ne s'exécute pas. Génial!

1 votes

C'est la meilleure réponse à mon avis, et peut-être que @citronas devrait envisager de la marquer comme réponse acceptée: simple, intelligent et élégant, et convient à un site comme StackOverflow. Simplifiez-le!

21voto

LittleBobbyTables Points 17738

Vous pouvez utiliser la commande suivante pour vérifier si un service est en cours d'exécution ou non :

sc query [NomDuService] | findstr /i "STATE"

Quand je l'exécute pour mon Antivirus NOD32, j'obtiens :

STATE                       : 4 RUNNING

S'il était arrêté, j'obtiendrais :

STATE                       : 1 STOPPED

Vous pouvez utiliser ceci dans une variable pour déterminer ensuite si vous utilisez NET START ou non.

Le nom du service doit être le nom du service, pas le nom d'affichage.

1 votes

Merci pour votre aide, en essayant d'intégrer ce que vous avez posté, j'ai beaucoup amélioré mes compétences en batch ;)

14voto

Kristina Brooks Points 4417

Cela devrait le faire :

FOR %%a IN (%Svcs%) DO (SC query %%a | FIND /i "RUNNING"
IF ERRORLEVEL 1 SC start %%a)

5voto

sagelightning Points 31

Je viens de trouver ce fil de discussion et je voulais ajouter à la discussion si la personne ne souhaite pas utiliser un fichier batch pour redémarrer les services. Sous Windows, il y a une option si vous allez dans Services, les propriétés du service, puis récupération. Ici vous pouvez définir des paramètres pour le service. Comme redémarrer le service si le service s'arrête. De plus, vous pouvez même avoir une deuxième tentative de défaillance pour faire quelque chose de différent comme redémarrer l'ordinateur.

2 votes

Voici une réponse utile, cependant il est important de noter que cela ne fonctionnera que si le service s'est arrêté avec exit(-1). Si le service s'est arrêté correctement (même avec un message d'erreur), Auto Recover ne sera pas déclenché. Il ne se déclenchera pas non plus si le service a été arrêté manuellement par l'utilisateur.

0 votes

@sagelightning: Nous avons besoin d'accès administrateur pour essayer de cette manière.

0 votes

@ArtGertner - Tuer (via le gestionnaire de tâches) un processus de service sera interprété comme un "plantage" et déclenchera une récupération.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X