中国DOS联盟

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

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

中国DOS联盟论坛
现在时间是 2026-06-24 09:51
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 多个||、&&的执行过程的内在机理是什么? 查看 894 回复 6
楼 主 多个||、&&的执行过程的内在机理是什么? 发表于 2010-08-02 17:00 ·  中国 湖北 襄阳 电信
新手上路
积分 12
发帖 12
注册 2010-06-26 09:35
15年会员
UID 169536
性别 男
状态 离线
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?
多个||,&&的执行过程的内在机理是什么?
2 发表于 2010-08-04 00:01 ·  中国 广东 汕头 电信
初级用户
★★
积分 131
发帖 72
注册 2008-02-24 14:31
18年会员
UID 111317
性别 男
状态 离线
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


其实,理解好 || && 的意思就明白了。。。有时,如果加个 () ,效果,又会不一样。。。
本帖最近评分记录 (共 2 条) 点击查看详情
评分人分数时间
zsc37201 +1 2010-08-06 17:26
doslike +24 2010-08-11 14:51
3 发表于 2010-08-05 10:27 ·  中国 湖北 襄阳 电信
新手上路
积分 12
发帖 12
注册 2010-06-26 09:35
15年会员
UID 169536
性别 男
状态 离线
谢谢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

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)

请高手结合我的分析,而试一下,再解释一下,谢谢。
4 发表于 2010-08-05 23:42 ·  中国 广东 揭阳 电信
初级用户
★★
积分 131
发帖 72
注册 2008-02-24 14:31
18年会员
UID 111317
性别 男
状态 离线
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-08-06 17:26
5 发表于 2010-08-06 17:21 ·  中国 湖北 襄阳 电信
新手上路
积分 12
发帖 12
注册 2010-06-26 09:35
15年会员
UID 169536
性别 男
状态 离线
谢谢你的回答,这个问题只能这样了,感觉没有什么规律可言,其实正像你说的,有些问题知道大概怎么用就行了,深究下去,没有什么意思,还浪费大脑细胞,给你加分了。
6 发表于 2010-08-06 19:19 ·  中国 上海 电信
初级用户
积分 28
发帖 28
注册 2010-07-28 11:06
15年会员
UID 171355
性别 男
状态 离线
&&
① 连接两个命令,当&&前的命令成功时,才执行&&后的命令。

||
① || 连接符,连接两个命令,当||前的命令失败时,才执行||后的命令。
比如: echo 0123456 | find "789" || echo 字符中没有789
7 发表于 2010-08-11 11:38 ·  中国 北京 电信
新手上路
积分 14
发帖 8
注册 2010-08-09 13:16
15年会员
UID 172052
性别 男
状态 离线
非常好
论坛跳转: