Rag*_* RV 6 batch-file windows-scripting
我试图使用setlocal enabledelayedexpansion
,并cd
在一个批处理脚本,这似乎不会持续变回壳一起.
我需要的原因setlocal enabledelayedexpansion
是我需要在脚本运行时动态扩展脚本中的变量.
考虑以下示例批处理文件:
a.bat
================================
setlocal enabledelayedexpansion
cd ..
Run Code Online (Sandbox Code Playgroud)
上述批处理文件未按预期迁移到上一个目录!
检查一下.
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
是动态的,它可能非常有用.
问题是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)