2010-12-06 4 views
30

Juste tombé dans une chose étrange avec % ERRORLEVEL% et voulu 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 des instructions if ne définissent pas la variable % ERRORLEVEL%. Le ERRORLEVEL (comme dans IF ERRORLEVEL 1, qui est différent de IF% ERRORLEVEL% EQU 1) contrôle semble fonctionner toujours bien, donc je ne peux probablement travailler autour d'elle, mais il serait encore agréable d'être capable d'imprimer le niveau d'erreur. Pour le débogage ou autre chose.ERRORLEVEL inside IF

@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 que dans un fichier de commandes et en cours d'exécution, il produit cette sortie:

C:\Users\username\Documents\work>test.bat 
OUTSIDE_IF 1 
'ThisWillSetErrorLevelTo9009ieNotRecognizedCommand' is not recognized as an internal or external command, 
operable program or batch file. 
OUTSIDE_IF 1 
'ThisWillSetErrorLevelTo9009ieNotRecognizedCommand' is not recognized as an internal or external command, 
operable program or batch file. 
INSIDE_IF ERRORLEVEL 9009 
INSIDE_IF2 ERRORLEVEL GREQ 1 9009 
OUTSIDE_IF ERRORLEVEL 1 

articles pertinents:

+0

Désolé, raté votre lien –

Répondre

33

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! 
) 
+3

Wow, merci. Cela fonctionne et même l'explique. Pour référence, quelques liens que j'ai trouvé à ce sujet: http://batcheero.blogspot.com/2007/06/how-to-enabledelayedexpansion.html | http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/setlocal.mspx?mfr=true – Srekel