推送无法在扩展延迟的批处理文件中工作

时间:2019-05-21 19:30:48

标签: windows batch-file pushd

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

使用Windows 10 x64 Enterprise(版本1809),我正在控制台窗口中执行以下批处理文件:

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

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

我拼命尝试了几件事来理解这个问题(知道那些测试没有道理):

  • c:\windows放在引号(set DestDir="c:\windows"
  • %DestDir%放在引号(pushd "%DestDir%"
  • 使用!而不是%,因为开启了延迟扩展,即pushd "!DestDir!"
  • 启动控制台窗口,我以管理员身份从内部运行批处理文件

但是,当我不打开延迟扩展时,pushd会按预期工作。换句话说,在运行以下批处理文件之后

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

在运行批处理文件之前,无论进入哪个目录,我的确已经进入了c:\ windows。

我想我现在很傻,但是我一生都无法将其束之高阁。因此,有人可以解释为什么pushd如果延迟扩展处于活动状态会失败吗?

1 个答案:

答案 0 :(得分:1)

您的问题的原因已在评论中讨论,但到目前为止没有解决方案。
您可以通过显式endlocal来解决此问题:

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

一次性分析了最后一行,因此在执行整行之前,将%DestDir%替换为其值(在endlocal之前)(用echo on运行)。