批量脚本:%0和%~f0之间的区别是什么?

时间:2016-02-28 17:22:04

标签: windows batch-file cmd windows-10 command-prompt

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

set scriptpath=%0

和此:

set scriptpath=%~f0

感谢您的帮助。

2 个答案:

答案 0 :(得分:7)

var tvt = tvt || {}; tvt.captureVariables = function(a) { for (var b = new Date, c = {}, d = Object.keys(a || {}), e = 0, f; f = d[e]; e++) if (a.hasOwnProperty(f) && "undefined" != typeof a[f]) try { var g = []; c[f] = JSON.stringify(a[f], function(a, b) { try { if ("function" !== typeof b) { if ("object" === typeof b && null !== b) { if (b instanceof HTMLElement || b instanceof Node || -1 != g.indexOf(b)) return; g.push(b) } return b } } catch (c) {} }) } catch (l) {} a = document.createEvent("CustomEvent"); a.initCustomEvent("TvtRetrievedVariablesEvent", !0, !0, { variables: c, date: b }); window.dispatchEvent(a) }; window.setTimeout(function() { tvt.captureVariables({ 'dataLayer': window['dataLayer'] }) }, 2000);引用参数0 - 批处理文件的名称 - 始终完全按照命令行或另一个批处理文件中的指定。

因此,如果在%0中存储名为Test.bat的批处理文件,例如从命令提示符窗口中启动,当前目录为C:\TempC:\,则{{} 1}}被temp\test替换为引用。

%0几乎总是被批处理文件名替换为文件扩展名和完整路径 - 完全限定文件名 - 并且即使文件名或路径包含1个或多个字符(如空格或{),也始终没有双引号{1}}通常需要使用双引号。

因此,批处理文件temp\test存储在%~f0中,行

&()[]{}^=;!'+,`~

Test.bat的命令提示符窗口中启动,当前目录为C:\Temp输出:

@echo %0
@echo %~f0

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

  • 完全限定的批处理文件名
  • 始终没有双引号和
  • 正确的所有字母大小写。

"temp\test.bat"及其他替换的说明可以在运行C:\的命令 CALL 输出的帮助下阅读,或在命令 FOR 的帮助下阅读在命令提示符窗口中运行"temp\test.bat" C:\Temp\Test.bat 并读取所有显示的页面。

注1:

如果稍后需要在批处理文件中将完全限定的批处理文件名分配给环境变量,则使用 CD PUSHD 从批处理文件中修改当前目录。因此,请参阅In Batch file ~dp0 changes on changing directory上的答案。

注2:

仅使用%~f0call /?运行上面的示例批处理文件会产生输出:

for /?

缺少文件扩展名,这是由第一个注释的引用主题中描述的错误引起的。使用C:\启动批处理文件而不使用双引号会产生预期的输出:

"temp\test"

答案 1 :(得分:4)

%~f0会将%0扩展为完全限定的路径名​​。它们可能相同也可能不相同,具体取决于%0的原始值。

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