搜索
 找回密码
 立即注册
发新帖

bat教程[277] 组合命令&、&&和||

时间:2020-5-19 18:53 0 1631 | 复制链接 |

610

主题

610

帖子

0

积分

网站编辑

Rank: 8Rank: 8

积分
0
(1)&
如echo Checking what executable files we have in WINDOWS... & dir C:\WINDOWS\*.exe & echo And we got lots of stuff here.
&在多个命令之间所起的连接作用是将这三者分成3行来独立执行,因为它们之间是相互独立的关系。不论三者中每一条命令的执行结果如何,后面的一条命令总能被得到执行(这与&&和||不同)。

(2)&&
&&作为组合命令之一,与&类似,也有着并列多条命令并将其按顺序执行的功能。
与&的不同之处是,如果多命令中的某一条命令执行出错时,后面的所有命令将不会再被执行;如果一直没有出错则会一直执行完所有的并列命令。
如下面的例子
echo Checking if we have the following directory... & dir "E:\starcraft II" & echo Seems it does not exist.
echo Checking if we have the following directory... && dir "E:\starcraft II" && echo Seems it does not exist.
它们的区别是,前者会有 Seems its not exist. 的输出,而后者却没有。

(3)||
||的用途与&&的功能恰好相反。当遇到执行正确的命令后将不再执行后面的命令,如果没有出现正确的命令则一直执行完所有命令。例如 dir D:\test || md D:\test ,如果 D:\test 存在,即第一条命令执行正确的话,后面的创建 D:\test 就不会再执行了;相反,如果第一条命令执行出错,那么后面的命令就起作用了。

在混合使用的时候需要注意它们的优先级。分析下面几个例子有助于我们理解它们的执行效果(如果我们的机器上并没有 Z:盘的话)。

dir Z: & dir C: || echo Howdy  ( echo Howdy不执行)
dir C: & dir Z: || echo Howdy  (都执行)
dir Z: && dir C: || echo Howdy (dir C: 不执行)
dir C: && dir Z: || echo Howdy(都执行)
dir C: && dir C: || echo Howdy( echo Howdy不执行)
dir C: || echo Howdy & echo Hi there ( echo Howdy不执行)
dir C: || echo Howdy && echo Hi there ( echo Howdy和echo Hi there 不执行)
dir Z: || echo Howdy & echo Hi there(都执行)
dir Z: || echo Howdy && echo Hi there(都执行)

优先级验证实例
  1. @echo off
  2. echo.
  3. echo.    已经确认命令连接符号优先级从低到高如下:
  4. echo.            ^&               命令分隔符
  5. echo.            ^|^|          逻辑或操作符
  6. echo.            ^&^&          逻辑与操作符
  7. echo.            ^|           管道操作符
  8. echo.            ^< ^> ^>^>      I/O重定向操作符
  9. echo.            ^(^)          命令分组
  10. echo.
  11. echo.证明过程如下:
  12. pause
  13. echo.
  14. echo.  首先应当公认^(和^)作为命令分组符号有最高的优先级,可以改变任意命令组的优先级
  15. echo.
  16. echo.  另外需要注意的是,命令连接符号的优先级与语句的执行顺序不是直接对应的
  17. echo.
  18. echo.  命令行中的语句仍然是先执行左侧,再执行右侧
  19. echo.
  20. echo.  命令连接符只影响左侧与右侧语句的分组过程,而不会使右侧语句先执行
  21. echo.
  22. pause
  23. cls
  24. echo on
  25. echo flag1 | echo flag2 > con
  26. echo flag1 | (echo flag2 > con)
  27. (echo flag1 | echo flag2) > con
  28. @echo off
  29. echo.
  30. echo.前两句输出效果相同,说明第二句的分组符号可以省略,证明 ^> 优先级大于 ^|
  31. pause

  32. cls
  33. echo on
  34. echo flag1 && echo flag2 | echo flag3
  35. echo flag1 && (echo flag2 | echo flag3)
  36. (echo flag1 && echo flag2) | echo flag3
  37. @echo off
  38. echo.
  39. echo.前两句输出效果相同,说明第二句的分组符号可以省略,证明 ^| 优先级大于 ^&^&
  40. pause

  41. cls
  42. echo on
  43. echo flag1 || echo flag2 && echo flag3
  44. echo flag1 || (echo flag2 && echo flag3)
  45. (echo flag1 || echo flag2) && echo flag3
  46. @echo off
  47. echo.
  48. echo.前两句输出效果相同,说明第二句的分组符号可以省略,证明 ^&^& 优先级大于 ^|^|
  49. pause

  50. cls
  51. echo on
  52. echo flag1 || echo flag2 & echo flag3
  53. (echo flag1 || echo flag2) & echo flag3
  54. echo flag1 || (echo flag2 & echo flag3)
  55. @echo off
  56. echo.
  57. echo.前两句输出效果相同,说明第二句的分组符号可以省略,证明 ^|^| 优先级大于 ^&
  58. pause

  59. cls
  60. echo.综合测试示例:
  61. echo.
  62. echo on
  63. echo flag1 & more flag2 || echo flag3 && echo flag4 | echo flag5 || echo flag6
  64. echo flag1 & ((more flag2 || (echo flag3 && (echo flag4 | echo flag5))) || echo flag6)
  65. (echo flag1 & (more flag2 || (echo flag3 && echo flag4) | echo flag5)) || echo flag6
  66. @echo off
  67. echo.
  68. echo.前两句输出效果相同,说明符合优先级和分组优先级相同,第三句是个反例
  69. pause
复制代码



您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回列表 返回顶部