Windows pushd中的pushd——可能吗?

Windows pushd中的pushd——可能吗?,windows,batch-file,cmd,Windows,Batch File,Cmd,我正在尝试创建一个非常简单的批处理脚本,其中对于复制到暂存目录的每个文件,脚本都会将其工作目录更改为该暂存目录以执行某些工作: pushd C:\Shared\ for /r %%f in (*.dll) do ( copy %%f C:\staging\. pushd C:\staging\. echo CWD is %cd% REM do some work here popd ) popd 然而,令我惊讶的是,只有第一个pushd完成了

我正在尝试创建一个非常简单的批处理脚本,其中对于复制到暂存目录的每个文件,脚本都会将其工作目录更改为该暂存目录以执行某些工作:

pushd C:\Shared\
for /r %%f in (*.dll) do (
    copy %%f C:\staging\.
    pushd C:\staging\.
      echo CWD is  %cd%
      REM do some work here
    popd
)
popd
然而,令我惊讶的是,只有第一个
pushd
完成了


这是DOS/Windows批处理的已知限制吗?如果是这样的话,是否有一个快速的解决方法?

它可以工作。用命令
cd
证明:

pushd C:\Shared\
for /r %%f in (*.dll) do (
    pushd C:\staging\.
      echo CWD is  %cd%
      cd
    popd
)
popd
但由于您使用的变量(
%cd%
)在同一块中更改和使用,因此您需要:


非常感谢。我只想在您的第二个代码段中添加一个
setlocal enabledelayedexpansion
(我把它放在第二个
pushd
之前,但是它达到了setlocal的最大递归级别,所以我把它放在所有代码之上)。是的,通常,
setlocal…
是批处理文件的第二行(第一个是
@echo off
)。对不起,我太习惯了,忘了提一下。如果你想在
for
循环中使用
setlocal…
(通常不需要),你应该在循环结束(
之前使用
endlocal
)。
setlocal enabledelayedexpansion
pushd C:\Shared\
for /r %%f in (*.dll) do (
    pushd C:\staging\.
      echo CWD is  %cd%
      echo correct CWD is !cd!
      cd
    popd
)
popd