web-dev-qa-db-fra.com

mettre ERRORLEVEL à 0

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!

11
user972276

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     
10
TwirlMandarin

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%
10
dbenham

Personnellement, j'utilise ceci:

cd .

Fonctionne même dans unix Shell.

5
Andry

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.

1
Richard Meadows

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 ""
0
aschipfl