批处理脚本:%0和%~f0之间有什么区别?

Jam*_* Ko 5 windows cmd batch-file command-prompt windows-10

我有一个Batch脚本,我想在其中获取脚本的完整路径.我很好奇,这有什么区别:

set scriptpath=%0
Run Code Online (Sandbox Code Playgroud)

还有这个:

set scriptpath=%~f0
Run Code Online (Sandbox Code Playgroud)

谢谢你的帮助.

Mof*_*ofi 8

%0 引用参数0 - 批处理文件的名称 - 始终完全按照命令行或另一个批处理文件中的指定.

因此,如果命名的批处理文件Test.bat存储在C:\Temp开始例如从一个命令提示窗口内与当前的目录是C:\temp\test,然后%0被取代的temp\test对参考.

%~f0几乎总是被批处理文件名替换为文件扩展名和完整路径 - 完全限定文件名 - 并且即使文件名或路径包含1个或多个字符(如空格或&()[]{}^=;!'+,`~通常需要使用双引号),也始终没有双引号.

因此批处理文件Test.bat存储C:\Temp在行中

@echo %0
@echo %~f0
Run Code Online (Sandbox Code Playgroud)

从命令提示符窗口开始"temp\test.bat",当前目录为C:\输出:

"temp\test.bat"
C:\Temp\Test.bat
Run Code Online (Sandbox Code Playgroud)

你可以在这里看到所有的差异:

  • 完全限定的批处理文件名,
  • 总是没有双引号和
  • 正确的所有字母的情况.

在运行时或在命令FOR的帮助下,在命令提示符窗口中运行并读取所有显示的页面时,%~f0可以在命令CALL输出的帮助下读取对其他替换的描述和其他替换.call /?for /?

注1:

如果稍后在批处理文件中需要,则将完全限定的批处理文件名分配给环境变量,并使用CDPUSHD从批处理文件中修改当前目录.因此,请参阅更改目录中的批处理文件~dp0中的答案.

笔记2:

从上面运行示例批处理文件C:\只有"temp\test"输出中的结果:

"temp\test"
C:\Temp\Test
Run Code Online (Sandbox Code Playgroud)

缺少文件扩展名,这是由第一个注释的引用主题中描述的错误引起的.在temp\test没有双引号的情况下启动批处理文件会产生预期的输出:

temp\test
C:\Temp\Test.bat
Run Code Online (Sandbox Code Playgroud)


Cod*_*ray 5

%~f0导致%0扩展为完全限定的路径名​​。它们可能相等也可能不相等,这取决于 的原始值%0是什么。

这些修饰符的含义隐藏在For命令的文档中。