gpt4 book ai didi

batch-file - 为什么 setlocal 会干扰 Windows 批处理文件中的 chdir?

转载 作者:行者123 更新时间:2023-12-04 01:05:22 30 4
gpt4 key购买 nike

如果我运行批处理文件

setlocal
chdir ..

目录没有改变,但如果我运行
setlocal
endlocal
chdir ..

它工作正常。这必须正是 setlocal 所期望的。但是,看setlocal的定义时,并不是很明显,这与如何看待环境变量有关。我希望这是一个很好的机会来解释 setlocal 的实际作用以及它为什么会干扰 chdir。

最佳答案

SETLOCAL( help setlocalsetlocal /? )的帮助文档实际上很好地解释了这种情况。唯一不明显的是“环境变化的本地化”不仅包括环境变量,还包括当前目录,以及延迟扩展和扩展状态。可能还有更多,但我现在想不出来。

让你失望的事情实际上得到了很好的解释:“ 当到达批处理脚本的末尾时,对于该批处理脚本发出的任何未完成的 SETLOCAL 命令执行隐含的 ENDLOCAL。“未说明的是对于被调用的子程序也是如此。

当您的批处理脚本结束时,隐含的 ENDLOCAL “删除”了您的 CHDIR 的效果。您在第二个代码中的显式 ENDLOCAL 使您返回到根环境,因此您的 CHDIR 将被保留。

更新

当前目录不是环境变量,即使您通常可以使用 %CD% 获取当前值.你可以通过 tring SET CD 来证明。 - 它可能会给你“环境变量 CD 未定义”。如果您使用 set "CD=some value" 明确定义自己的真实 CD 变量,然后 %CD%将返回您分配的值,而不是当前目录。

在旧的 COMMAND.COM 时代,原始的 SETLOCAL 命令并没有控制延迟的扩展或扩展。启用/禁用 DelayedExpansion 和启用/禁用扩展选项是在引入 CMD.EXE 时添加的。这正是 MS 决定实现该功能的方式。不必如此。在许多方面,不幸的是,如果没有 SETLOCAL/ENDLOCAL,您就无法控制这些状态。我经常希望可以在不本地化环境的情况下启用或禁用延迟扩展。

关于batch-file - 为什么 setlocal 会干扰 Windows 批处理文件中的 chdir?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20153956/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com