2014-07-21 5 views
5

Kann jemand mir bitte helfen, das Verhalten von %ERRORLEVEL% Variable zu verstehen und warum es nicht nach einer CALL gesetzt wird, während im Inneren eines IF zu sein, das heißt die ECHO %ERRORLEVEL%.2 Linie?IF, CALL EXIT und% Error-% in einer .bat

@ECHO OFF 
SET ERRORLEVEL 
VERIFY > NUL 

ECHO %ERRORLEVEL%.0 
IF ERRORLEVEL 1 ECHO SNAFU 

IF %ERRORLEVEL% == 0 (
    ECHO %ERRORLEVEL%.1 
    CALL :FOO 
    ECHO %ERRORLEVEL%.2 
    IF ERRORLEVEL 42 ECHO 42.3 
) 

GOTO :EOF 

:FOO 
    EXIT /B 42 
GOTO :EOF 

STDOUT

C:\Users\Ilya.Kozhevnikov\Dropbox>foo.bat 
Environment variable ERRORLEVEL not defined 
0.0 
0.1 
0.2 
42.3 

jedoch ohne die IF%ERRORLEVEL% Variable gesetzt ist, wie erwartet.

@ECHO OFF 
SET ERRORLEVEL 
VERIFY > NUL 

ECHO %ERRORLEVEL%.0 
IF ERRORLEVEL 1 ECHO SNAFU 

REM IF %ERRORLEVEL% == 0 (
    ECHO %ERRORLEVEL%.1 
    CALL :FOO 
    ECHO %ERRORLEVEL%.2 
    IF ERRORLEVEL 42 ECHO 42.3 
REM) 

GOTO :EOF 

:FOO 
    EXIT /B 42 
GOTO :EOF 

STDOUT

C:\Users\Ilya.Kozhevnikov\Dropbox>foo.bat 
Environment variable ERRORLEVEL not defined 
0.0 
0.1 
42.2 
42.3 
+0

möglich Duplikat [Windows-Batch innerhalb IF nicht funktioniert SET] in einem Befehlszeilenfenster gelesen werden kann (http : //stackoverflow.com/questions/9102422/windows-batch-set-inside-if-not-working) – Laf

+0

Siehe die Frage, die ich als ein Duplikat markiert habe. Dies erklärt genau, was mit Ihrem Skript passiert und was Sie tun müssen, um das Problem zu beheben. – Laf

Antwort

8

Wenn die CMD-Parser eine Zeile oder einen Block von Linien (der Code in der Klammer) lautet, werden alle variablen Lesevorgänge werden mit dem Wert in der Variable ersetzt, bevor beginnt den Code auszuführen. Wenn die Ausführung des Codes im Block den Wert der Variablen ändert, kann dieser Wert nicht innerhalb desselben Blocks angezeigt werden. Da die Leseoperation für die Variable nicht existiert, wurde sie durch den Wert in der Variablen

ersetzt

Um dies zu lösen, müssen Sie die verzögerte Erweiterung aktivieren und bei Bedarf die Syntax von %var% in !var! ändern, um dem Parser anzuzeigen, dass die Leseoperation bis zur Ausführung des Befehls verzögert werden muss.

@ECHO OFF 

setlocal enabledelayedexpansion 

SET ERRORLEVEL 
VERIFY > NUL 

ECHO %ERRORLEVEL%.0 
IF ERRORLEVEL 1 ECHO SNAFU 

IF %ERRORLEVEL% == 0 (
    ECHO !ERRORLEVEL!.1 
    CALL :FOO 
    ECHO !ERRORLEVEL!.2 
    IF ERRORLEVEL 42 ECHO 42.3 
) 

GOTO :EOF 

:FOO 
    EXIT /B 42 
GOTO :EOF 
+1

Danke, war mir der '' '' Syntax nicht bewusst. –

1

MC ND beantwortete die Frage bereits gut.

Hier ist ein alternativer Code, der beides zeigt: erweiterte und verzögerte Erweiterung von ERRORLEVEL.

@ECHO OFF 
SETLOCAL ENABLEDELAYEDEXPANSION 
VERIFY > NUL 

ECHO !ERRORLEVEL!.0 delayed 
ECHO %ERRORLEVEL%.0 expanded 
IF ERRORLEVEL 1 ECHO SNAFU 

IF !ERRORLEVEL! == 0 (
    ECHO !ERRORLEVEL!.1 delayed 
    ECHO %ERRORLEVEL%.1 expanded 
    CALL :FOO 
    ECHO !ERRORLEVEL!.2 delayed 
    ECHO %ERRORLEVEL%.2 expanded 
) 
ENDLOCAL 
GOTO :EOF 

:FOO 
    EXIT /B 42 
GOTO :EOF 

Microsoft beschreibt das Verhalten der verzögerten Expansion in Hilfe des Befehls set, die nach der Eingabe set /? oder help set

Verwandte Themen