définition de ERRORLEVEL sur 0

14

J'ai un fichier batch qui est un wrapper autour d'un programme d'installation. Ce fichier de commandes vérifie le niveau d'erreur renvoyé par le programme d'installation et s'imprime en conséquence.

J'ai remarqué que si j'exécute set ERRORLEVEL=0dans une invite de commande juste avant de lancer le fichier de commandes (dans la même fenêtre de commande / environnement), le programme d'installation ne joue jamais avec le niveau d'erreur et mon script de commandes retourne toujours passé. Je suppose que %ERRORLEVEL%c'est une variable définie par Windows et est utilisée spécifiquement pour imprimer les erreurs des programmes et des scripts et que l'utilisation de la variable dans un fichier de commandes ou autre serait `` à vos risques et périls '' car elle pourrait être modifiée à tout moment par un autre processus.

D'après ce que cela semble être, lorsque je définit errorlevel dans l'environnement donné, cela met fin en quelque sorte à 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 juste un comportement inattendu bizarre. Toute information sur le sujet serait grandement appréciée!

user972276
la source

Réponses:

14

Vous redéfinissez la variable système en variable normale. Lorsque vous effectuez cette opération, le système ne l'utilisera pas tant que la session de commande n'est pas fermée.

La meilleure façon serait d’utiliser

exit /b 0

dans un autre fichier de commandes et appelez-le à partir de votre script principal. Où le numéro 0 est votre recherche errorlevel. Soit cela, soit utilisez une commande qui réinitialise le errorlevelpour vous, comme echo, findstr etc.

Par exemple, les commandes suivantes seraient toutes définies ERRORLEVELsur 0 dans votre fichier de commandes:

VERIFY > nul

cmd /c "exit /b 0"

ver > nul     
TwirlMandarin
la source
2
Presque correct. Vous pouvez demander au "système" d'utiliser le NIVEAU D'ERREUR dynamique simplement en définissant une valeur définie par l'utilisateur à l'aide deset "errorlevel="
dbenham
Pourquoi Windows permet-il à quelqu'un de redéfinir une variable système en une variable normale? Les deux définitions existent-elles toujours, son écho juste et d'autres commandes de ce type pointent maintenant vers la normale? Ainsi, les programmes pourraient toujours mettre à jour la variable système, ce n'est tout simplement pas accessible via l'invite de commande?
user972276
1
"Soit cela, soit utilisez une commande qui réinitialise le niveau d'erreur pour vous, comme echo, findstr etc." La commande echo ne réinitialise pas la variable de niveau d'erreur.
entrée
Comme d'autres l'ont dit, si la errorlevel variable a été définie "manuellement" par l'utilisateur / batch avec "set errorlevel=0", la errorlevelvariable ne reflétera plus le code de sortie, mais vous pouvez toujours accéder au code de sortie avec if errorlevel do something.
Kevin Fegan
(1) Une question plus générale est «Comment puis-je définir ERRORLEVEL sur une valeur arbitraire, telle que 42?»  cmd /c exit 42 semble être la meilleure réponse à cela. (2) Comme le  souligne dbenham , vous n'avez pas besoin du  /bou des guillemets.
Scott
12

Vous ne devez jamais attribuer votre propre valeur à des variables système dynamiques comme ERRORLEVEL, PATH, CD, DATE, TIME, etc. Cela empêchera le code de voir la valeur dynamique. Vous pouvez restaurer la valeur dynamique en définissant simplement la valeur définie par l'utilisateur. Par exemple:

set "errorlevel="

Si vous voulez forcer le errorlevel à 0, vous pouvez utiliser cette syntaxe totalement non-intuitive, mais très efficace: (call ). L'espace après l'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 commandes:

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%
dbenham
la source
8

J'utilise personnellement ceci:

cd .

Fonctionne même dans un shell Unix.

Andry
la source
Mais celui-ci pourrait être un peu plus rapide: type nul>nulparce que Process Monitor affiche les QueryDirectoryappels sur cd .PS: cd .a un autre effet secondaire agréable dans le shell unix. Il restaure le répertoire de travail recréé dans le terminal s'il a été ouvert avant l'effacement.
Andry
2

Voici quelques autres façons de réinitialiser l' ErrorLevelétat, qui fonctionnent 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 fonctionnent uniquement dans MS-DOS:

command /? > nul

fc nul nul > nul

Par souci d'exhaustivité, cela définit l' ErrorLevelétat sur 1, valide pour Windows et MS-DOS:

< nul find ""
aschipfl
la source
1

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.

Richard Meadows
la source
0

Ceux-ci fonctionneront également: (Définit le niveau d'erreur à 1)

Méthode 1

color 00

Méthode 2

echo A | find "B"

Vous pouvez également l'utiliser pour définir le niveau d'erreur 1-26:

echo Your errorlevel<sup>th</sup> character between A-Z | choice /c:Enter A-Z here /n
Wasif Hasan
la source