2

我已经阅读了很多关于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如果延迟扩展处于活动状态,任何人都可以解释为什么会失败吗?

4

1 回答 1

2

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

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

最后一行被一次性解析,因此在执行整行%DestDir%之前被替换为它的值(before )(run with to watch)。endlocalecho on

于 2019-05-22T15:03:43.773 回答