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
中,但仍在 运行 之前我所在的目录中.
为了理解这个问题,我尝试了几件事(知道那些测试没有意义):
- 将
c:\windows
放在引号中 (set DestDir="c:\windows"
)
- 将
%DestDir%
放在引号中 (pushd "%DestDir%"
)
- 使用
!
而不是 %
因为延迟扩展已开启,即 pushd "!DestDir!"
- 启动控制台window我运行以管理员身份从内部批处理文件
但是,当我没有打开延迟扩展时,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
之前)观看)。
我在这里和其他网站上阅读了很多关于 pushd
的问题和答案,其中绝大多数都提到了 UNC 路径问题。但是,我遇到了一个不同的问题,我还没有看到任何提示。
使用 Windows 10 x64 Enterprise(版本 1809),我从控制台 window:
中执行以下批处理文件@echo off
setLocal EnableDelayedExpansion
set DestDir=c:\windows
pushd %DestDir%
我的问题是 pushd
似乎以错误的方式执行或根本没有执行。这意味着当批处理文件已 运行 时,我 不是 在 c:\windows
中,但仍在 运行 之前我所在的目录中.
为了理解这个问题,我尝试了几件事(知道那些测试没有意义):
- 将
c:\windows
放在引号中 (set DestDir="c:\windows"
) - 将
%DestDir%
放在引号中 (pushd "%DestDir%"
) - 使用
!
而不是%
因为延迟扩展已开启,即pushd "!DestDir!"
- 启动控制台window我运行以管理员身份从内部批处理文件
但是,当我没有打开延迟扩展时,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
之前)观看)。