首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.bat中的IF、调用、退出和%ERRORLEVEL%

.bat中的IF、调用、退出和%ERRORLEVEL%
EN

Stack Overflow用户
提问于 2014-07-21 13:36:41
回答 2查看 17.1K关注 0票数 9

谁能帮我理解一下%ERRORLEVEL%变量的行为,以及为什么在IF (即IF行)中没有在CALL之后设置它?

代码语言:javascript
复制
@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

代码语言:javascript
复制
C:\Users\Ilya.Kozhevnikov\Dropbox>foo.bat
Environment variable ERRORLEVEL not defined
0.0
0.1
0.2
42.3

但是,如果没有IF,则按预期设置%ERRORLEVEL%变量。

代码语言:javascript
复制
@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

代码语言:javascript
复制
C:\Users\Ilya.Kozhevnikov\Dropbox>foo.bat
Environment variable ERRORLEVEL not defined
0.0
0.1
42.2
42.3
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2014-07-21 13:47:45

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

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

代码语言:javascript
复制
@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
票数 12
EN

Stack Overflow用户

发布于 2014-07-21 13:57:35

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

下面是显示这两种情况的替代代码:ERRORLEVEL的扩展和延迟扩展。

代码语言:javascript
复制
@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描述了在命令set的帮助下延迟展开的行为,在输入set /?help set后,可以在命令提示符窗口中读取该命令。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/24866477

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档