Board logo

标题: [讨论] "errorlevel" 你知多少?--------应用实例 [打印本页]

作者: dosz     时间: 2006-2-18 07:05    标题: [讨论] "errorlevel" 你知多少?--------应用实例

[讨论] "errorlevel" 你知多少?--------应用实例
要求:
1.添加注解, 用REM:或 ::
2.说明通过的测试环境

用法:IF [NOT] ERRORLEVEL 错误返回代号 命令 [命令参数]
意义:如果错误返回代号[不]大于或等于指定的代号将执行某个命令。
其中,ERRORLEVEL表示错误返回代号,很有用。对于很多DOS命令,由于执行的结果不同(如执行成功,执行失败,或被用户中断等),这些命令会返回不同的代号,以表示不同的结果。IF ERRORLEVEL命令就根据这个不同结果而产生的不同代号来执行不同的命令,通常用在某条命令之后。如IF ERRORLEVEL 1 ECHO OK!表示如果当前的错误返回代号大于或等于1时将在屏幕上显示“OK!”的字样。
作者: sxhc6868     时间: 2006-2-18 19:11
好贴子,顶,基础的技术性贴子就要顶!
作者: dosz     时间: 2006-2-18 20:56
@echo off
copy C:\BOOT.INI>nul
: :在CMD中都是用echo %errorlevel%来获得错误返回码
echo 获得错误返回码为%errorlevel%
pause

if errorlevel 1 echo 1执行失败
if errorlevel 0 echo 0执行成功

pause
exit
===============================
作者: willsort     时间: 2006-2-20 14:23
Re dosz:

      建议兄将3楼的例程修改一下,以免使一些初学者迷惑:
@echo off
copy C:\BOOT.INI>nul
:: 在CMD中都是用echo %errorlevel%来获得错误返回码
echo 获得错误返回码为%errorlevel%
pause

if errorlevel 1 echo "errorlevel >= 1"
if errorlevel 0 echo "errorlevel >= 0"

if errorlevel 1 goto fail
echo 程序执行成功,继续
echo.
goto end

:fail
echo 程序执行失败,退出!
echo.
goto end

:end
pause
exit

作者: dosz     时间: 2006-2-25 12:02
谢谢版主,我是在学习错误返回码,你给我指点我非常高兴.
:: 问题:为什么程序执行失败时,为同时显示"errorlevel >= 1"和"errorlevel >= 0"
:: 我不明白.所以我用了   if errorlevel 1 echo 1执行失败
                                  if errorlevel 0 echo 0执行成功   来区别

[ Last edited by dosz on 2006-2-25 at 12:08 ]
作者: willsort     时间: 2006-2-25 14:00
Re dosz:

      这是很正常的,因为你在主楼中也提到了 if errorlevel 的比较方式是“大于或等于”。而如果一个执行出错,通常会返回一个非0的错误号,同时因为DOS是以无符号整型数的方式处理错误号的,所以非0也即大于0,也即大于等于1的证书,那么 if errorlevel 1 和 if errorlevel 0 的条件当然都会被满足。

      而至于 DOS 命令的错误返回码为何通常会是正常执行为0,出现错误后非0,与一些高级语言恰好相反。那是因为 DOS 命令往往需要根据错误类型对错误进行分类处理,而0只有一个序号,不能表达多种错误类型,所以只有分配给正常执行的情况。而在那些高级语言的编程环境中恰好相反,往往需要将正确执行的结果进行分类处理,而错误情况只需要直接抛给专属错误处理模块即可。
作者: dosz     时间: 2006-2-25 17:33
errorlevel 的比较方式是“大于或等于”。
这个我以前好象没有想得那么周到,
不过经你提示,我再看DOS执行时理解了,
在此,感谢你百忙之中给我回复。

[ Last edited by dosz on 2006-2-25 at 17:59 ]
作者: 371770923     时间: 2007-5-29 15:29
if errorlevel好象还有这句用法(if "errorlevel"...... =????)具体的不怎么清楚
版主能不能介绍一下
作者: koala     时间: 2007-7-14 10:52    标题: 发一个我翻译的 errorleve(译本)l

Allenware.com 批处理图书馆
                  批处理命令返回的ERRORLEVELs报告
                     仅用于 Windows 95/98/ME

===版本

此文档是1.04版

可以在我们的网站上找到这个ERRORLEVELs当前最新版本:

          http://www.allenware.com/mcsw/errorlevels.zip


===坚决拒绝

此压缩包免费使用,并且他仅用于教育与学习用途.使用他完全是遵照你
个人的意愿,由此产生的问题由你自己负责.我们不担保此文件有可能给
您带来的损失.除非所有贵重数据已经安全的完成备份并且你知道怎样
进行恢复数据,否则请您决不要在电脑上测试使用.


===在批处理文件中使用 ERRORLEVELs

想要了解怎样进行测试的详细信息以及遵守章则和(我们免费提供的)批处理
命令返回的ERRORLEVEL值与交互式的批处理课程. 你可以通过以下地址了解
一下详细的课程提纲和课程索引:

            http://www.allenware.com/icsw/icswidx.htm


