[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

批处理文件中&&、||符号的深入讨论

顾名思义,这两个都是根据的前面的返回结果,判断是否执行后面的语句。可是他们不是修改%errorlevel%的值,来判断的。那 他们标志的前面的返回结果在哪呢? 求真相

顶!很有价值的话题
相关讨论:http://bbs.bathome.net/viewthread.php?tid=14277

TOP

回复 2# CrLf


版主给的链接我看了,也发表了自己的看法。但是我感觉那个标题和我这个有一点点不一样,我这个问题比较具体一些      哈哈
就在这讨论吧
  1. C:\Users\Administrator>xx
  2. 'xx' 不是内部或外部命令,也不是可运行的程序
  3. 或批处理文件。
  4. C:\Users\Administrator>xx || echo %errorlevel%
  5. 'xx' 不是内部或外部命令,也不是可运行的程序
  6. 或批处理文件。
  7. 9009
  8. C:\Users\Administrator>echo %errorlevel%
  9. 1
  10. C:\Users\Administrator>xx
  11. 'xx' 不是内部或外部命令,也不是可运行的程序
  12. 或批处理文件。
  13. C:\Users\Administrator>echo %errorlevel%
  14. 9009
  15. C:\Users\Administrator>xx || echo %errorlevel%
  16. 'xx' 不是内部或外部命令,也不是可运行的程序
  17. 或批处理文件。
  18. 9009
  19. C:\Users\Administrator>echo %errorlevel%
  20. 1
复制代码
测试 || 符号是执行完整条命令后修改的errorlevel值,确切的说是 || 符号决定的,
测试 &&符号也是执行完&&后面的命令才会修改errorlevel值,不执行则不会有任何变化,请往下看实验
  1. 1.
  2. C:\Users\Administrator\Desktop>xx
  3. 'xx' 不是内部或外部命令,也不是可运行的程序
  4. 或批处理文件。
  5. C:\Users\Administrator\Desktop>echo %errorlevel%
  6. 9009
  7. C:\Users\Administrator\Desktop>dir >1.txt && echo %errorlevel%
  8. 9009
  9. C:\Users\Administrator\Desktop>echo %errorlevel%
  10. 0
  11. C:\Users\Administrator\Desktop>
复制代码
  1. 2.
  2. C:\Users\Administrator\Desktop>xx
  3. 'xx' 不是内部或外部命令,也不是可运行的程序
  4. 或批处理文件。
  5. C:\Users\Administrator\Desktop>echo %errorlevel%
  6. 9009
  7. C:\Users\Administrator\Desktop>dir >1.txt && echo %errorlevel%
  8. 拒绝访问。
  9. C:\Users\Administrator\Desktop>echo %errorlevel%
  10. 9009
  11. C:\Users\Administrator\Desktop>
复制代码

TOP

本帖最后由 ivor 于 2012-1-13 00:04 编辑

前提是这两个符号后面的语句要执行才行

总结:&& 会修改errorlevel=0
          || 会修改errorlevel=1


发现一个列外,
  1. dir >1.txt || echo %errorlevel%
  2. echo %errorlevel%
复制代码
errorlevel的值会为0,这就不得其解了

TOP

如果同一问题最好一起讨论,免得东找西找的。
楼主可能是想问,&&在判断成功的时候,它怎么知道它前面的代码执行成功,执行成功是不是意味着cmd在&&之前执行了一遍之前的代码?如果执行了,这些执行结果显示在哪里?
个人理解,批处理在解析命令行时,确实存在一个预处理机制,但我认为这个机制是针对命令所执行到的位置的,一个长长的bat代码,它并非一次性预处理完成,而是运行到哪里预处理到哪里,那么,这个预处理就是命令的执行过程中的解析一环了。解析的意义就在于,判断命令是否可以执行!预处理最根本的就是——判断命令是否存在错误!而不是判断命令如何执行。因此,当批处理预处理到该条命令时,它不是去尝试如何获得命令执行结果,而是按照基本规则去判断该条命令是否可以执行,如果不符合语法,不符合基本的执行条件则返回返回码,如果能执行则直接执行。最简单的判断就是dir和for,使用dir来搜索文件,如果批处理先让dir来运行再判断该命令是否成功执行了,这是很耗费时间的。我们遇到的for /l问题,第一次似乎它没有执行循环,但第二次时它就会先执行再判断了,所以第二次执行时我们发现它会将集合内的元素全部预处理了一遍,这个预处理跟第一个预处理是不同的。——例子找不到了,麻烦。
有时候&&与start /wait 差不多,执行完了才判断。有时候也存在一种情况,你在一个pause后面放一些特殊符号,批处理会直接跳过pause而发生错误,但有时候我们把特殊符号放后面它又没有什么问题。所以,预处理也不仅仅限于所执行到的一行,可能与优先处理的问题有关。我说的第一次预处理是指判断命令是否符合语法、是否存在基本执行条件,第二次预处理就是你们说的,解析命令怎么执行的,有个判断优先级。
寂寞是黑白的,但黑白不是寂寞,是永恒。BAT 需要的不是可能,而是智慧。

TOP

返回列表