Lot de Programmation, de gestion des Erreurs, et la Commande de Démarrage
Je commence tout juste à apprendre à écrire le script. J'essaie de comprendre comment le système gère les Niveaux d'Erreur et comment ils peuvent être utilisés dans le traitement des erreurs. Je sais qu'il existe une différence entre la variable d'environnement %ERRORLEVEL% et le Niveau d'Erreur du système. Si je comprends bien, puis le
If ERRORLEVEL 1
code permettrait de contrôler la variable d'environnement avant qu'il vérifie le niveau d'erreur de la commande précédente.
Donc, dans mon programme, je suis en train de l'interface de démarrage/arrêt script de démarrage/arrêt tous les scripts d'une machine (pour les tests, je suis juste en utilisant une seule application notepad.exe à titre d'exemple). J'ai deux scripts wrapper qui va démarrer ou arrêter les applications en passant des arguments au script indépendants. Si il y a une erreur dans le script, il va mettre le niveau à l'aide de la
EXIT /B n
de commande. Une fois que le contrôle est retourné à l'appel de script, il ira à une erreur de manipulation script, si l'état de sortie est non nul.
Au début, j'étais réglage de l' %ERRORLEVEL% à zéro manuellement, puis de le tester pour un message d'erreur après un DÉBUT ou la commande TASKKILL. Mais ensuite j'ai lu que la compensation %ERRORLEVEL% avec
SET ERRORLEVEL=
est une meilleure méthode. Mon problème vient quand je tente de démarrer l'application avec
START "" notepad.exe
Chaque fois que je test la variable errorlevel après cette commande, il est toujours supérieur ou égal à 1, sauf si j'utilise DÉFINIR ERRORLEVEL=0 avant de m'exécuter la commande de démarrage. J'ai inséré le code pour les quatre scripts ci-dessous. Tout aperçu et des conseils seraient grandement appréciés.
appstart.chauve-souris:
@echo off
:: Script for application Start
set ERRORLEVEL=
:: ****
:: Additional Batch files will be executed from within this file
:: Example:
:: Call Appbat01.bat
:: The called batch file should set ERRORLEVEL non-zero if error
:: ****
call test.bat -start
if ERRORLEVEL 1 (call error.bat)
echo.
echo Control was returned to appstart.bat...
:: **** End Calls
goto end
:end
appstop.chauve-souris:
@echo off
:: Script for application Start
set ERRORLEVEL=
:: ****
:: Additional Batch files will be executed from within this file
:: Example:
:: Call Appbat01.ba
:: The called batch file should set ERRORLEVEL non-zero if error
:: ****
call test.bat -stop
if ERRORLEVEL 1 (call error.bat)
echo.
echo Control was returned to appstop.bat...
:: **** End Calls
goto end
:end
test.chauve-souris:
@echo off
if "%1"=="-start" goto :start
if "%1"=="-stop" goto :stop
goto wrongParams
:start
::****
:: Insert start up stripts here...
:: If there is an error, set ERRORLEVEL=1
::****
set ERRORLEVEL=0
echo.
echo ********
echo starting the service...
echo.
::start "" "C:\Program Files\Microsoft Office\office11\winword.exe"
start notepad.exe
if ERRORLEVEL 1 goto error
qprocess notepad.exe
echo *Start.success* ERRORLEVEL is: %ERRORLEVEL%
echo.
goto end
:stop
::****
:: Insert stopping stripts here...
:: If there is an error, set ERRORLEVEL>1
::****
set ERRORLEVEL=0
echo.
echo ********
echo stopping the service...
echo.
qprocess notepad.exe
taskkill /f /im notepad.exe
if ERRORLEVEL 1 goto noProcess
goto end
:noProcess
set ERRORLEVEL=2
echo *noProcess* ERRORLEVEL is now: %ERRORLEVEL%
echo.
exit /b 2
:error
:: Errorhandler. Log application status and cause of error here. Set
:: ERRORLEVEL > 1 before returning to caller.
set ERRORLEVEL=1
echo.
echo **** Error handler inside test.bat ****
echo.
echo *error* ERRORLEVEL is now: %ERRORLEVEL%
echo.
exit /b 1
:wrongParams
:: Output an error if the wrong parameters were passed to this script.
:: Maybe try to self correct the parameter...
set ERRORLEVEL=1
echo.
echo '%1' is an invalid parameter.
echo Usage: %0 [-stop ^| -start]
echo *wrongParams* ERRORLEVEL is now: %ERRORLEVEL%
echo.
exit /b 1
:end
erreur.chauve-souris:
@echo off
echo **** You have reached error.bat ****
echo ERRORLEVEL inside of error.bat is: %ERRORLEVEL%
echo.
::*** Handle error...***
goto error%ERRORLEVEL%
:error2
echo The process could not be stopped for some reason.
goto end
:error1
echo The process had an error in start up.
::*** ***
goto end
:end
- Si vous exécutez le code, c'est là où j'obtiens un message d'erreur. Si j'utilise début, il déclenche le bloc-notes très bien sans aucune erreur. Si j'utilise l'arrêter, il s'arrête le bloc-notes, sans erreurs. Si j'utilise l'arrêter de nouveau, il renvoie une erreur comme prévu. Maintenant, si j'utilise démarrer, il devrait démarrer le bloc-notes, sans erreurs à nouveau. Toutefois, si l'instruction après la commande de DÉMARRAGE est vrai et il va à une erreur. Je ne suis pas sûr de savoir pourquoi cela se passe. S'il vous plaît aider!
Vous devez vous connecter pour publier un commentaire.
Vous ne devriez jamais mettre la %errorlevel% variable. Vous avez raison qu'il y a une différence; Le niveau que vous obtenez à partir d'une sortie de processus est un registre interne que vous pouvez lire avec le %errorlevel% de la syntaxe. Toutefois, si vous créez une variable nommée ERRORLEVEL, il masque le registre interne et vous perdez l'accès aux codes de sortie.
Si vous avez besoin de régler le niveau d'inscrire à une valeur spécifique, vous pouvez le faire avec la commande suivante:
Cela va lancer un processus qui se termine immédiatement avec le code désiré.