pushd 在延迟扩展的批处理文件中不起作用

pushd not working in a batch file with delayed expansion

我在这里和其他网站上阅读了很多关于 pushd 的问题和答案,其中绝大多数都提到了 UNC 路径问题。但是,我遇到了一个不同的问题,我还没有看到任何提示。

使用 Windows 10 x64 Enterprise(版本 1809),我从控制台 window:

中执行以下批处理文件
@echo off
setLocal EnableDelayedExpansion
set DestDir=c:\windows
pushd %DestDir%

我的问题是 pushd 似乎以错误的方式执行或根本没有执行。这意味着当批处理文件已 运行 时,我 不是 c:\windows 中,但仍在 运行 之前我所在的目录中.

为了理解这个问题,我尝试了几件事(知道那些测试没有意义):

但是,当我没有打开延迟扩展时pushd 可以正常工作。换句话说,在拥有 运行 以下批处理文件后

@echo off
set DestDir=c:\windows
pushd %DestDir%

我确实被传送到 c:\windows,不管我在 运行 批处理文件之前所在的目录。

我想我现在很傻,但我这辈子都无法解决这个问题。那么有人可以解释为什么延迟扩展处于活动状态时 pushd 会失败吗?

你的问题原因已经在评论中讨论过了,但是目前还没有解决方案。
您可以通过显式 endlocal 解决此问题:

REM @echo off
setLocal EnableDelayedExpansion
set DestDir=c:\windows
endlocal & pushd %DestDir%

最后一行被一次性解析,所以在执行整行(运行 和 echo on 之前,%DestDir% 被替换为其值(在 endlocal 之前)观看)。