中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: if语句的几个问题 上一主题 | 下一主题
hake
初级用户





积分 103
发帖 43
注册 2006-12-22
状态 离线
『楼 主』:  if语句的几个问题

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?
这上面是我的理解及在我的理解下提出的问题,我对这个有点迷糊,望各位高手指出!

2006-12-24 12:14
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 2 楼』:  

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,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2006-12-24 21:38
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
redtek
金牌会员





积分 2902
发帖 1147
注册 2006-9-21
状态 离线
『第 3 楼』:  

翻开上面那本介绍的书 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,一个永远在网上流浪的人……

_.,-*~'`^`'~*-,.__.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._,_.,-*~'`^`'~*-,._
2006-12-24 21:45
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
hake
初级用户





积分 103
发帖 43
注册 2006-12-22
状态 离线
『第 4 楼』:  

还有一个问题,就是为什么输入d的返回码会大于等于3?

2006-12-24 21:48
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
scriptor
银牌会员




积分 1187
发帖 555
注册 2006-12-21
状态 离线
『第 5 楼』:  

顶一个

又是汇编的
强啊

2007-1-4 01:33
查看资料  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: