中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
作者:
标题: 请教DOS批处理跳转问题 上一主题 | 下一主题
w909525
初级用户





积分 98
发帖 34
注册 2007-3-9
状态 离线
『楼 主』:  请教DOS批处理跳转问题

第一段
if errorlevel 0 goto a
goto b
第二段
if errorlevel 0 goto a
if errorlevel 1 goto b
请问上面两段代码有什么不一样的呢?当我执行第一段代码时总是跳转到a呢,
如果我想实现第二段代码的功能,只用一行代码要怎样写呢?
还有请问DOS的返回码是不是只有0 1不会有2呢
以上请指教谢谢

2007-4-12 01:57
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
vk
中级用户




积分 218
发帖 86
注册 2006-8-10
状态 离线
『第 2 楼』:  

LZ第二段代码有错误
应该是
if errorlevel 1 goto a
if errorlevel 0 goto b
还有就是建议LZ先看看IF命令的帮助文件 不懂再提问!



2007-4-12 05:34
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lp1129
初级用户





积分 186
发帖 92
注册 2007-3-27
状态 离线
『第 3 楼』:  

if errorlevel后面的错误码是要经过大量实验得来的,

主要看你在这句之前运行的什么命令,错误码不只是有0、1、2,有的命令甚至还有

100的错误码,还有的命令,会同时返回0和1的错误码

可见,楼主的第一代码就是因为上一条命令同时反回了0和1的错误码而始终跳转到a

比较长见的就是find命令,如下:

@echo off
find "3" 1.txt
if errorlevel 0 echo a
if errorlevel 1 echo b
if errorlevel 2 echo c
pause

如果没有找到会同时返回0和1的返回码,因此就会打印a和b
而找到了则只返回0返回码,只打印a

建议使用命令后不要急于跳转,而用ECHO打印测试准确后再执行跳转。

你的第一段代码,是如果返回码中有0就跳转到a,没有0就跳转到b

第二段代码,是发果返回码中有0就跳到a,有1就跳到b,如果返回码只有2就不能跳了

要记住,返回码不是唯一的!

[ Last edited by lp1129 on 2007-4-11 at 05:55 PM ]

2007-4-12 06:51
查看资料  发短消息 网志   编辑帖子  回复  引用回复
vk
中级用户




积分 218
发帖 86
注册 2006-8-10
状态 离线
『第 4 楼』:  

三楼的说法 我觉得有几个问题
1命令返回状态值排序应该是从大到小吧
2你举的例子

  Quote:
@echo off
find "3" 1.txt
if errorlevel 0 echo a
if errorlevel 1 echo b
if errorlevel 2 echo c
pause

之所以会执行echo a和echo b
因为if errorlevel 0 echo a
这句语句按我的理解是这个意思 如果上个命令的返回值≥0就执行echo a命令 反之就执行下一条命令
那么find "3" 1.txt这条命令就算返回值为1也会执行echo a命令 后面为什么执行echo b就不用说了吧 大家都知道 而并非是三楼的朋友说的 如果没找到就会同时返回0和1
以上是个人看法 如果说的不对 还请楼上指点!

[ Last edited by vk on 2007-4-12 at 08:26 AM ]



2007-4-12 08:22
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
lp1129
初级用户





积分 186
发帖 92
注册 2007-3-27
状态 离线
『第 5 楼』:  



  Quote:
Originally posted by vk at 2007-4-11 07:22 PM:
三楼的说法 我觉得有几个问题
1命令返回状态值排序应该是从大到小吧
2你举的例子
之所以会执行echo a和echo b
因为if errorlevel 0 echo a
这句语句按我 ...

看来一知半解的不是我,是你了

返回值从大到小的顺序排列不是必须的, 而只是执行命令为 goto 时的习惯用法, 当使用 set 作为执行命令时, 通常会从小到大顺序排列, 比如需将返回码置入环境变量, 就需使用以下的顺序形式:
if errorlevel 1 set el=1
if errorlevel 2 set el=2
if errorlevel 3 set el=3
...

在IF的教程中是这样的

if errorlevel / if not errorlevel   数字 待执行的命令

如果返回值等于指定的数字,则条件成立,运行命令,否则运行下一句。

绝对不是你说的返回值≥0就运行,这里返回码不是单纯的数字,而是代码

你可以改写我的代码为以下形式来测试,没有任何影响的。

@echo off
find "3" 1.txt
if errorlevel 2 echo a
if errorlevel 1 echo b
if errorlevel 0 echo c
pause

活学活用吧,切不可成死套死用。

2007-4-12 14:20
查看资料  发短消息 网志   编辑帖子  回复  引用回复
htysm
高级用户




积分 866
发帖 415
注册 2005-12-4
状态 离线
『第 6 楼』:  

用“IF”去判断程序是否成功执行,往往会导致许多问题,而应该"&&“这个命令就不会存在了。

@echo off
find "3" 1.txt && echo OK || echo NO
pause>nul

2007-4-13 00:04
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
vk
中级用户




积分 218
发帖 86
注册 2006-8-10
状态 离线
『第 7 楼』:  

原来有些命令会同时返回两个状态值
学习了! 感谢LS
但是有一点没想通
我举个例子
dir z:  (电脑里没有Z盘 这是为了让命令返回值为1)
if errorlevel 0 goto a
goto b
:b
echo b
pasue
:a
echo a
pause
运行了这批处理后显示了a
按你的意思如果返回值等于指定的数字,则条件成立,运行命令,否则运行下一句。
dir z:
没找到指定路径
这句返回值为1并没有为0它为什么就执行了goto a

[ Last edited by vk on 2007-4-13 at 05:41 AM ]



2007-4-13 05:40
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: