- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
有没有办法在脚本末尾撤消所有 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>
最佳答案
pushd
command不带任何参数列出目录堆栈的内容,可以通过使用 output redirection >
编写列表来使用它。到一个(临时)文件,然后由 for /F
loop 读取,并确定有多少 popd
commands是必须的。
在 batch-file 中:
pushd > "tempfile.tmp" && (
for /F "usebackq delims=" %%P in ("tempfile.tmp") do popd
del "tempfile.tmp"
)
直接在cmd :
pushd > "tempfile.tmp" && (for /F "usebackq delims=" %P in ("tempfile.tmp") do @popd) & del "tempfile.tmp"
注意,您不能使用 for/F "delims="%P in ('pushd') do ( ... )
,因为 for /F
将在 cmd.exe
的新实例中执行 pushd
,它有自己的新 pushd
/popd
堆栈。
防止 pushd
/popd
堆栈残留的一种方法是简单地避免 pushd
并使用 cd /D
而是在本地化环境中(通过 setlocal
/endlocal
在批处理文件中),因为与 popd
不同,endlocal
会在必要时隐式执行(即使批处理文件包含导致中止执行的 fatal error 的错误语法,例如 rem %~
)。这当然只在没有 UNC 路径需要处理(即映射到本地路径)时才有效。
建议仅在没有任何分支的有限代码段中使用 pushd
/popd
(通过 if
、goto
等)。此外,请确保考虑潜在错误(在此处使用 conditional execution):
rem // First stack level:
pushd "D:\main" && (
rem // Second stack level:
pushd "D:\main\sub" && (
rem /* If `D:\main\sub` does not exist, `pushd` would obviously fail;
rem to avoid unintended `popd`, use conditional execution `&&`: */
popd
)
rem // We are still in directory `D:\main` here as expected.
popd
)
关于windows - 批处理退出时隐含 "popd",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/71045685/
每次我使用 pushd 或 popd 时,它都会将堆栈打印到标准输出。如何不这样做? 我不想每次都执行 pushd >/dev/null 因为我有很多脚本互相调用。 也许一个很好的覆盖就可以做到,但我
每次我使用 pushd 或 popd 时,它都会将堆栈打印到标准输出。如何不这样做? 我不想每次都执行 pushd >/dev/null 因为我有很多脚本互相调用。 也许一个很好的覆盖就可以做到,但我
有没有办法在脚本末尾撤消所有 pushd。我所拥有的是: pushd somwhere rem doing stuff goto end :end popd goto :EOF 我想要的是: setl
我不知道是否有有效的方法来做到这一点。但是,一直想看看它是否可能。 我知道 pushd、popd 和 dirs 对于许多事情都很有用,例如在您最近访问过的目录之间进行复制。 但是,有没有一种方法可以保
KSH 是否有等效于 bash pushd/popd 的内置命令? 对于那些不知道 bash 中的 pushd 和 popd 做什么的人,这里是手册页中的描述 pushd [-n] [dir]
我正在使用以下批处理脚本来运行 Java 命令行工具。 @echo off pushd %~dp0 setLocal EnableDelayedExpansion set CLASSPATH=" fo
我在尝试从共享网络驱动器获取文件时收到“不支持 UNC 路径”错误。 我的研究告诉我 pushd 和 popd 可能有帮助,但我不知道如何正确使用它们。 pushd 和 popd 有哪些好的用法示例?
当使用这两个命令优于 cd 和 cd - 时,pushd 和 popd 的实际用途是什么? 最佳答案 实际用途是你可以建立一堆目录,形成你去过的地方的踪迹,只需替换cd即可。与 pushd . 然后,
我在我的 bash 脚本中遇到了一些麻烦来做一些适当的“pushd/popd 清理”。也就是说:如果我执行了几次 pushd,我想确保在 exit 之前执行相同数量的 popd。 但是,我注意到 pu
有没有办法在 Dockerfile 中使用 pushd/popd 命令?如果可能的话,它会使一些安装脚本变得更容易。 最佳答案 可以做到,但你的图像必须有 bash 并且所有命令必须在同一个 RUN
我正在编写一个 Bash 脚本,我想 checkout 一个标签,然后 checkout 回到我开始的地方。 我尝试了 git co HEAD@{1},但是当从 master 开始时,这让我回到了 m
我无法理解 powershell 中 pushd、popd 和 robocopy 命令的工作原理。谁能通俗易懂地解释一下? 最佳答案 我不确定你所说的外行术语是什么意思。 从概念上讲,PUSH 和 P
我的 bash (4.1) 目录堆栈通常有十几个或更多条目。我想用 dirs -v 替换 dirs 的输出,所以我再也不用用 pushd 玩“猜魔数(Magic Number)”了。 我的部分解决方案
我正在运行以下批处理文件来运行 SQL 中的存储包我得到一个 UNC Paths are not supported错误。如果我在服务器上运行它,它运行正确。如果我与其他用户共享它,它不会。我不想创建
有没有比 pushd 和 popd 更直观的处理目录堆栈的方法? 我发现 pushd 和 popd 内置命令的 CLI 呈现给用户有点令人难以置信。但与此同时,我很乐意经常使用 dirs 内置命令提供
在我一次又一次找不到答案后,我编写了这些脚本: :: if you still don't know the GNU-GPLv3. :: ------------------------
我是一名优秀的程序员,十分优秀!