中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-01 21:16
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 还是error level的问题 查看 1,157 回复 8
楼 主 还是error level的问题 发表于 2006-06-02 22:49 ·  中国 北京 联通
初级用户
积分 124
发帖 34
注册 2006-05-23 11:38
20年会员
UID 55845
状态 离线
比如copy 命令,如何判断这个copy命令是否执行成功?有哪些异常?
如:
@ECHO OFF
XCOPY C:\AUTOEXEC.BAT D:\

IF ERRORLEVEL = = 4 ECHO 拷贝过程中写盘错误
IF ERRORLEVEL = = 3 ECHO 预置错误阻止文件拷贝操作
IF ERRORLEVEL = = 2 ECHO 用户通过ctrl-c中止拷贝操作
IF ERRORLEVEL = = 1 ECHO 未找到拷贝文件
IF ERRORLEVEL = = 0 ECHO 成功拷贝文件

那 rmdir 以及 mkdir呢?
2 发表于 2006-06-03 20:17 ·  中国 山西 临汾 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
23年会员
UID 19
性别 男
状态 离线
Re wingofsea:

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

需要注意的是,在COMMAND等非CMD环境中,所有的内部命令均不设置和修改errorlevel,此时的错误捕捉是比较复杂的,尚无较好的方案。

另外,类似 "IF ERRORLEVEL = = 4 ECHO 拷贝过程中写盘错误" 是错误的,因为命令行中的“=”相当于空格而被忽略,而if erroelevl 4 意为如果errorlevel大于等于4。所以,在以上语句中,当errorlevel为4时,以上错误将全部显示。正确的用法应该是:

IF ERRORLEVEL 4 IF NOT ERRORLEVEL 5 ECHO 拷贝过程中写盘错误
IF ERRORLEVEL 3 IF NOT ERRORLEVEL 4 ECHO 预置错误阻止文件拷贝操作
IF ERRORLEVEL 2 IF NOT ERRORLEVEL 3 ECHO 用户通过ctrl-c中止拷贝操作
IF ERRORLEVEL 1 IF NOT ERRORLEVEL 2 ECHO 未找到拷贝文件
IF NOT ERRORLEVEL 1 ECHO 成功拷贝文件

以上的用法在CMD和COMMAND均有效,在CMD中还可使用:

IF %ERRORLEVEL%==4 ECHO 拷贝过程中写盘错误
IF %ERRORLEVEL%==3 ECHO 预置错误阻止文件拷贝操作
IF %ERRORLEVEL%==2 ECHO 用户通过ctrl-c中止拷贝操作
IF %ERRORLEVEL%==1 ECHO 未找到拷贝文件
IF %ERRORLEVEL%==0 ECHO 成功拷贝文件
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
3 发表于 2006-06-06 09:06 ·  中国 上海 普陀区 电信
初级用户
积分 26
发帖 9
注册 2006-03-16 16:57
20年会员
UID 52194
状态 离线
willsort 版主,
是否所有的命令返回码 都可以看作 返回“0” 表示成功运行该指令,
返回“1” 表示指令运行中有错误?
4 发表于 2006-06-06 18:07 ·  中国 山西 运城 中移铁通
元老会员
★★★★
Batchinger
积分 4,432
发帖 1,512
注册 2002-10-18 00:00
23年会员
UID 19
性别 男
状态 离线
Re seifer1754:

请注意我在2楼中表述中相关限定词:

1、“在CMD环境中”,在COMMAND(包括DOS/9X/NT's)中,内部命令没有errorlevel,所以内部命令的errorlevel是NT系列命令扩展特性的一部份。

2、“copy等大多数”,也有一些内部命令至今未发现有errorlevel,比如set等。

3、“内部命令”,外部命令几乎均有errorlevel,但很多都只有0,无论执行是否出错;还有一些有自己特殊的errorlevel,比如DOS中的choice.com,是根据键入字符在侯选字符表中的位置来返回errorlevel的,若用户按了CTRL+BREAK 或CTRL+C终止choice运行会返回0。
※ Batchinger 致 Bat Fans:请访问 批处理编程的异类 ,欢迎交流与共享批处理编程心得!
5 发表于 2006-07-05 17:45 ·  中国 北京 联通
初级用户
积分 120
发帖 32
注册 2006-06-19 16:31
20年会员
UID 57256
状态 离线
谢谢版主的解释,如果是这样的一个需求:

1. 首先检查c:\program files\utility目录下是否有setup.exe文件
2.如果有, 则首先备份该setup.exe文件到c:\back。备份成功,则用c:\setup.exe 替换c:\program files\utility\setup.exe. 备份失败,则提示用户,并程序退出。
3.如果c:\program files\utility下没有setup文件,则拷贝c:\setup.exe到c:\program files\utility\setup.exe。并判断拷贝是否成功.

如果copy命令没有errorlevel的话,怎么来判断copy动作是否成功呢?

[ Last edited by qdcr on 2006-7-5 at 17:48 ]
6 发表于 2006-07-05 18:15 ·  中国 北京 联通
初级用户
积分 120
发帖 32
注册 2006-06-19 16:31
20年会员
UID 57256
状态 离线
看到版主另外一个帖子上说,
http://www.cn-dos.net/forum/viewthread.php?tid=20952&fpage=1&highlight=%2Bwingofsea
“一般以预防为主,善后为辅,在错误发生之前,我们要能判断出错误发生的各种可能性,然后进行抛出处理。”
copy操作有如下可能:
1.磁盘空间不足
2.只读文件不能被替换
请问如何处理这两个异常
7 发表于 2006-07-05 18:22 ·  中国 上海 松江区 电信
铂金会员
★★★★
DOS一根葱
积分 5,493
发帖 2,315
注册 2006-05-01 10:41
20年会员
UID 54766
性别 男
来自 上海
状态 离线
磁盘空间不足处理不用解释了吧
替换只读文件用xcopy /h /r /y
8 发表于 2006-07-05 19:42 ·  中国 北京 联通
初级用户
积分 120
发帖 32
注册 2006-06-19 16:31
20年会员
UID 57256
状态 离线
to fastslz:
当磁盘空间不足时,希望程序给出提示信息并退出.所以希望能捕获到这类错误
9 发表于 2006-07-05 21:31 ·  中国 上海 松江区 电信
铂金会员
★★★★
DOS一根葱
积分 5,493
发帖 2,315
注册 2006-05-01 10:41
20年会员
UID 54766
性别 男
来自 上海
状态 离线
这个还真没研究过,帮不了
论坛跳转: