Board logo

标题: 多个||、&&的执行过程的内在机理是什么? [打印本页]

作者: zsc37201     时间: 2010-8-2 17:00    标题: 多个||、&&的执行过程的内在机理是什么?

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?
多个||,&&的执行过程的内在机理是什么?
作者: lovelymorning     时间: 2010-8-4 00:01
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


其实,理解好  ||   &&  的意思就明白了。。。有时,如果加个 () ,效果,又会不一样。。。
作者: zsc37201     时间: 2010-8-5 10:27
谢谢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)

请高手结合我的分析,而试一下,再解释一下,谢谢。
作者: lovelymorning     时间: 2010-8-5 23:42
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解释命令时的顺序、处理方式等方面来讲。。很晕的。。。知道大概怎么用就行了。。。
作者: zsc37201     时间: 2010-8-6 17:21
谢谢你的回答,这个问题只能这样了,感觉没有什么规律可言,其实正像你说的,有些问题知道大概怎么用就行了,深究下去,没有什么意思,还浪费大脑细胞,给你加分了。
作者: wangyang331407     时间: 2010-8-6 19:19
&&
① 连接两个命令,当&&前的命令成功时,才执行&&后的命令。

||
① || 连接符,连接两个命令,当||前的命令失败时,才执行||后的命令。  
比如: echo 0123456 | find "789" || echo 字符中没有789
作者: haoc     时间: 2010-8-11 11:38
非常好