===Windows 95/98/ME 中的 ERRORLEVELs


大多数情况下普通外部命令操作返回的ERRORLEVEL值为0,并且这通常预示
着命令的运行并没有发生错误.在使用 FIND 的情况下,ERROELEVEL返回值
为0则预示着目标字符串已经发现(内存中表示为f0und),并且ERROELEVEL
返回值为1则预示着未发现目标字符串(内存中表示为m1ssing).以下列表
内容是通过外部程序运行反馈的ERRORLEVELs值的详细信息.
在 Windows 95/98/ME中,外部命令(既COMMAND.COM中的那些编码)则无须
更改当前ERRORLEVEL值.

注意: 命令名/? 除非另作说明,否则(使用在线帮助转到常规简短帮助)的
返回ERRORLEVEL值就为0.

注意:当命令行遇到一个未就绪的设备(可能会导致出现'中止,重试,失败'的信息)
你的回应(或者在COMMAND.COM /f/c自动提供的'失败-继续'命令解释器)
有时可能会影响到命令行预期返回的ERRORLEVEL值.


ATTRIB.EXE
(a) 未发现 目标文件/文件夹                         = ERRORLEVEL 1
(b) 命令行开关无效                                 = ERRORLEVEL 1
(c) 属性分配冲突 (目标文件未在使用)                = ERRORLEVEL 1
(d) 指明的驱动器无效                               = ERRORLEVEL 1
(e) 驱动器未就绪 (回复要么中止要么失败)            = ERRORLEVEL 1
(f) 输入的参数无效(或者错误)                       = ERRORLEVEL 1

CHOICE.COM
(a) 用于具有问答性的回复菜单, 并且回复菜单中的nn   = ERRORLEVEL nn
    (此问答性菜单跳转的批处理位置 = 由CHOICE返回的代码决定)
(b) 无效命令行开关                                 = ERRORLEVEL 255
(c) 无效的命令行语法开关                           = ERRORLEVEL 255
(d) 默认情况下超时选项不在回复菜单列               = ERRORLEVEL 255
(e) choice /?                                      = ERRORLEVEL 255

CSCRIPT.EXE
(a) 未发现脚本文件                                 = ERRORLEVEL 1
(b) 文件没有扩展的脚本引擎                         = ERRORLEVEL 1
(c) 没有扩展的脚本文件                             = ERRORLEVEL 1
(d) 驱动器未就绪                                   = ERRORLEVEL 1
    (这里没有'中止, 重试, 失败'等选择余地)

DELTREE.EXE
(a) 缺少必要的参数                                 = ERRORLEVEL 1
(b) 无效命令行开关                                 = ERRORLEVEL 1
(c) deltree /?                                     = ERRORLEVEL 1
(d) 预读取的驱动器为就绪 (回复:中止)               = ERRORLEVEL 18
    (注意: 如果失败则ERRORLEVEL的返回值为 0)

EXTRACT.EXE
(a) 无效命令行开关                                 = ERRORLEVEL 1

FC.EXE
(a) 大量的文件规范不足                             = ERRORLEVEL 1
(b) 命令行的文件名太长                             = ERRORLEVEL 1
(c) 属性分配冲突(并且中止回应)                     = ERRORLEVEL 5
    (注意: 如果失败则ERRORLEVEL的返回值为 0)
(d) 驱动器未就绪                                   = ERRORLEVEL 18
    (注意: 如果失败则ERRORLEVEL的返回值为 0)

FIND.EXE
(a) 目标字符串已发现(内存表示法=f0und)             = ERRORLEVEL 0
(b) 未发现目标字符串(内存表示法=m1ssing)           = ERRORLEVEL 1
(c) find /?                                        = ERRORLEVEL 1
(d) 参数格式不正确                                 = ERRORLEVEL 2
(e) 未发现指定搜索的文件                           = ERRORLEVEL 2
(f) 指定的文件正在使用(回复:失败)                  = ERRORLEVEL 2
(g) 驱动器未就绪(回复:失败)                        = ERRORLEVEL 2
(h) 指定的文件正在使用(回复:中止)                  = ERRORLEVEL 5
(i) 驱动器未就绪(回复:中止)                        = ERRORLEVEL 5

FORMAT.COM
(a) 驱动器未就绪                                   = ERRORLEVEL 4
    (这里没有'中止, 重试, 失败'等选择余地)

FTP.EXE
(a) 简短帮助 (使用: ftp -h 获得简短帮助)           = ERRORLEVEL 2
(b) 打开脚本文件时发生错误 (文件丢失)              = ERRORLEVEL 2
(c) 无效命令行开关                                 = ERRORLEVEL 2

KEYB.COM
(a) 无效命令行开关                                 = ERRORLEVEL 1
(b) 指定的键盘编码无效                             = ERRORLEVEL 1
(c) keyb /?                                        = ERRORLEVEL 1

