299 votes

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

Comment puis-je script une bat ou cmd pour arrêter et démarrer un service de manière fiable avec vérification des erreurs (ou me faire savoir que cela n'a pas réussi pour une raison quelconque) ?

0 votes

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

354voto

Ferruccio Points 51508

Utilisez le SC (contrôle de service), il vous donne beaucoup plus d'options que juste start & stop .

  DESCRIPTION:
          SC is a command line program used for communicating with the
          NT Service Controller and services.
  USAGE:
      sc <server> \[command\] \[service name\]  ...

      The option <server> has the form "\\\\ServerName"
      Further help on commands can be obtained by typing: "sc \[command\]"
      Commands:
        query-----------Queries the status for a service, or
                        enumerates the status for types of services.
        queryex---------Queries the extended status for a service, or
                        enumerates the status for types of services.
        start-----------Starts a service.
        pause-----------Sends a PAUSE control request to a service.
        interrogate-----Sends an INTERROGATE control request to a service.
        continue--------Sends a CONTINUE control request to a service.
        stop------------Sends a STOP request to a service.
        config----------Changes the configuration of a service (persistant).
        description-----Changes the description of a service.
        failure---------Changes the actions taken by a service upon failure.
        qc--------------Queries the configuration information for a service.
        qdescription----Queries the description for a service.
        qfailure--------Queries the actions taken by a service upon failure.
        delete----------Deletes a service (from the registry).
        create----------Creates a service. (adds it to the registry).
        control---------Sends a control to a service.
        sdshow----------Displays a service's security descriptor.
        sdset-----------Sets a service's security descriptor.
        GetDisplayName--Gets the DisplayName for a service.
        GetKeyName------Gets the ServiceKeyName for a service.
        EnumDepend------Enumerates Service Dependencies.

      The following commands don't require a service name:
      sc <server> <command> <option>
        boot------------(ok | bad) Indicates whether the last boot should
                        be saved as the last-known-good boot configuration
        Lock------------Locks the Service Database
        QueryLock-------Queries the LockStatus for the SCManager Database
  EXAMPLE:
          sc start MyService

1 votes

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

1 votes

Excellente 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)

58 votes

Le problème avec SC est que la commande revient immédiatement et non pas une fois l'action terminée. Si vous voulez redémarrer un service via un fichier batch (stop puis start), le stop revient immédiatement, le start échoue ensuite car le service n'est pas arrêté. Net stop/start revient après la fin de l'action et n'a donc pas ce problème.

218voto

Bill Michell Points 4879
net start [serviceName]

et

net stop [serviceName]

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

U:\>net stop alerter
The Alerter service is not started.

More help is available by typing NET HELPMSG 3521.

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

Comme un fichier bat, error.bat :

@echo off
net stop alerter
if ERRORLEVEL 1 goto error
exit
:error
echo There was a problem
pause

Le résultat ressemble à ceci :

U:\>error.bat
The Alerter service is not started.

More help is available by typing NET HELPMSG 3521.

There was a problem
Press any key to continue . . .

Codes de retour

 - 0 = Success
 - 1 = Not Supported
 - 2 = Access Denied
 - 3 = Dependent Services Running
 - 4 = Invalid Service Control
 - 5 = Service Cannot Accept Control
 - 6 = Service Not Active
 - 7 = Service Request Timeout
 - 8 = Unknown Failure
 - 9 = Path Not Found
 - 10 = Service Already Running
 - 11 = Service Database Locked
 - 12 = Service Dependency Deleted
 - 13 = Service Dependency Failure
 - 14 = Service Disabled
 - 15 = Service Logon Failure
 - 16 = Service Marked For Deletion
 - 17 = Service No Thread
 - 18 = Status Circular Dependency
 - 19 = Status Duplicate Name
 - 20 = Status Invalid Name
 - 21 = Status Invalid Parameter 
 - 22 = Status Invalid Service Account
 - 23 = Status Service Exists
 - 24 = Service Already Paused

Editer 20.04.2015

Codes de retour :

La commande NET ne renvoie pas les codes de retour documentés de la classe Win32_Service (Service non actif, Service Request Timeout, etc.) et pour de nombreuses erreurs, elle renvoie simplement le niveau d'erreur 2.

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

1 votes

NET n'est pas uniquement pour les fonctions liées au service alors que SC est uniquement 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 lot script continue à s'exécuter.

1 votes

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

29voto

Jonas Gulle Points 3435

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

net start [your service]
if %errorlevel% == 2 echo Could not start service.
if %errorlevel% == 0 echo Service started successfully.
echo Errorlevel: %errorlevel%

Clause de non-responsabilité : J'ai écrit ceci de mémoire, mais je pense que ça va marcher.

9voto

vanval Points 74

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

net start "Apache tomcat" || goto ExitError

:End  
exit 0  

:ExitError  
echo An error has occurred while starting the tomcat services  
exit 1

9voto

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 comme bon vous semble. J'ai créé ce fichier il y a quelque temps parce que je m'ennuyais et que je voulais créer un moyen simple pour que les gens puissent saisir la fin, le début, l'arrêt ou le réglage sur automatique. Ce fichier BAT vous demande simplement d'entrer le nom du service et il fera le reste pour vous. Je n'avais pas réalisé qu'il cherchait quelque chose qui indique une erreur, j'ai dû mal lire cette partie. Bien que cela puisse être fait en entrant >> output.txt à la fin de la ligne.

Le %var% est juste un moyen pour l'utilisateur de pouvoir entrer son propre service dans ce fichier, 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'hésitez pas à me corriger.

@echo off
set /p c= Would you like to start a service [Y/N]?
  if /I "%c%" EQU "Y" goto :1
  if /I "%c%" EQU "N" goto :2
    :1  
    set /p var= Service name: 
:2 
set /p c= Would you like to stop a service [Y/N]?
  if /I "%c%" EQU "Y" goto :3
  if /I "%c%" EQU "N" goto :4
    :3  
    set /p var1= Service name:
:4
set /p c= Would you like to disable a service [Y/N]?
  if /I "%c%" EQU "Y" goto :5
  if /I "%c%" EQU "N" goto :6
    :5  
    set /p var2= Service name:
:6 
set /p c= Would you like to set a service to auto [Y/N]?
  if /I "%c%" EQU "Y" goto :7
  if /I "%c%" EQU "N" goto :10
    :7  
    set /p var3= Service name:
:10
sc start %var%
sc stop %var1%
sc config %var2% start=disabled
sc config %var3% start=auto

1 votes

En général, les réponses sous forme de code seulement ne sont pas appréciées. Pourriez-vous développer votre solution ou ajouter des commentaires explicatifs ?

3 votes

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

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