Windows批处理文件中的popd命令无法按预期工作

3
我正在使用以下批处理脚本运行Java命令行工具。
@echo off
pushd %~dp0
setLocal EnableDelayedExpansion
set CLASSPATH="
for /R ./libs %%a in (*.jar) do (
    set CLASSPATH=!CLASSPATH!;%%a
)
set CLASSPATH=!CLASSPATH!"
java -cp !CLASSPATH! com.example.CLIApplication %*
popd

我已经将该工具目录添加到系统变量PATH中,这样我就可以通过命令提示符从任何目录运行它。虽然这种方法可行,但是我遇到的问题是:
该工具目录是C:\tool\ 用户当前在C:\ 执行批处理文件后,用户留在了C:\tool\而不是C:\
调用popd时,控制台跳转回了C:\tool\,而不是停留在C:\
如何确保脚本完成后不更改用户的目录?

我正在做完全相同的事情,也遇到了同样的问题! - sunny
2个回答

5

setlocal 没有 endlocal 导致了这个问题。

在调用 popd 之前,只需要添加一个 endlocal

在你的代码中,popd 返回到你的第一个目录,但是由于 setlocal 存储所有变量,并且当批处理程序退出时隐式地关闭所有打开的 setlocal,它也会恢复 cd 变量。


1
我可能有些偏离主题,但为什么你不使用以下代码:


pushd .

使用 pushd %~dp0 更好,以防某人以“管理员身份运行”。在这种情况下,CD 会更改。 - RGuggisberg

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接