|
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 |
|
|
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 |
|
|
wordexport
初级用户
积分 87
发帖 42
注册 2007-9-27
状态 离线
|
|
2007-10-4 23:04 |
|
|
soyo
新手上路
积分 18
发帖 10
注册 2007-10-29
状态 离线
|
|
2007-10-30 21:49 |
|
|
hxwxyz
中级用户
积分 245
发帖 123
注册 2007-6-8
状态 离线
|
|
2007-10-31 19:10 |
|
|
523066680
银牌会员
SuperCleaner
积分 2362
发帖 1133
注册 2008-2-2
状态 离线
|
|
2008-8-19 16:23 |
|