312 votes

Arrêter et démarrer un service avec un fichier batch ou cmd ?

Comment puis-je scripter un fichier batch ou cmd pour arrêter et démarrer un service de manière fiable avec vérification des erreurs (ou me prévenir si cela n'a pas réussi pour une raison quelconque) ?

0 votes

Peut-être un peu hors sujet (puisque vous demandez une instruction bat & cmd) mais : PowerShell vous donne beaucoup de contrôle et de retour d'information pour effectuer des actions comme celle-ci.

360voto

Ferruccio Points 51508

Utilisez la commande SC (service control), elle vous donne beaucoup plus d'options que simplement start & stop.

  DESCRIPTION :
          SC est un programme en ligne de commande utilisé pour communiquer avec le
          Contrôleur de service NT et les services.
  USAGE :
      sc \[commande\] \[nom du service\]  ...

      L'option a la forme "\\\\NomDuServeur"
      Pour obtenir de l'aide supplémentaire sur les commandes, tapez : "sc \[commande\]"
      Commandes :
        query-----------Interroge l'état d'un service, ou
                        énumère l'état pour les types de services.
        queryex---------Interroge l'état étendu d'un service, ou
                        énumère l'état pour les types de services.
        start-----------Démarre un service.
        pause-----------Envoie une demande de contrôle PAUSE à un service.
        interrogate-----Envoie une demande de contrôle INTERROGATE à un service.
        continue--------Envoie une demande de contrôle CONTINUE à un service.
        stop------------Envoie une demande de STOP à un service.
        config----------Modifie la configuration d'un service (persistante).
        description-----Modifie la description d'un service.
        failure---------Modifie les actions prises par un service en cas d'échec.
        qc--------------Interroge les informations de configuration d'un service.
        qdescription----Interroge la description d'un service.
        qfailure--------Interroge les actions prises par un service en cas d'échec.
        delete----------Supprime un service (de la base de registre).
        create----------Crée un service. (l'ajoute à la base de registre).
        control---------Envoie un contrôle à un service.
        sdshow----------Affiche le descripteur de sécurité d'un service.
        sdset-----------Définit le descripteur de sécurité d'un service.
        GetDisplayName--Récupère le DisplayName d'un service.
        GetKeyName------Récupère le ServiceKeyName d'un service.
        EnumDepend------Énumère les dépendances du service.

      Les commandes suivantes ne nécessitent pas un nom de service :
      sc boot------------(ok | bad) Indique si le dernier démarrage devrait
                        être enregistré comme la dernière configuration de démarrage correcte
        Lock------------Verrouille la base de données des services
        QueryLock-------Interroge le statut de verrouillage de la base de données SCManager
  EXEMPLE :
          sc start MonService

1 votes

Je suis d'accord que c'est mieux que net start/stop. Notez qu'il existe une option pour gérer les services sur des machines distantes également.

1 votes

Superbe réponse. Mais vous devez être administrateur pour exécuter 'SC start service'. J'ai trouvé une solution pour cela ici. (La réponse acceptée contient la solution)

65 votes

Le problème avec SC est que la commande retourne immédiatement et non après l'action qui est complète. Si vous voulez redémarrer un service via un fichier batch (arrêter puis démarrer), l'arrêt se fait immédiatement, le démarrage échoue car le service n'est pas arrêté. Net stop/start retourne après que l'action soit complète, donc n'a pas ce problème.

227voto

Bill Michell Points 4879
net start [nomDuService]

et

net stop [nomDuService]

vous indiqueront clairement s'ils ont réussi ou échoué. Par exemple

U:\>net stop alerter
Le service Alerter n'est pas démarré.

Pour obtenir de l'aide supplémentaire, tapez NET HELPMSG 3521.

Si vous exécutez à partir d'un fichier batch, vous avez accès à l'ERRORLEVEL du code de retour. 0 indique le succès. Tout chiffre supérieur indique un échec.

En tant que fichier bat, erreur.bat:

@echo off
net stop alerter
if ERRORLEVEL 1 goto error
exit
:error
echo Il y a eu un problème
pause

La sortie ressemble à ceci:

U:\>erreur.bat
Le service Alerter n'est pas démarré.

Pour obtenir de l'aide supplémentaire, tapez NET HELPMSG 3521.

Il y a eu un problème
Appuyez sur une touche pour continuer . . .

Codes de retour

 - 0 = Succès
 - 1 = Non pris en charge
 - 2 = Accès refusé
 - 3 = Services dépendants en cours d'exécution
 - 4 = Contrôle de service invalide
 - 5 = Service ne peut pas accepter de contrôle
 - 6 = Service non actif
 - 7 = Délai d'attente de demande de service
 - 8 = Échec inconnu
 - 9 = Chemin introuvable
 - 10 = Service déjà en cours d'exécution
 - 11 = Base de données de service verrouillée
 - 12 = Dépendance de service supprimée
 - 13 = Échec de la dépendance de service
 - 14 = Service désactivé
 - 15 = Échec de la connexion au service
 - 16 = Service marqué pour suppression
 - 17 = Pas de thread de service
 - 18 = Dépendance circulaire de l'état
 - 19 = Nom en double de l'état
 - 20 = Nom invalide de l'état
 - 21 = Paramètre invalide de l'état
 - 22 = Compte de service invalide de l'état
 - 23 = Le service existe déjà
 - 24 = Service déjà en pause

Édition 20.04.2015

Codes de retour:

La commande NET ne renvoie pas les codes de retour de la classe Win32_Service documentée (Service non actif, Délai d'attente de la demande de service, etc.) et pour de nombreuses erreurs renverra simplement Errorlevel 2.

Regardez ici: http://ss64.com/nt/net_service.html

1 votes

NET n'est pas seulement pour les fonctions liées au service tandis que SC est juste pour les fonctions liées au service.

3 votes

Cette réponse est meilleure car la commande "net" bloque et attend que le service démarre ou s'arrête avant que le script par lots ne continue à s'exécuter.

1 votes

Depuis (comme l'indique l'Edit), la plupart du temps, le errorlevel retourné est 2, consultez ici comment interpréter le résultat de l'erreur.

29voto

Jonas Gulle Points 3435

Vous pouvez utiliser la commande NET START et ensuite vérifier la variable d'environnement ERRORLEVEL, par exemple :

net start [votre service]
if %errorlevel% == 2 echo Impossible de démarrer le service.
if %errorlevel% == 0 echo Service démarré avec succès.
echo Niveau d'erreur : %errorlevel%

Avertissement : J'ai écrit ceci de mémoire, mais je pense que ça fonctionnera.

10voto

Nathanial Wilson Points 145

J'ai créé mon fichier batch personnel pour cela, le mien est un peu différent mais n'hésitez pas à le modifier à votre guise. J'ai créé cela il y a quelque temps car je m'ennuyais et je voulais créer un moyen simple pour les gens de pouvoir entrer la fin, le début, l'arrêt, ou le réglage en automatique. Ce fichier BAT demande simplement que vous saisissiez le nom du service et il fera le reste pour vous. Je n'ai pas réalisé qu'il cherchait quelque chose qui indiquait une erreur, j'ai dû mal lire cette partie. Bien que cela puisse généralement être fait en entrant >> output.txt à la fin de la ligne.

Le %var% est simplement un moyen pour l'utilisateur de pouvoir saisir son propre service dans cela, au lieu de devoir modifier le fichier bat à chaque fois que vous voulez démarrer/arrêter un service différent.

Si je me trompe, n'importe qui peut se sentir libre de me corriger à ce sujet.

@echo off
set /p c= Voulez-vous démarrer un service [O/N]?
  if /I "%c%" EQU "O" goto :1
  if /I "%c%" EQU "N" goto :2
    :1  
    set /p var= Nom du service: 
:2 
set /p c= Voulez-vous arrêter un service [O/N]?
  if /I "%c%" EQU "O" goto :3
  if /I "%c%" EQU "N" goto :4
    :3  
    set /p var1= Nom du service:
:4
set /p c= Voulez-vous désactiver un service [O/N]?
  if /I "%c%" EQU "O" goto :5
  if /I "%c%" EQU "N" goto :6
    :5  
    set /p var2= Nom du service:
:6 
set /p c= Voulez-vous définir un service en automatique [O/N]?
  if /I "%c%" EQU "O" goto :7
  if /I "%c%" EQU "N" goto :10
    :7  
    set /p var3= Nom du service:
:10
sc start %var%
sc stop %var1%
sc config %var2% start=disabled
sc config %var3% start=auto

2 votes

Typiquement, les réponses ne contenant que du code ne sont pas appréciées. Pourriez-vous développer votre solution ou ajouter des commentaires explicatifs?

3 votes

J'ai créé cela il y a peu de temps parce que je m'ennuyais et voulais créer un moyen simple pour les gens de pouvoir entrer la fin, le début, l'arrêt ou le réglage automatique. Ce fichier BAT demande simplement que vous saisissiez le nom du service et il fera le reste pour vous.

9voto

vanval Points 74

Au lieu de vérifier les codes, cela fonctionne aussi

net start "Apache tomcat" || goto ExitError

:End  
exit 0  

:ExitError  
echo Une erreur s'est produite lors du démarrage des services tomcat  
exit 1

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