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 la vérification des erreurs (ou laissez-moi savoir qu'il n'a pas réussi pour une raison quelconque)?

259
demandé sur mmcdole 2008-09-25 19:09:22

14 réponses

Utilisez la commande SC (service control), elle vous donne beaucoup plus d'options que 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
321
répondu Ferruccio 2015-02-19 21:41:39
net start [serviceName]

Et

net stop [serviceName]

Vous dire si elles ont réussi ou échoué assez clairement. Par exemple

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

More help is available by typing NET HELPMSG 3521.

Si vous exécutez à partir d'un fichier batch, vous avez accès au niveau D'erreur du code de retour. 0 indique le succès. Tout ce qui est plus élevé 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

La sortie 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 . . .

Les 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

Modifier 20.04.2015

Codes De Retour:

Le NET la commande ne renvoie pas les codes de retour de classe win32_service documentés (Service non actif, délai D'attente de demande de Service, etc.) et pour de nombreuses erreurs retournera simplement Errorlevel 2.

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

188
répondu Bill Michell 2015-04-20 16:07:47

Vous pouvez utiliser la commande NET START, puis vérifier 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%

Disclaimer: j'ai écrit ceci du haut de ma tête, mais je pense que ça va marcher.

26
répondu Jonas Gulle 2008-09-25 15:15:06

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

net start "Apache tomcat" || goto ExitError

:End  
exit 0  

:ExitError  
echo An error has occurred while starting the tomcat services  
exit 1  
8
répondu vanval 2016-04-23 18:47:25

J'ai créé mon fichier batch personnel pour cela, le mien est un peu différent mais n'hésitez pas à modifier comme bon vous semble.

J'ai créé cela il y a un peu de temps parce que je m'ennuyais et que je voulais faire un moyen simple pour que les gens puissent entrer Fin, démarrage, arrêt de ou réglage de sur auto . Ce fichier BAT demande simplement que vous entrez le nom du service et il fera le reste pour vous. Je ne savais pas qu'il cherchait quelque chose qui disait toute erreur, je dois avoir mal lu cette partie. Bien que cela puisse généralement ê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 cela, au lieu d'avoir à 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= 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
7
répondu Nathanial Wilson 2018-05-13 05:36:52

L'utilisation des codes de retour de net start et net stop me semble être la meilleure méthode. Essayez un coup d'oeil à ceci: NET Start return codes.

6
répondu ZombieSheep 2012-05-15 07:29:01

La syntaxe m'obtient toujours.... si...

Ici est explicitement comment ajouter une ligne dans un fichier batch qui va tuer un service distant (sur une autre machine) si vous êtes un administrateur sur les deux machines, exécutez le .bat en tant qu'administrateur, et les machines sont sur le même domaine. Le nom de la machine suit le format UNC \ myserver

sc \\ip.ip.ip.ip stop p4_1

Dans ce cas... p4_1 était à la fois le nom du Service et le nom D'affichage, lorsque vous affichez les propriétés du service dans Service Manager. Vous devez utiliser le Service Nom.

Pour vos accros aux opérations de Service... assurez-vous d'ajouter votre code de raison et commentaire! c'est-à-dire '4' qui équivaut à 'planifié' et comment 'arrêter le serveur pour la maintenance'

sc \\ip.ip.ip.ip stop p4_1 4 Stopping server for maintenance
5
répondu ATSiem 2014-01-28 20:52:52

Nous aimerions penser que "NET stop" arrêtera le service. Malheureusement, la réalité n'est pas que noir et blanc. Si le service prend beaucoup de temps pour s'arrêter, la commande reviendra avant que le service ne s'arrête. Vous ne saurez pas, cependant, sauf si vous vérifiez errorlevel.

La solution semble être de faire une boucle à la recherche de l'état du service jusqu'à ce qu'il soit arrêté, avec une pause à chaque fois autour de la boucle.

Mais encore une fois...

Je vois le premier service prendre beaucoup de temps pour stop, alors le "net stop" pour un service ultérieur semble juste ne rien faire. Regardez le service dans le gestionnaire de services, et son état est toujours "démarré" - pas de changement à "arrêter". Pourtant, je peux arrêter ce deuxième service manuellement en utilisant le SCM, et il s'arrête en 3 ou 4 secondes.

4
répondu DaveH 2014-02-10 17:04:40

Ou vous pouvez démarrer le service à distance avec ce cmd: sc \\<computer> start <service>

3
répondu onionpsy 2012-01-27 08:56:01

Je viens d'utiliser L'exemple de Jonas ci-dessus et j'ai créé une liste complète de 0 à 24 niveaux d'erreur. Un autre message est correct que net start et net stop n'utilisent que errorlevel 0 pour le succès et 2 pour l'échec.

, Mais c'est ce qui a fonctionné pour moi:

net stop postgresql-9.1
if %errorlevel% == 2 echo Access Denied - Could not stop service
if %errorlevel% == 0 echo Service stopped successfully
echo Errorlevel: %errorlevel%

Changez stop en start et fonctionne à l'envers.

2
répondu Clinton 2016-02-12 16:33:38

Le redémarrage manuel du service est ok-services.msc a le bouton" Restart", mais en ligne de commande, les commandes sc et net manquent d'un commutateur "restart" et si le redémarrage est planifié dans le fichier cmd/bat, le service est arrêté et démarré immédiatement, parfois il obtient une erreur car le service n'est pas encore arrêté, il faut du temps pour arrêter les choses.

Cela peut générer une erreur: sc stop SC start

C'est une bonne idée d'insérer un délai d'attente, j'utilise ping (il ping toutes les 1 seconde): sc stop ping localhost-n 60 SC start

2
répondu Kuleris 2016-05-24 08:55:22

SC peut tout faire avec les services... démarrer, arrêter, contrôler, configurer, et plus encore...

1
répondu Axeman 2012-05-15 07:31:35

Parfois, vous pouvez trouver l'arrêt ne fonctionne pas..

Mon serveur SQL le fait parfois. L'utilisation de la ligne de commande suivante le tue. Si vous avez vraiment besoin de votre script pour tuer des choses qui ne s'arrêtent pas. Je voudrais le faire en dernier recours

taskkill /pid [pid number] /f
1
répondu andrew pate 2018-05-09 09:52:13

J'écris un service windows en C#, la boucle stop/uninstall/build/install/start est devenue trop fatigante. A écrit un mini script, appelé reploy.bat et déposé dans mon répertoire de sortie Visual Studio (celui qui a l'exécutable de service construit) pour automatiser la boucle.

Il suffit de définir ces 3 vars

servicename : cela apparaît sur le panneau de configuration du service Windows (services.msc)

slndir : dossier (pas le chemin complet) contenant votre solution (.sln) fichier

binpath : chemin complet (pas le chemin du dossier) à l'exécutable de service à partir de la construction

Remarque: Ceci doit être exécuté à partir de la ligne de commande Visual Studio Developer pour que la commande msbuild fonctionne.

SET servicename="My Amazing Service"
SET slndir="C:dir\that\contains\sln\file"
SET binpath="C:path\to\service.exe"
SET currdir=%cd%

call net stop %servicename%
call sc delete %servicename%
cd %slndir%
call msbuild 
cd %bindir%
call sc create %servicename% binpath=%binpath%
call net start %servicename%
cd %currdir%

Peut-être que cela aide quelqu'un :)

0
répondu sh87 2018-10-05 18:53:13