如果我运行批处理文件
setlocal
chdir ..
目录没有改变,但是如果我运行
setlocal
endlocal
chdir ..
它工作正常。这一定正是 setlocal 所期望的。然而,当你阅读setlocal的定义时,并不完全明显,这与如何看待环境变量有关。我希望这是一个很好的机会来解释 setlocal 的实际作用以及它为什么会干扰 chdir。
SETLOCAL 的帮助文档(help setlocal
or setlocal /?
)实际上很好地解释了这种情况。唯一不明显的是“环境变化的本地化”不仅仅包括环境变量,还包括当前目录,以及延迟扩展和扩展状态。可能还有更多,但我暂时想不出来。
事实上,让你绊倒的事情已经得到了很好的解释:”当到达批处理脚本末尾时,将为该批处理脚本发出的任何未完成的 SETLOCAL 命令执行隐含的 ENDLOCAL。" 没有说明的是,对于被调用的子程序也是如此。
当批处理脚本结束时,隐式的 ENDLOCAL 会“擦除”CHDIR 的效果。第二个代码中的显式 ENDLOCAL 会让您返回根环境,因此您的 CHDIR 将被保留。
Update
当前目录不是环境变量,即使您通常可以使用以下命令获取当前值%CD%
。你可以通过 tr 来证明SET CD
- 它可能会给你“环境变量 CD 未定义”。如果您使用显式定义自己的真实 CD 变量set "CD=some value"
, then %CD%
将返回您分配的值,而不是当前目录。
原始的 SETLOCAL 命令无法控制旧 COMMAND.COM 时代的延迟扩展或扩展。引入 CMD.EXE 时添加了启用/禁用 DelayedExpansion 和启用/禁用扩展选项。这就是微软决定实现该功能的方式。事情本来不必如此。在很多方面,不幸的是,如果没有 SETLOCAL/ENDLOCAL,您就无法控制这些状态。我经常希望能够在不本地化环境的情况下启用或禁用延迟扩展。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)