中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-08-13 12:39
中国DOS联盟论坛 » DOS学习入门 & 精彩文章 (教学室) » if语句的几个问题 查看 1,147 回复 4
楼 主 if语句的几个问题 发表于 2006-12-24 12:14 ·  中国 江西 九江 电信
初级用户
积分 103
发帖 43
注册 2006-12-22 23:30
19年会员
UID 74302
性别 男
状态 离线
if语句的返回值怎么判断?
choice 使用此命令可以让用户输入一个字符,从而运行不同的命令。使用时应该加/c:参数,c:后应写提示可 输入的字符,之间无空格。它的返回码为1234……
如: choice /c:dme defrag,mem,end
将显示
defrag,mem,end[D,M,E]?
例如,test.bat的内容如下:
@echo off
choice /c:dme defrag,mem,end
if errorlevel 3 goto defrag 应先判断数值最高的错误码
if errorlevel 2 goto mem
if errotlevel 1 goto end
:defrag
c:\dos\defrag
goto end
:mem
mem
goto end
:end
echo good bye



我的理解是,首先要求你输入一个字符,“dme”中的一个,他的本意是,如果输入d,就跳转到defrag语句,
if errorlevel 3 goto defrag
这一句是判断返回值,判断返回值是不是等于3,是的话就跳转到defrag。
我的问题就是:为什么输入d的返回值会是3?
这上面是我的理解及在我的理解下提出的问题,我对这个有点迷糊,望各位高手指出!
2 发表于 2006-12-24 21:38 ·  中国 北京 朝阳区 联通
金牌会员
★★★★
积分 2,902
发帖 1,147
注册 2006-09-21 12:00
19年会员
UID 63324
性别 男
状态 离线
ERRORLEVLE 是返回值。

但是,当使用 IF ERRORLEVEL 3 GOTO DEFRAG 让批处理测试上一个程序运行的返回值时:

  “如果返回值大于或等于由IF命令所说明的值,则MS-DOS就执行所说明的命令”

如果 CHOICE 你设定了5个选项,就要倒序判断它们的返回值,因为:

(下面是错误的例子)

  IF ERRORLEVEL 1 GOTO DEFRAG
  IF ERRORLEVEL 2 GOTO MEM


看上面例子,IF 判断 ERRORLEVEL 返回值的特性:

   1) 不是 IF ERRORLEVEL 的值(等于)什么就跳转到哪儿
   2) 而是 IF ERRORLEVEL 的值(大于 或 等于)什么值,就跳转到哪儿

如果你要把最小的值放在最前的语句(例如上面的代码),则按照 IF ERRORLEVEL 的特性判断,
如 IF ERRORLEVEL 大于或等于 1 ,可是,所有的返回值都会大于或等于 1,而不是我们心里认为的(绝对等于)。


关于更详细的 choice 与 if errorlevel 的介绍,详见由 tianzizhi 上传的非常好的一本教程~:)

(下载下面的教程,翻开P46--P50页,看完后会非常透彻)

MS-DOS6.2批处理文件高级指南
http://www.cn-dos.net/forum/viewthread.php?tid=25043&fpage=1
    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
3 发表于 2006-12-24 21:45 ·  中国 北京 朝阳区 联通
金牌会员
★★★★
积分 2,902
发帖 1,147
注册 2006-09-21 12:00
19年会员
UID 63324
性别 男
状态 离线
翻开上面那本介绍的书 P122页的第 9.7 节(替代CHOICE命令)一篇,其中是举例了一个汇编小代码来代替CHOICE外部命令。

看完这篇文章,就知道了 CHOICE 是如何将你选择的那个返回值“返回给” ERRORLEVEL的~:)



MOV AL,AH
MOV AH,4C
INT 21


上面是汇编代码。 MOV AL,AH ,被传送到 AL 寄存器内的值就是返回码。
当执行 4C 功能时,系统将 AL 寄存器内的值返回给你(给 ERRORLEVEL),
所以,你可以用 IF ERRORLEVEL 来判断那些值~:)
    Redtek,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
4 发表于 2006-12-24 21:48 ·  中国 江西 九江 电信
初级用户
积分 103
发帖 43
注册 2006-12-22 23:30
19年会员
UID 74302
性别 男
状态 离线
还有一个问题,就是为什么输入d的返回码会大于等于3?
5 发表于 2007-01-04 01:33 ·  中国 北京 中国科学院研究生院
银牌会员
★★★
积分 1,187
发帖 555
注册 2006-12-21 07:35
19年会员
UID 74129
性别 男
状态 离线
顶一个

又是汇编的
强啊
论坛跳转: