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=0
dans 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!
&&
ou||
.Réponses:
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
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 leerrorlevel
pour vous, comme echo, findstr etc.Par exemple, les commandes suivantes seraient toutes définies
ERRORLEVEL
sur 0 dans votre fichier de commandes:la source
set "errorlevel="
errorlevel
variable a été définie "manuellement" par l'utilisateur / batch avec"set errorlevel=0"
, laerrorlevel
variable ne reflétera plus le code de sortie, mais vous pouvez toujours accéder au code de sortie avecif errorlevel do something
.cmd /c exit 42
semble être la meilleure réponse à cela. (2) Comme le souligne dbenham , vous n'avez pas besoin du/b
ou des guillemets.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:
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.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:
Ou si sur la ligne de commande, vous pouvez utiliser
la source
J'utilise personnellement ceci:
cd .
Fonctionne même dans un shell Unix.
la source
type nul>nul
parce que Process Monitor affiche lesQueryDirectory
appels surcd .
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.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):Les méthodes suivantes fonctionnent uniquement dans MS-DOS:
Par souci d'exhaustivité, cela définit l'
ErrorLevel
état sur1
, valide pour Windows et MS-DOS:la source
C'est la seule chose que j'ai trouvée qui fonctionne.
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.
la source
Ceux-ci fonctionneront également: (Définit le niveau d'erreur à 1)
Méthode 1
Méthode 2
Vous pouvez également l'utiliser pour définir le niveau d'erreur 1-26:
la source