Comment puis-je script une batte ou cmd pour arrêter et démarrer un service de manière fiable avec vérification des erreurs (ou me faire savoir qu'il n'a pas réussi pour une raison quelconque)?
Comment puis-je script une batte ou cmd pour arrêter et démarrer un service de manière fiable avec vérification des erreurs (ou me faire savoir qu'il n'a pas réussi pour une raison quelconque)?
Réponses:
Utilisez la commande SC
(contrôle de service), elle vous offre beaucoup plus d'options que simplement start
& stop
.
LA DESCRIPTION: SC est un programme en ligne de commande utilisé pour communiquer avec le Contrôleur de service NT et services. USAGE: sc <serveur> [commande] [nom du service] ... L'option <serveur> a la forme "\\ ServerName" Une aide supplémentaire sur les commandes peut être obtenue en tapant: "sc [commande]" Commandes: query ----------- Interroge l'état d'un service, ou énumère l'état des types de services. queryex --------- Interroge l'état étendu d'un service, ou énumère l'état des types de services. start ----------- Démarre un service. pause ----------- Envoie une demande de contrôle PAUSE à un service. interroger ----- Envoie une demande de contrôle INTERROGATE à un service. continue -------- Envoie une demande de contrôle CONTINUE à un service. stop ------------ Envoie une demande STOP à un service. config ---------- Modifie la configuration d'un service (persistant). 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 (du registre). create ---------- Crée un service. (l'ajoute au 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 - Obtient le DisplayName d'un service. GetKeyName ------ Obtient le ServiceKeyName pour un service. EnumDepend ------ Énumère les dépendances de service. Les commandes suivantes ne nécessitent pas de nom de service: sc <serveur> <commande> <option> boot ------------ (ok | bad) Indique si le dernier démarrage doit être enregistré en tant que dernière configuration de démarrage connue Verrouiller ------------ Verrouille la base de données des services QueryLock ------- Interroge le LockStatus pour la base de données SCManager EXEMPLE: sc démarrer MyService
net start [serviceName]
et
net stop [serviceName]
vous dire s'ils 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 de commandes, vous avez accès au NIVEAU D'ERREUR du code retour. 0 indique le succès. Une valeur plus élevée indique une défaillance.
En tant que fichier de chauve - souris, 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 . . .
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:
La commande NET ne renvoie pas les codes de retour de la classe Win32_Service documentés (Service non actif, délai d'expiration de la demande de service, etc.) et pour de nombreuses erreurs renvoie simplement Errorlevel 2.
Regardez ici: http://ss64.com/nt/net_service.html
NET
n'est pas seulement pour les fonctions liées au service alors qu'il SC
est juste pour les fonctions liées au service.
errorlevel
retour est 2, voyez ici comment interpréter le résultat de l'erreur .
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%
Avertissement: j'ai écrit cela du haut de ma tête, mais je pense que cela fonctionnera.
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éé cela il y a peu de temps parce que je m'ennuyais et que je voulais proposer aux gens un moyen simple de saisir la fin, le démarrage, l'arrêt ou le réglage sur auto. Ce fichier BAT vous demande simplement d'entrer le nom du service et il fera le reste pour vous. Je ne savais pas 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 saisissant >> output.txt à la fin de la ligne.
Le% var% est juste un moyen pour l'utilisateur de pouvoir y entrer son propre service, 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
Utiliser les codes retour de net start
et net stop
me semble être la meilleure méthode. Essayez ceci: Codes de retour Net Start .
La syntaxe m'a toujours .... alors ...
Voici explicitement comment ajouter une ligne à un fichier de commandes qui tuera un service distant (sur une autre machine) si vous êtes 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 nom du service.
Pour vos accros Service Ops ... assurez-vous d'ajouter votre code de raison et de commenter! c'est-à-dire '4' qui est égal à 'Planifié' et commentaire 'Arrêt du serveur pour maintenance'
sc \\ip.ip.ip.ip stop p4_1 4 Stopping server for maintenance
CMD
tant que l'autre utilisateur / ID en faisant runas /user:Domain\UserName cmd
puis entrez votre mot de passe. CMD commencera à s'exécuter en tant que compte d'utilisateur spécifié.
Nous aimerions penser que "net stop" arrêtera le service. Malheureusement, la réalité n'est pas si noire et blanche. Si le service met longtemps à s'arrêter, la commande revient avant l'arrêt du service. Cependant, vous ne le saurez pas, sauf si vous vérifiez le niveau d'erreur.
La solution semble être de boucler en rond à la recherche de l'état du service jusqu'à ce qu'il soit arrêté, avec une pause à chaque tour de boucle.
Mais encore une fois...
Je constate que le premier service prend beaucoup de temps à s'arrêter, puis le «net stop» pour un service ultérieur semble ne rien faire. Regardez le service dans le gestionnaire de services, et son état est toujours "Démarré" - aucun changement à "Arrêt". Pourtant, je peux arrêter ce deuxième service manuellement en utilisant le SCM, et il s'arrête en 3 ou 4 secondes.
J'ai juste utilisé l'exemple de Jonas ci-dessus et créé une liste complète de 0 à 24 niveaux d'erreur. Les autres articles sont corrects net start
et net stop
n'utilisent queerrorlevel
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%
Passez stop
à start
et fonctionne à l'envers.
Le redémarrage manuel du service est correct - services.msc a le bouton "Redémarrer", mais en ligne de commande les commandes sc et net n'ont pas de commutateur "redémarrer" 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 a besoin de 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 timeout, j'utilise ping (ça sonne toutes les 1 secondes): sc stop ping localhost -n 60 sc start
Voici la commande Windows 10 pour démarrer la restauration du système à l'aide d'un lot:
sc config swprv start= Auto
Vous pouvez également aimer ces commandes:
Modifier la valeur de Registre pour démarrer automatiquement la restauration du système
REG ADD "HKLM \ SOFTWARE \ Microsoft \ Windows NT \ CurrentVersion \ SystemRestore" / v DisableSR / t REG_DWORD / d 0 / f
Créer un point de restauration système
Wmic.exe / Namespace: \ root \ default Path SystemRestore Appelez CreateRestorePoint "djibe a sauvé votre PC", 100, 12
Modifier l'utilisation du disque de la restauration du système
vssadmin resize shadowstorage / for = C: / on = C: / maxsize = 10%
Prendre plaisir
Parfois, vous pouvez trouver l'arrêt ne fonctionne pas ..
Mon SQlServer fait parfois cela. L'utilisation de la ligne de commande suivante le tue. Si vous avez vraiment vraiment besoin de votre script pour tuer des trucs qui ne s'arrêtent pas. Je le ferais en dernier recours
taskkill /pid [pid number] /f
J'écris un service Windows en C #, la boucle stop / uninstall / build / install / start est devenue trop fatigante. A écrit un mini script, l'a appelé reploy.bat
et déposé dans mon répertoire de sortie Visual Studio (celui qui a l'exécutable du service intégré) pour automatiser la boucle.
Réglez simplement 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 fichier de solution (.sln)
binpath
: chemin complet (pas le chemin du dossier) vers l'exécutable du service à partir de la build
REMARQUE: cela doit être exécuté à partir de la ligne de msbuild
commande de Visual Studio Developer pour que la commande 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 :)