.bat中的IF,CALL,EXIT和%ERRORLEVEL%

时间:2014-07-21 13:36:42

标签: windows batch-file

任何人都可以帮助我了解%ERRORLEVEL%变量的行为以及为什么在CALLIF之后没有设置它,即 {{1} 行?

ECHO %ERRORLEVEL%.2

STDOUT

@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

但是,如果没有C:\Users\Ilya.Kozhevnikov\Dropbox>foo.bat Environment variable ERRORLEVEL not defined 0.0 0.1 0.2 42.3 IF变量会按预期设置。

%ERRORLEVEL%

STDOUT

@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

2 个答案:

答案 0 :(得分:8)

当cmd解析器读取一行或一行(括号内的代码)时,所有变量读取都将替换为变量中的值开始执行代码之前。如果块中代码的执行改变了变量的值,则不能从同一块内部看到该值,因为对变量的读操作不存在,它被替换为变量中的值

要解决此问题,您需要启用延迟扩展,并在需要时将语法从%var%更改为!var!,向解析器指示读取操作需要延迟执行命令。

@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 :(得分:1)

MC ND已经很好地回答了这个问题。

以下是另一个代码,显示了 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在setset /?

之后的命