有没有办法pushd
在脚本结束时撤消所有内容。我所拥有的是:
pushd somwhere
rem doing stuff
goto end
:end
popd
goto :EOF
我想要的是:
setlocal
pushd somwhere
rem doing stuff
goto :EOF
但这不起作用,目录保持“pushd”。pushd
我不能说会发生多少的另一个尝试是:
set CurrentDir=%CD%
rem doing a lot of pushd and popd
pushd somwhere
:POPBACK
if /i not "%CD%" == "%CurrentDir%" popd & goto POPBACK
但这看起来我很容易陷入:POPBACK
. 添加一个计数器以退出该循环有点不确定我最终会在哪个目录。
在那种情况下,我想知道是否可以看到推送目录的堆栈。$+
我发现的唯一内容是prompt $P$+$G
为每个 pushd 目录添加一个“+”,例如D:\CMD++>
. 但我看不出如何利用它。
编辑:我只是注意到这让我感到困惑$+
。prompt
上setlocal
例中的实际使脚本返回到初始目录,但提示符显示一个 '+' 表示缺少popd
.
D:\CMD>test.cmd
D:\CMD>prompt $P$+$g
D:\CMD>setlocal
D:\CMD>pushd e:\DATA
e:\DATA+>goto :EOF
D:\CMD+>popd
D:\CMD>
编辑:由于提示本地环境和目录堆栈之间的差异,我扩展了上面的示例表单,在调用脚本之前推送到 C:\DATA。脚本返回到从 (C:\DATA) 调用它的位置。到目前为止,一切都很好。第一个popd
显示没有效果,因为它从堆栈中删除了最后一个pushd
但不更改目录,因为目录更改已由(隐式)endlocal 撤消。第二个popd
按预期返回初始目录。
D:\CMD>pushd C:\DATA
C:\DATA+>d:\cmd\test.cmd
C:\DATA+>prompt $P$+$g
C:\DATA+>setlocal
C:\DATA+>pushd e:\DATA
e:\DATA++>goto :EOF
C:\DATA++>popd
C:\DATA+>popd
D:\CMD>