【发布时间】:2019-10-29 12:59:39
【问题描述】:
我有两个批处理文件。
蝙蝠 1.bat
@echo OFF
setlocal
cd /d "%~dp0"
echo "%~dp0"
cmd /c call "Bat 2.bat"
endlocal
pause
蝙蝠 2.bat
@echo OFF
setlocal
echo "%~dp0"
cd /d "%~dp0..\.."
echo "%~dp0"
endlocal
两个文件都在同一个目录中,所以我希望echo "%~dp0" 每次都输出相同的东西。
但是,在调用cd /d "%~dp0..\.."之后,echo "%~dp0"输出的是当前目录而不是批处理文件所在的目录。为什么输出会改变?
预期
"C:\Testing\DP0 Wrong\"
"C:\Testing\DP0 Wrong\"
"C:\Testing\DP0 Wrong\"
实际
"C:\Testing\DP0 Wrong\"
"C:\Testing\DP0 Wrong\"
"C:\"
【问题讨论】:
-
去掉引号就可以了,在 bat1.bat
call Bat2.bat -
@jeb 这很奇怪。你知道这是为什么吗?我会修改这个问题,因为我真实场景中的批处理文件中有空格并且名称无法更改
-
在 SO 或 dostips.com 的某个地方对
%~dp0进行了长时间的分析(我猜来自 dbenham、Aacini 或可能来自我),但目前我再也找不到它了。但我记得带有%~0的批处理文件名中或周围的引号的一般问题。也许您应该在更改目录之前存储该值 -
@Stephan 这也很奇怪。但不幸的是,这个批处理文件引用了其他文件,所以我需要
%~dp0,因为脚本可能会从其他目录调用。 IE。有人从另一个目录的命令行调用它,或者它以管理员身份运行 -
@jeb 如果这是唯一的解决方案,我会这样做。谢谢
标签: windows batch-file cmd windows-10