Ce que j'ai est un fichier de commandes qui est un wrapper autour d'un installateur. Ce fichier de commandes vérifie le niveau d'erreur renvoyé par le programme d'installation et imprime en conséquence. J'ai remarqué que si j'exécute set ERRORLEVEL=0
dans une invite de commande juste avant de lancer le fichier de commandes (dans la même fenêtre de commande/le même environnement), le programme d'installation ne dérange jamais avec errorlevel et mon script de traitement par lots retourne toujours comme réussi. Je supposerais que% ERRORLEVEL% est une variable définie par des fenêtres utilisées spécifiquement pour afficher les erreurs de programmes et de scripts et que l'utilisation de la variable dans un fichier de commandes ou quelque chose d'autre serait "à vos risques et périls" car elle pourrait être modifiée à tout moment. par un autre processus. À partir de ce que cela ressemble, lorsque je définis errorlevel dans un environnement donné, il met alors fin à l'utilisation de errorlevel en tant que détenteur du code de sortie. Quelqu'un sait pourquoi c'est comme cela? Pour moi, c'est un comportement étrange et inattendu. Toute information sur le sujet serait grandement appréciée!
Vous redéfinissez la variable système en une variable normale. Dans ce cas, le système ne l'utilisera pas tant que la session de commande n'aura pas été fermée.
Le meilleur moyen serait d'utiliser
sortie/b 0
dans un autre fichier batch et appelez-le à partir de votre script principal. Où le nombre 0 est votre niveau d'erreur recherché. Soit ça, soit utilisez une commande qui réinitialise le niveau d'erreur pour vous, telle que echo, findstr, etc.
Par exemple, les commandes suivantes définiraient toutes ERRORLEVEL sur 0 dans votre fichier de traitement par lots:
VERIFY > nul
cmd /c "exit /b 0"
ver > nul
Vous ne devez jamais attribuer votre propre valeur à des variables système dynamiques telles que ERRORLEVEL, PATH, CD, DATE, TIME, etc. Cela empêchera le code de voir la valeur dynamique. Vous pouvez restaurer la valeur dynamique en annulant simplement la valeur définie par l'utilisateur. Par exemple:
set "errorlevel="
Si vous voulez forcer le niveau d'erreur à 0, vous pouvez utiliser cette syntaxe totalement non intuitive, mais très efficace: (call )
. L'espace après appel est critique. Si vous souhaitez définir le niveau d'erreur sur 1, vous pouvez utiliser (call)
. Il est essentiel qu'il n'y ait pas d'espace après l'appel.
(call)
echo %errorlevel%
(call )
echo %errorlevel%
Une méthode plus intuitive, mais moins pratique, pour définir le niveau d'erreur consiste à utiliser un sous-programme dédié dans un fichier de traitement par lots:
call :setErr 1
echo %errorlevel%
call :setErr 0
echo %errorlevel%
exit /b
:setErr
exit /b %1
Ou si sur la ligne de commande, vous pouvez utiliser
cmd /c exit 1
echo %errorlevel%
cmd /c exit 0
echo %errorlevel%
Personnellement, j'utilise ceci:
cd .
Fonctionne même dans unix Shell.
C'est la seule chose que j'ai trouvée qui fonctionne.
call (exit/b 0)
J'en avais besoin dans un script qui utilise un script tiers qui détecte ERRORLEVEL, mais ne réinitialise pas correctement le niveau d'erreur.
Voici d'autres manières de réinitialiser l'état ErrorLevel
, qui fonctionne même sous MS-DOS (au moins pour la version 6.22):
more < nul > nul
rem // The `> nul` part can be omitted in Windows but is needed in MS-DOS to avoid a line-break to be returned:
sort < nul > nul
Les méthodes suivantes ne fonctionnent que sous MS-DOS:
command /? > nul
fc nul nul > nul
Par souci d'exhaustivité, ceci définit l'état ErrorLevel
sur 1
, valide pour Windows et MS-DOS:
< nul find ""