@echo on和@echo off在批处理文件中的括号if块中执行时似乎没有任何影响.这是一个简单的演示:
@echo off echo Test #1 if 1 == 1 ( @echo on echo Test #2 @echo off echo Test #3 ) @echo on echo Test #4
在命令行上运行上面的输出是:
Test #1
Test #2
Test #3
C:\mybatchfilelocation>echo Test #4
Test #4
任何人都可以解释这个和/或建议一个解决方法吗? (期望它可能通过大量使用goto和标签来修复,但如果可能的话,我更愿意继续使用括号中的块…)
正如您所发现的那样,解析器无法识别更改的ECHO状态,直到它到达包含ECHO ON / OFF的代码块之后的语句.
但是有一个例外 – 在FOR … DO之后的命令确实在同一个块内进行状态更改:-)
请注意,当ECHO当前为ON时,您只需要@来抑制命令输出.如果它是OFF,那么就不需要@ECHO ON.如果你在同一个代码块中打开和关闭它,那么你也不需要它.
这是一个回归偶数测试线的演示:
@echo off echo Test #1 ( echo on for %%. in (.) do echo Test #2 echo off echo Test #3 echo on for %%. in (.) do echo Test #4 echo off echo Test #5 ) echo on echo Test #6 @echo off echo Test #7
– 输出 –
Test #1 C:\test>echo Test #2 Test #2 Test #3 C:\test>echo Test #4 Test #4 Test #5 C:\test>echo Test #6 Test #6 Test #7
您可能会发现声明一个简单的echo_on“宏”很方便.以下产生完全相同的输出:
@echo off setlocal set "echo_on=echo on&for %%. in (.) do" echo Test #1 ( %echo_on% echo Test #2 echo off echo Test #3 %echo_on% echo Test #4 echo off echo Test #5 ) echo on echo Test #6 @echo off echo Test #7