SETLOCAL ENABLEDELAYEDEXPANSION导致CD和PUSHD不能持续存在

Rag*_* RV 6 batch-file windows-scripting

我试图使用setlocal enabledelayedexpansion,并cd在一个批处理脚本,这似乎不会持续变回壳一起.

我需要的原因setlocal enabledelayedexpansion是我需要在脚本运行时动态扩展脚本中的变量.

考虑以下示例批处理文件:

a.bat
================================
setlocal enabledelayedexpansion
cd ..
Run Code Online (Sandbox Code Playgroud)

上述批处理文件未按预期迁移到上一个目录!

检查一下.

dbe*_*ham 7

Blorgbeard提供了一个解释,说明为什么在SETLOCAL之后发布的CD在ENDLOCAL之后不会持久存在(可能是明确的或隐含的).

这是一个有趣的解决方法.PUSHD堆栈与SETLOCAL/ENDLOCAL保存/恢复的环境无关.因此,以下简单序列将保留目录更改:

@echo off
setlocal
cd somePath
pushd .
endlocal
popd
Run Code Online (Sandbox Code Playgroud)

如果somePath不变则不是很有用- 你可以在ENDLOCAL之后轻松发行CD.但如果somePath是动态的,它可能非常有用.


Blo*_*ard 4

问题是setlocal导致任何当前目录更改都位于批处理文件的本地。

setlocal /?

开始在批处理文件中本地化环境更改。 发出 SETLOCAL 后所做的环境更改对于批处理文件而言是本地的。 必须发出 ENDLOCAL 才能恢复之前的设置。当到达批处理脚本末尾时,将为该批处理脚本发出的任何未完成的 SETLOCAL 命令执行隐含的 ENDLOCAL。

当前目录包含在“环境更改”中。

试试这个,注意它C:\%CD%批处理内部回显,但是当批处理退出时当前目录仍然被重置。

[11:42:00.17] C:\temp
> cat test.bat
@echo off
setlocal enabledelayedexpansion
cd ..
echo %CD%
[11:42:19.38] C:\temp
> test.bat
C:\

[11:42:23.00] C:\temp
>
Run Code Online (Sandbox Code Playgroud)

  • @Aacini我并不是说当前目录实际上是一个环境变量,只是它是引用文档中所谓“环境更改”的一部分。 (3认同)
  • @Blorgbeard:你的解释是错误的。当前目录**不**包含在环境变量中,但它是由 cmd.exe 维护的_动态变量_,与%DATE%、%TIME%、%RANDOM% 等相同;要确认这一点,只需输入:`set`。当前目录的这种行为是一种非常特殊的行为,据我所知,没有记录。请参阅:[这篇文章](http://www.dostips.com/forum/viewtopic.php?f=3&t=4436) (2认同)