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