批处理FOR /F循环中ECHO命令为何总返回"ECHO is on."
现象原因说明
核心原因是Windows批处理中FOR /F执行外部命令的机制特殊:
FOR /F执行反引号包裹的命令时,会隐式启动一个独立的全新cmd子进程运行该命令,子进程的初始ECHO状态默认为ON,不会继承父批处理进程设置的ECHO状态。- 脚本第4行执行的
@ ECHO OFF仅对当前运行批处理的父cmd进程生效,因此父进程里第5行直接执行ECHO时,会正确输出ECHO is off.。 - 两次
FOR /F循环中调用的ECHO都运行在新创建的子进程中,子进程默认ECHO状态始终为ON,所以每次捕获到的输出都是ECHO is on.。
验证方法
你可以修改FOR /F内的命令,主动在子进程内修改ECHO状态,就能捕获到对应结果:
:: 主动在子进程先执行ECHO OFF再运行ECHO,&前加^是为了在父批处理中转义分隔符,避免被父进程提前解析 FOR /F "usebackq delims=" %%a in (`ECHO OFF ^& ECHO`) do (set EchoState=%%a)
运行上述代码后EchoState的值就会变为ECHO is off.,可验证上述结论。
内容的提问来源于stack exchange,提问作者Peter Nimmo
相关产品推荐
相关产品推荐

