.BAT 文件中的 %0 不正确

Incorrect %0 in a .BAT file

我刚刚注意到 %0 在通过 %PATH%.

调用的 .bat 文件中有一个非常奇怪的行为

%PATH% 的某处,(例如,C:\InPath,创建文件 xxx.bat 包含:

@echo off
echo this = %~f0

在另一个目录中,不在 %PATH%(例如 C:\NotInPath 中,创建文件 yyy.bat 包含:

@echo off
call "xxx.bat"

将工作目录更改为任何内容(例如 C:\SomewhereElse)和 运行 yyy.bat。我希望看到的是:

this = C:\InPath\xxx.bat

我实际得到的是:

this = C:\SomewhereElse\xxx.bat

问题显然是由 call 中的引号引起的,因为如果我将 yyy.bat 中的 call 行更改为 call xxx.bat,我会得到预期的输出.

我想知道造成这种行为差异的原因是什么,如果我可以做些什么来获得正确的输出,即使使用引号 - 例如方便包含 space 字符的脚本。在不执行 cmd.exe 的新实例的情况下,即 - 我需要被调用的脚本来设置一些环境值以供调用者脚本读取 .

您可以使用

修复它
@echo off
echo This can be wrong %~f0

call :fixIt
exit /b

:fixIt
echo FixIt %~f0

Link 到 MC ND
的一个很好的解释 SO:What is the reason for batch file path referenced with %~dp0 sometimes changes on changing directory?