中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS启动盘 & LOGO技术 (启动盘室) » [讨论] "errorlevel" 你知多少?--------应用实例
作者:
标题: [讨论] "errorlevel" 你知多少?--------应用实例 上一主题 | 下一主题
dosz
中级用户

一看二跟三动手


积分 396
发帖 188
注册 2005-10-23
来自 上海
状态 离线
『楼 主』:  [讨论] "errorlevel" 你知多少?--------应用实例

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

用法:IF [NOT] ERRORLEVEL 错误返回代号 命令 [命令参数]
意义:如果错误返回代号[不]大于或等于指定的代号将执行某个命令。
其中,ERRORLEVEL表示错误返回代号,很有用。对于很多DOS命令,由于执行的结果不同(如执行成功,执行失败,或被用户中断等),这些命令会返回不同的代号,以表示不同的结果。IF ERRORLEVEL命令就根据这个不同结果而产生的不同代号来执行不同的命令,通常用在某条命令之后。如IF ERRORLEVEL 1 ECHO OK!表示如果当前的错误返回代号大于或等于1时将在屏幕上显示“OK!”的字样。

2006-2-18 07:05
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
sxhc6868
初级用户





积分 50
发帖 19
注册 2006-2-15
状态 离线
『第 2 楼』:  

好贴子,顶,基础的技术性贴子就要顶!

2006-2-18 19:11
查看资料  发送邮件  发短消息 网志  OICQ (149768318)  编辑帖子  回复  引用回复
dosz
中级用户

一看二跟三动手


积分 396
发帖 188
注册 2005-10-23
来自 上海
状态 离线
『第 3 楼』:  

@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
===============================

2006-2-18 20:56
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 4 楼』:  

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




※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-2-20 14:23
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
dosz
中级用户

一看二跟三动手


积分 396
发帖 188
注册 2005-10-23
来自 上海
状态 离线
『第 5 楼』:  

谢谢版主,我是在学习错误返回码,你给我指点我非常高兴.
:: 问题:为什么程序执行失败时,为同时显示"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 ]

2006-2-25 12:02
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
willsort
元老会员

Batchinger


积分 4432
发帖 1512
注册 2002-10-18
状态 离线
『第 6 楼』:  

Re dosz:

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

      而至于 DOS 命令的错误返回码为何通常会是正常执行为0,出现错误后非0,与一些高级语言恰好相反。那是因为 DOS 命令往往需要根据错误类型对错误进行分类处理,而0只有一个序号,不能表达多种错误类型,所以只有分配给正常执行的情况。而在那些高级语言的编程环境中恰好相反,往往需要将正确执行的结果进行分类处理,而错误情况只需要直接抛给专属错误处理模块即可。

   此帖被 +1 点积分    点击查看详情   
评分人:【 分数: +1  时间:2009-10-31 08:23




※ Batchinger 致 Bat Fans:请访问 [讨论]批处理编程的异类 ,欢迎交流与共享批处理编程心得!
2006-2-25 14:00
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
dosz
中级用户

一看二跟三动手


积分 396
发帖 188
注册 2005-10-23
来自 上海
状态 离线
『第 7 楼』:  

errorlevel 的比较方式是“大于或等于”。
这个我以前好象没有想得那么周到,
不过经你提示,我再看DOS执行时理解了,
在此,感谢你百忙之中给我回复。

[ Last edited by dosz on 2006-2-25 at 17:59 ]

2006-2-25 17:33
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
371770923
初级用户





积分 50
发帖 19
注册 2007-5-22
状态 离线
『第 8 楼』:  

if errorlevel好象还有这句用法(if "errorlevel"...... =????)具体的不怎么清楚
版主能不能介绍一下

2007-5-29 15:29
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
koala
初级用户

Batchs上議院參議長


积分 199
发帖 105
注册 2007-6-5
来自 江苏
状态 离线
『第 9 楼』:  发一个我翻译的 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)



『生如夏花之绚烂
   死若秋叶之静美』 dos做到了
2007-7-14 10:52
查看资料  发送邮件  发短消息 网志  OICQ (13019940)  编辑帖子  回复  引用回复
wordexport
初级用户




积分 87
发帖 42
注册 2007-9-27
状态 离线
『第 10 楼』:  

先顶一下.学到了

2007-10-4 23:04
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
soyo
新手上路





积分 18
发帖 10
注册 2007-10-29
状态 离线
『第 11 楼』:  

谢了

2007-10-30 21:49
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
hxwxyz
中级用户




积分 245
发帖 123
注册 2007-6-8
状态 离线
『第 12 楼』:  

学习了  谢谢

2007-10-31 19:10
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
523066680
银牌会员

SuperCleaner


积分 2362
发帖 1133
注册 2008-2-2
状态 离线
『第 13 楼』:  

好东西 不能沉了



综合型编程论坛

我的作品索引
  
2008-8-19 16:23
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (523066680)  编辑帖子  回复  引用回复

请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: