概念

在cmd环境中,大多数内部命令都至少有两个errorlevel,正常执行为0,执行出错为1,在比较复杂的命令中才会将错误情况进行分级处理,出现2,3,4,255等errorlevel.

ERRORLEVEL与%ERRORLEVLE%的区别

IF ERRORLEVEL 1表示errorlevel大于或等于1,因此出现错误1,2,3,4均符合IF ERRORLEVEL 1的条件,而IF %ERRORLEVEL%==1仅表示errorlevel等于1.

%ERRORLEVEL%可以使用其他的条件表达式如:

EQU - 等于

NEQ - 不等于

LSS - 小于

LEQ - 小于或等于

GTR - 大于

GEQ - 大于或等于

注意事项

当命令返回结果有多个返回值的时候,ERRORLEVEL要按从大到小的顺序排列。如:

    IF ERRORLEVEL 4 IF NOT ERRORLEVEL 5 ECHO 错误4
    IF ERRORLEVEL 3 ECHO 错误3
    IF ERRORLEVEL 2 ECHO 错误2
    IF ERRORLEVEL 1 ECHO 错误1
    IF ERRORLEVEL 0 ECHO 成功

举例说明

如常见的ping命令,当ping成功后errorlevel值为0,失败的话为1,如果按ctrl-c的话值为-1073741510,其他的返回结果没尝试过,有兴趣的话可以自己试试!

@echo off
    title CMD环境中ERRORLEVLE和%ERRORLEVEL%的区别
    color 02
    echo 一般CMD内置命令ERRORLVELE的返回值为0和1,较复杂的命令返回值会为0-255之间的数值!
    echo =========以ping命令作为实例演示=========
    ping -n 2 127.0.0.1
    echo --------------
    rem 此时ERRORLEVEL的值为0
    echo 此时的ERRORLEVEL值为:"%ERRORLEVEL%"

    ping -n 2 192.192.192.192
    echo --------------
    rem 此时ERRORLEVEL的值为1
    echo 此时的ERRORLEVEL值为:%ERRORLEVEL%;
    pause
    再写个比较实际的例子,如果服务器ping不通网关,就重启服务器(实际生产环境不要这么干哦!)
    @echo off
    ::setlocal enabledelayedexpansion 
    title ping检测失败,重启服务器脚本
    color 02
    echo 每隔1分钟进行一次ping检测

    :ping_check
    set curtime=%date:~0,4%%date:~5,2%%date:~8,2%_%time:~0,2%:%time:~3,2%:%time:~6,2%
    ping 10.128.96.1
    IF ERRORLEVEL 1 goto check_failed
    IF ERRORLEVEL 0 goto check_successful

    :check_successful
    echo 服务器在%curtime%进程ping检测,返回结果成功! >> ./result.log
    timeout /t 60 
    goto ping_check

    :check_failed
    echo 服务器在%curtime%进程ping检测,返回结果失败! >> ./result.err
    rem shutdown /r /t 60  /c "ping检测失败,自动重启服务器 >> ./result.err