中国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语句的几个问题 使用 LLM 解释/回答一下

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 楼』:   使用 LLM 解释/回答一下

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 楼』:   使用 LLM 解释/回答一下

翻开上面那本介绍的书 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 楼』:   使用 LLM 解释/回答一下

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


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




积分 1187
发帖 555
注册 2006-12-21
状态 离线
『第 5 楼』:   使用 LLM 解释/回答一下

顶一个

又是汇编的
强啊


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

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


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



论坛跳转: