IF语句中的ERRORLEVEL

43
刚刚遇到一个奇怪的问题,涉及到%ERRORLEVEL%,想知道是否有人知道原因,并且是否有办法修复。基本上,似乎在if语句内执行的命令不会设置%ERRORLEVEL%变量。不过,ERRORLEVEL(例如IF ERRORLEVEL 1,与IF %ERRORLEVEL% EQU 1不同)的检查似乎仍然正常工作,所以我可能可以绕过这个问题,但是能够打印错误级别仍然是很好的。用于调试或其他目的。
@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

将其放入批处理文件并运行,将产生以下输出:
C:\Users\username\Documents\work>test.bat OUTSIDE_IF 1 'ThisWillSetErrorLevelTo9009ieNotRecognizedCommand'不被识别为内部或外部命令、可操作的程序或批处理文件。 OUTSIDE_IF 1 'ThisWillSetErrorLevelTo9009ieNotRecognizedCommand'不被识别为内部或外部命令、可操作的程序或批处理文件。 INSIDE_IF ERRORLEVEL 9009 INSIDE_IF2 ERRORLEVEL GREQ 1 9009 OUTSIDE_IF ERRORLEVEL 1
相关文章:
- ERRORLEVEL不是%ERRORLEVEL% - 在批处理文件中测试特定错误级别(69576)
2个回答

52

尝试在批处理文件开头使用 setlocal enabledelayedexpansion,并在 IF 内部使用 !ERRORLEVEL!。 这对我似乎起作用:

@echo off
setlocal enabledelayedexpansion
dir nul
echo %ERRORLEVEL%
if .1.==.1. (
  urklbkrlksdj - not a command
  echo %ERRORLEVEL%
  echo !ERRORLEVEL!
)

7
哇,谢谢。这很有用,而且甚至解释得很清楚。供参考,以下是我找到的一些链接: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
6
这种时刻让你明白为什么Linux用户鄙视Windows。你不会相信我在那个看似简单的小问题上浪费了多少时间。 - Przemek D

2

if errorlevel 可以在没有延迟扩展的情况下工作,但其工作方式类似于

if %errorlevel% <= Some_Value ...

@echo off

::sets errorlevel to 0
(call )
if "1" == "1" (
    rem sets errorlevel to 5
    cmd /c exit 5
    if errorlevel 4 echo this will be printed
    if errorlevel 5 echo this will be printed
    rem :::: you can use this ::::::::::::::
    if errorlevel 5 if not errorlevel 6 echo this will be printed ONLY when the errorlevel is 5
    rem :::::::::::::::::::::::::::::::::::::
    if errorlevel 6 echo this will not be printed

)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接