MEM.EXE
(a) 无效命令行开关                                 = ERRORLEVEL 1

MODE.COM
(a) 无效的参数                                     = ERRORLEVEL 1
(b) 无效命令行开关                                 = ERRORLEVEL 1

MORE.COM
(a) 无效命令行开关  (MORE不接受命令行开关)         = ERRORLEVEL 1
(b) 驱动器未就绪(回复:中止)                        = ERRORLELEL 5
     (注意: 如果失败则ERRORLEVEL的返回值为 0)

MOVE.EXE
(a) 必要的参数丢失                                 = ERRORLEVEL 1
(b) 无法创建目标文件                               = ERRORLEVEL 1
(c) 无法打开源文件                                 = ERRORLEVEL 1

    (当你尝试着从一个驱动器的文件夹将文件移动到其他驱动器文件夹
     的时候你将会看到提示此信息.跟随DELTREE着,你需要使用 XCOPY /S,
     当 MOVE 未从一个文件夹操作移动到另一个文件夹的时候)

(d) 属性分配冲突(回复:失败)                        = ERRORLEVEL 1
    (注意: 在这种情况下, 文件仍然在复制(不是移动))
(e) 属性分配冲突(回复:中止)                        = ERRORLEVEL 5
    (注意: 在这种情况下, 文件仍然在复制(不是移动))
(f) 驱动器未就绪(回复:中止)                        = ERRORLEVEL 18
    (注意: 回复失败的情况下,通常ERRORLEVEL的值很少会返回 1)

PING.EXE
(a) 未知主机                                       = ERRORLEVEL 1
    (通常是指在'域名服务系统'未发现这个主机名字)
(b) 简短帮助(无须参数)                             = ERRORLEVEL 1
注意: 对于 使用 PING /? 开关获得简短帮助, ERRORLEVEL的返回值为 0
(c) 无效命令行开关                                 = ERRORLEVEL 1
    (然而简短帮助却会正常显示)
(d) 用 [Ctrl-C]打断批处理任务                     = ERRORLEVEL 255

SORT.EXE
(a) 无效命令行开关                                 = ERRORLEVEL 1
(b) 驱动器未就绪(回复:中止)                        = ERRORLEVEL 15
    (注意: 如果失败则ERRORLEVEL的返回值为 0)

START.EXE
(a) start /? (实模式)                              = ERRORLEVEL 1
(b) start /? (图形界面模式)                        = ERRORLEVEL 255
(c) START无法查找到指明的文件                      = ERRORLEVEL 255
(d) 指定的文件尚未关联                             = ERRORLEVEL 255
(e) 驱动器未就绪                                   = ERRORLEVEL 255
    (这里没有'中止, 重试, 失败'等选择余地)

SUBST.EXE
(a) 无效的参数                                     = ERRORLEVEL 1
(b) 无效命令行开关                                 = ERRORLEVEL 1
(c) 指定路径未发现                                 = ERRORLEVEL 1
(d) 驱动器未就绪(回复:中止)                       = ERRORLEVEL 21
    (注意: 回复失败的情况下,通常ERRORLEVEL的值很少会返回 1)

TRACERT.EXE
(a) 不能解析目标系统名                            = ERRORLEVEL 1
    (通常是指在'域名服务系统'未发现这个主机名字)
(b) 无效命令行开关                                 = ERRORLEVEL 1
(c) 简短帮助(无须参数)                             = ERRORLEVEL 1
(d) 用 [Ctrl-C]打断批处理任务                      = ERRORLEVEL 255
注意:想要获取TRACERT的简短帮助, 输入不带参数的命令行

XCOPY.EXE
(a) 未发现文件                                     = ERRORLEVEL 1
(b) 日期开关  /d  无效                             = ERRORLEVEL 4
(c) 无效的命令行参数                               = ERRORLEVEL 4
(d) 参数无效                                       = ERRORLEVEL 4
(e) 驱动器未就绪                                   = ERRORLEVEL 4
(f) 无法创建目录                                   = ERRORLEVEL 4
(g) 系统无法查找到指定文件                         = ERRORLEVEL 5
    (例如源文件指向NUL空设备的时候就会发生这种现象)


想要了解怎样进行测试的详细信息以及遵守章则和(我们免费提供的)批处理
命令返回的ERRORLEVEL值与交互式的批处理课程. 你可以通过以下地址了解
一下详细的课程提纲和课程索引:

            http://www.allenware.com/icsw/icswidx.htm

                  William 和 Linda Allen合著
         创造性的技术性著作 http://www.allenware.com/
        (c) 著作权(C) Allen与其公司 2005 - 版权所有(C)
作者: wordexport     时间: 2007-10-4 23:04
先顶一下.学到了
作者: soyo     时间: 2007-10-30 21:49
谢了
作者: hxwxyz     时间: 2007-10-31 19:10
学习了  谢谢
作者: 523066680     时间: 2008-8-19 16:23
好东西 不能沉了