【问题标题】:IF, CALL, EXIT and %ERRORLEVEL% in a .bat.bat 中的 IF、CALL、EXIT 和 %ERRORLEVEL%
【发布时间】:2014-07-21 13:36:41
【问题描述】:

谁能帮我理解%ERRORLEVEL% 变量的行为,以及为什么它没有在CALL 之后设置在IF 内,即ECHO %ERRORLEVEL%.2 行?

@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% 变量将按预期设置。

@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

标准输出

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

【问题讨论】:

  • 查看我标记为重复的问题。这准确地解释了您的脚本发生了什么,以及您必须采取哪些措施来解决问题。

标签: windows batch-file


【解决方案1】:

当 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

【讨论】:

  • 谢谢,不知道!! 语法。
【解决方案2】:

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

微软在命令set的帮助中描述了延迟扩展的行为,可以在输入set /?help set后在命令提示符窗口中阅读

【讨论】:

    猜你喜欢
    • 2021-05-20
    • 2011-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-09
    • 1970-01-01
    • 2021-06-03
    相关资源
    最近更新 更多