中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 多个||、&&的执行过程的内在机理是什么?
作者:
标题: 多个||、&&的执行过程的内在机理是什么? 上一主题 | 下一主题
zsc37201
新手上路





积分 12
发帖 12
注册 2010-6-26
状态 离线
『楼 主』:  多个||、&&的执行过程的内在机理是什么?

ping /n 1 127.1 && echo pass || echo fail
输出结果:pass

ping /n 1 0.1 && echo pass || echo fail
输出结果:fail

ping /n 1 127.1 || echo fail && echo pass
输出结果:空

ping /n 1 0.1 || echo fail && echo pass
输出结果:fail
               pass

第二个和第四个不能理解。
第二个ping失败了,为什么还继续向后执行?
第四个ping失败了,为什么还输出pass?
多个||,&&的执行过程的内在机理是什么?

2010-8-2 17:00
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lovelymorning
初级用户





积分 131
发帖 72
注册 2008-2-24
状态 离线
『第 2 楼』:  

ping /n 1 127.1   这个,是肯定成功的吧。。。成功就执行 && 命令

ping /n 1 127.1 && echo pass     这两条命令都成功执行,当然不会执行 || echo fail  命令了。。

ping /n 1 0.1  命令失败,自然不会去执行  && echo pass  前面两条都失败了,就执行  || echo fail


ping /n 1 127.1   命令成功,自然不会执行 || echo fail  命令不执行,也就不会执行  && echo pass

ping /n 1 0.1 命令失败,就执行 || echo fail   ,|| echo fail    执行成功也就会执行 && echo pass


其实,理解好  ||   &&  的意思就明白了。。。有时,如果加个 () ,效果,又会不一样。。。

   此帖被 +25 点积分       点击查看详情   
评分人:【 zsc37201 分数: +1  时间:2010-8-6 17:26
评分人:【 doslike 分数: +24  时间:2010-8-11 14:51


2010-8-4 00:01
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zsc37201
新手上路





积分 12
发帖 12
注册 2010-6-26
状态 离线
『第 3 楼』:  

谢谢lovelymorning高手的回答,但我还是有点不明白。

我觉得||和&&是根据%errorlevel%来判断的,若当前的errorlevel值为大于等于1则执行||后面的语句,若为0则执行&&后面的语句。

而echo语句是不能改变errorlevel的值的。

可以做个小test。

ping /n 1 0.1
echo %errorlevel%
::为1
echo pass
echo %errorlevel%
::依然为1

可见echo即使执行成功后,也还是不能让errorlevel的值变为0.

ping /n 1 0.1 || echo fail && echo pass
输出结果:fail
               pass

  Quote:
ping /n 1 0.1 命令失败,就执行 || echo fail   ,|| echo fail    执行成功也就会执行 && echo pass

ping /n 1 0.1 || echo fail 后echo %errorlevel%后值为1,也就是执行没有成功,为什么依然执行echo pass。

难道|| && 不是按errorlevel来运行的吗?

我仔细看了你的解释,好像是把||或&&和后面的语句当作一个整体,而这个整体没执行,就认为是执行失败,而这个整体执行了,则认为是执行成功。

依您的解释,以上我举出的例子都能解释清楚。

甚至一些长的测试也能通过,比如:
ping /n 1 0.1 && echo 1 && echo 2 || echo 3 && echo 4
输出结果:3 4
首先:ping /n 1 0.1 失败,所以不执行&& echo 1
因为不执行&& echo 1,所以&& echo 1失败,所以不执行&& echo 2 ;
因为不执行&& echo 2,所以&& echo 2失败,所以执行|| echo 3;
因为执行|| echo 3,所以||echo 3成功,所以执行&& echo 4
所以输出3 4

但是我又多做了几个test,

ping /n 1  0.1 || echo 1 || echo 2 || echo 3
我先分析了一下:
首先:ping  /n 1 0.1 失败,所以执行|| echo 1,
因为执行|| echo 1,所以|| echo 1成功,所以不执行 || echo 2;
因为不执行 ||echo 2,所以||echo 2 失败,所以应该执行 || echo 3。
所以结果应该是 1 3,但实际结果是只有1,没有3.

又做了一个复杂的测试:
ping /n 1 0.1 && echo 1 && echo 2 || echo 3 && echo 4 || echo 5 && echo 6 || echo 7
经类似的分析结果应该是3 4 7
但实际结果是 3 4 (没有7)

请高手结合我的分析,而试一下,再解释一下,谢谢。

2010-8-5 10:27
查看资料  发短消息 网志   编辑帖子  回复  引用回复
lovelymorning
初级用户





积分 131
发帖 72
注册 2008-2-24
状态 离线
『第 4 楼』:  

ping /n 1  0.1 || echo 1 || echo 2 || echo 3

ping 失败,执行 echo 1,echo1执行成功,所以,echo 2 和后面的,都不会执行了。 echo 3 是在 echo 2 执行失败时才执行


ping /n 1 0.1 && echo 1 && echo 2 || echo 3 && echo 4 || echo 5 && echo 6 || echo 7

ping 失败,那么 echo 1 echo 2 都不执行,执行 echo 3 和 echo 4 ,echo 4成功,所以 echo 5 和之后的,都不会再执行了。。不执行 echo 7 是因为  echo7 是在 echo 6执行失败时才会被执行

这两个,不管 echo 2 或 echo 6 有没有被执行过,就算执行了,这两个命令必然是成功的,所以,|| 就不会被执行


命令成功执行的后面,&&  || 和 ||  && 结果,有时也是很大区别,命令失败时,这两个符号换个位置,也是不一样的。。。。


其实,这么解释,也是不科学的,要准确解释和理解 && || ,要从这两个符号的作用和CMD解释命令时的顺序、处理方式等方面来讲。。很晕的。。。知道大概怎么用就行了。。。

   此帖被 +1 点积分    点击查看详情   
评分人:【 zsc37201 分数: +1  时间:2010-8-6 17:26


2010-8-5 23:42
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
zsc37201
新手上路





积分 12
发帖 12
注册 2010-6-26
状态 离线
『第 5 楼』:  

谢谢你的回答,这个问题只能这样了,感觉没有什么规律可言,其实正像你说的,有些问题知道大概怎么用就行了,深究下去,没有什么意思,还浪费大脑细胞,给你加分了。

2010-8-6 17:21
查看资料  发短消息 网志   编辑帖子  回复  引用回复
wangyang331407
初级用户





积分 28
发帖 28
注册 2010-7-28
状态 离线
『第 6 楼』:  

&&
① 连接两个命令,当&&前的命令成功时,才执行&&后的命令。

||
① || 连接符,连接两个命令,当||前的命令失败时,才执行||后的命令。  
比如: echo 0123456 | find "789" || echo 字符中没有789

2010-8-6 19:19
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
haoc
新手上路





积分 14
发帖 8
注册 2010-8-9
状态 离线
『第 7 楼』:  

非常好

2010-8-11 11:38
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复

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


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



论坛跳转: