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

对于1:楼主怕是误解@的意思,作用是关闭命令自身回显。
先科普下echo命令和@用法:http://www.bathome.net/thread-13860-1-1.html
for语句内 @echo 是没有意义的。批处理开头@echo off 相当于在每一个命令前补上一个@,从而实现关闭了所有命令的回显。
括号()+管道符|的组合:
  1. @echo off
  2. ( for /l %%i in (1,1,5) do echo bathome ) | find "a"
  3. echo ============================
  4. ( for /l %%i in (1,1,5) do echo bathome ) | find "r"
  5. echo ============================
  6. ( for /l %%i in (1,1,5) do echo bathome ) | find "z"
  7. pause
复制代码
以上代码请细心品味,再删去@echo off重新品味。
解读:第2个和第3个for语句应该结果相同,然而第2个却能看到echo的输出结果,此处应该涉及到批处理的一堵高墙,预处理机制。(能力有限,不做深入分析)
括号将for语句整个包裹,而管道符| 连接着find命令,这是一句完整的语句。该复合语句的含义是:进行5次循环,同时执行echo输出,成功后,将结果传给find命令执行,再得到最后的匹配结果。
  1. D:\Users\Desktop>(for /L %i in (1 1 5) do echo bathome  ) | find "a"
  2. D:\Users\Desktop>echo bathome
  3. bathome
  4. D:\Users\Desktop>echo bathome
  5. bathome
  6. D:\Users\Desktop>echo bathome
  7. bathome
  8. D:\Users\Desktop>echo bathome
  9. bathome
  10. D:\Users\Desktop>echo bathome
  11. bathome
复制代码
可见以上过程产生了两次结果。上例中第2和3条for语句得到的结果不同,虽然是在find命令得到echo的输出结果才显示匹配结果。
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /l %%i in (1,1,5) do echo bathome | find "a"
  4. echo ============================
  5. for /l %%i in (1,1,5) do echo bathome | find "r"
  6. echo ============================
  7. for /l %%i in (1,1,5) do echo bathome
  8. pause
复制代码
同样删去@echo off再品味。
几个回答:
1. 为何多个很多空格?
echo输出末尾带换行符。sort命令把每次echo的换行符也做了排序,多少次echo就有多少次换行。这也涉及到"括号的正确使用"。
2. 括号()和@关闭回显的关系?
@ 是作用于单个命令,严格来说不是语句,更不是一行。对于复合语句,@只关闭后面的第一条命令的回显,也无法关闭括号内的所有命令回显,括号内之后的命令还是会显示。
楼主的例2方法一之所以能显示echo语句,正是由于整个for语句被括号包裹,而echo off只是在括号外加了一个@,但这只是关闭一个命令回显,其后仍然会显示。
以上仅代表本人看法,未完待续,等待大佬做权威解答。
2

评分人数

TOP

返回列表