web-dev-qa-db-fra.com

ERRORLEVEL dans IF

Je suis juste tombé sur une chose étrange avec %ERRORLEVEL% et je voulais voir si quelqu'un sait pourquoi et s'il y a un moyen de le réparer. Essentiellement, il semble que les commandes exécutées à l'intérieur si les instructions ne définissent pas le %ERRORLEVEL% variable. Le ERRORLEVEL (comme dans IF ERRORLEVEL 1, qui est différent de IF %ERRORLEVEL% EQU 1) check semble toujours fonctionner correctement, donc je peux probablement le contourner, mais ce serait toujours agréable de pouvoir imprimer le niveau d'erreur. Pour le débogage ou autre.

@echo off
Set TESTVAR=1

tasklist | find /I "IsntRunning.exe" > NUL
echo OUTSIDE_IF %ERRORLEVEL%

ThisWillSetErrorLevelTo9009ieNotRecognizedCommand

tasklist | find /I "IsntRunning.exe" > NUL
echo OUTSIDE_IF %ERRORLEVEL%

ThisWillSetErrorLevelTo9009ieNotRecognizedCommand

IF %TESTVAR% EQU 1 (
    Set ERRORLEVEL=
    tasklist | find /I "IsntRunning.exe" > NUL
    echo INSIDE_IF  ERRORLEVEL %ERRORLEVEL%

    IF ERRORLEVEL 1 (
        echo INSIDE_IF2  ERRORLEVEL GREQ 1 %ERRORLEVEL%
    )
    IF ERRORLEVEL 2 (
        echo INSIDE_IF2  ERRORLEVEL GREQ 2 %ERRORLEVEL%
    )
    IF ERRORLEVEL 3 (
        echo INSIDE_IF2  ERRORLEVEL GREQ 3 %ERRORLEVEL%
    )
)

tasklist | find /I "IsntRunning.exe" > NUL
echo OUTSIDE_IF ERRORLEVEL %ERRORLEVEL%

@echo on

Mettre cela dans un fichier de commandes et l'exécuter produit cette sortie:

C:\Utilisateurs\nom d'utilisateur\Documents\work> test.bat
EXTÉRIEUR_IF 1
"ThisWillSetErrorLevelTo9009ieNotRecognizedCommand" n'est pas reconnu comme une commande interne ou externe, un programme utilisable ou un fichier de commandes.
EXTÉRIEUR_IF 1
"ThisWillSetErrorLevelTo9009ieNotRecognizedCommand" n'est pas reconnu comme une commande interne ou externe, un programme utilisable ou un fichier de commandes.
INSIDE_IF ERRORLEVEL 9009
INSIDE_IF2 ERRORLEVEL GREQ 1 9009
OUTSIDE_IF ERRORLEVEL 1

Articles pertinents:

35
Srekel

Essayez d'utiliser setlocal enabledelayedexpansion au début de votre fichier de commandes, et !ERRORLEVEL! dans votre IF. Cela semble fonctionner pour moi:

@echo off
setlocal enabledelayedexpansion
dir nul
echo %ERRORLEVEL%
if .1.==.1. (
  urklbkrlksdj - not a command
  echo %ERRORLEVEL%
  echo !ERRORLEVEL!
)
43
Jim Davis