Comment puis-je scripter une chauve-souris ou une cmd pour arrêter et démarrer un service de manière fiable avec une vérification d'erreur (ou me laisser savoir qu'il n'a pas réussi pour une raison quelconque)?
Utilisez la commande SC
(service control), elle vous offre bien plus d’options que 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 "\\ NomServeur" Une aide supplémentaire sur les commandes peut être obtenue en tapant: "sc [commande]" Commandes: query ----------- Demande le statut d'un service ou énumère le statut des types de services . queryex --------- Demande le statut étendu pour un service, ou énumère le statut des 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 STOP à un service . config ---------- Change la configuration d'un service (persistant) . description ----- Modifie la description d'un service . failure --------- Modifie les actions entreprises par un service en cas d'échec . qc -------------- Interroge les informations de configuration d'un service . qdescription ---- Demande la description d'un service . qfailure -------- Interroge les actions entreprises 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 nom d'affichage pour 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 ou non être sauvegardé en tant que dernière configuration de démarrage connue connue Lock ------------ Verrouille la base de données de services QueryLock ------- Interroge LockStatus sur la base de données SCManager EXEMPLE: sc démarrez 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 à ERRORLEVEL du code de retour. 0 indique le succès. Tout ce qui est plus haut indique un échec.
En tant que 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 . . .
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
Edit 20.04.2015
Codes de retour:
La commande NET ne renvoie pas les codes de retour documentés de la classe Win32_Service (service inactif, délai d'attente de la demande de service, etc.) et renvoie de nombreuses erreurs pour de nombreuses erreurs.
Regardez ici: http://ss64.com/nt/net_service.html
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%
Déni de responsabilité: Je l'ai écrit de toutes mes forces, mais je pense que cela fonctionnera.
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
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 un moment parce que je m'ennuyais et voulais créer un moyen simple capable de saisir la fin, le démarrage, l’arrêt ou le réglage automatique. Ce fichier BAT vous demande simplement de saisir le nom du service et fera le reste à votre place. Je ne savais pas qu'il cherchait quelque chose qui indiquait une erreur, je dois avoir mal interprété cette partie. Cependant, cela peut généralement être fait en saisissant >> output.txt à la fin de la ligne.
Le% var% est simplement un moyen pour l'utilisateur de pouvoir entrer son propre service dans celui-ci, 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 de retour de net start
et net stop
me semble la meilleure méthode. Essayez ceci: Codes de retour Net Start .
La syntaxe me donne toujours .... alors ...
Voici explicitement comment ajouter une ligne à un fichier de commandes qui va tuer un service distant (sur une autre machine) si vous êtes un administrateur sur les deux machines, exécutez le fichier .bat en tant qu’administrateur et que les machines se trouvent 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 complet, lorsque vous affichez les propriétés du service dans Service Manager. Vous devez utiliser le nom du service.
Pour vos junkies Service Ops ... n'oubliez pas d'ajouter votre code de motif et votre commentaire! c'est-à-dire '4', ce qui équivaut à 'Prévu' et à un commentaire 'Arrêt du serveur pour maintenance'
sc \\ip.ip.ip.ip stop p4_1 4 Stopping server for maintenance
Nous aimerions penser que "net stop" arrêtera le service. Malheureusement, la réalité n'est pas que noir et blanc. Si le service met longtemps à s’arrêter, la commande reviendra avant que le service ne s’arrête. Vous ne saurez pas, cependant, à moins de vérifier le niveau d'erreur.
La solution semble consister à rechercher en boucle 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 constate que le premier service met beaucoup de temps à s’arrêter, puis que le «blocage net» pour un service ultérieur semble ne rien faire. Examinez le service dans le gestionnaire de services et son état est toujours "Démarré" - aucun changement en "Arrêt". Pourtant, je peux arrêter manuellement ce second service à l'aide du SCM, qui s'arrête au bout de 3 ou 4 secondes.
ou vous pouvez démarrer le service distant avec cette cmd: sc \\<computer> start <service>
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 manquent d'un commutateur "redémarrage" et si le redémarrage est planifié dans le fichier cmd/bat, le service est arrêté obtient une erreur car le service n'est pas encore arrêté, il faut un peu de temps pour tout arrêter.
Cela peut générer une erreur: Sc stop Sc start
C’est une bonne idée d’insérer le délai d’attente, j’utilise ping (il cingle toutes les secondes): Sc stop Ping localhost -n 60sc start
Je viens d'utiliser l'exemple de Jonas ci-dessus et de créer une liste complète de 0 à 24 niveaux d'erreur. L'autre message est correct. net start
et net stop
n'utilisent que errorlevel
0 en cas de succès et 2 en cas d'échec.
Mais voici 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%
Remplacez stop
par start
et fonctionne en sens inverse.
SC
peut tout faire avec les services ... démarrer, arrêter, vérifier, configurer et plus encore ...
Parfois, vous pouvez trouver que 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 le ferais en dernier recours
taskkill /pid [pid number] /f
Voici la commande Windows 10 pour démarrer la restauration du système à l'aide de batch:
sc config swprv start= Auto
Vous pouvez aussi aimer ces commandes:
Modifier la valeur de registre pour démarrer automatiquement la restauration du système
REG AJOUTEZ "HKLM\LOGICIEL\Microsoft\Windows NT\CurrentVersion\SystemRestore"/v DisableSR/t REG_DWORD/d 0/f
Créer un point de restauration système
Wmic.exe/Espace de noms:\root\default Chemin SystemRestore Appelez CreateRestorePoint "djibe a sauvegardé votre PC", 100, 12
Modifier l'utilisation du disque de restauration du système
vssadmin redimensionner shadowstorage/for = C:/on = C:/maxsize = 10%
Prendre plaisir
J'écris un service Windows en C #, la boucle d'arrêt/désinstallation/construction/installation/démarrage est devenue trop fatigante. A écrit un mini-script, l'a appelé reploy.bat
et l'a déposé dans mon répertoire de sortie Visual Studio (celui qui contient l'exécutable de service intégré) pour automatiser la boucle.
Il suffit de mettre 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 le service exécutable à partir de la construction
REMARQUE: Ceci doit être exécuté à partir de la ligne de commande de 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 :)