协慌网

登录 贡献 社区

%~dp0 是什么意思,它是如何工作的?

我发现%~dp0非常有用,我使用它来使我的批处理文件更具可移植性。

但标签本身似乎很神秘,我... 什么是~做什么? dp是指驱动器和路径吗? 0是否指向%0 ,包含文件名的批处理文件的路径?

或者它只是一个奇怪的标签?

我还想知道它是否是一个记录的功能,或者是一些容易被弃用的东西。

答案

调用

for /?

在命令行中提供有关此语法的帮助(也可以在 FOR 之外使用,这只是可以找到帮助的地方)。

此外,FOR 变量引用的替换已得到增强。您现在可以使用以下可选语法:

%~I         - expands %I removing any surrounding quotes (")
%~fI        - expands %I to a fully qualified path name
%~dI        - expands %I to a drive letter only
%~pI        - expands %I to a path only
%~nI        - expands %I to a file name only
%~xI        - expands %I to a file extension only
%~sI        - expanded path contains short names only
%~aI        - expands %I to file attributes of file
%~tI        - expands %I to date/time of file
%~zI        - expands %I to size of file
%~$PATH:I   - searches the directories listed in the PATH
               environment variable and expands %I to the
               fully qualified name of the first one found.
               If the environment variable name is not
               defined or the file is not found by the
               search, then this modifier expands to the
               empty string

可以组合修饰符以获得复合结果:

%~dpI       - expands %I to a drive letter and path only
%~nxI       - expands %I to a file name and extension only
%~fsI       - expands %I to a full path name with short names only
%~dp$PATH:I - searches the directories listed in the PATH
               environment variable for %I and expands to the
               drive letter and path of the first one found.
%~ftzaI     - expands %I to a DIR like output line

在上面的例子中,%I 和 PATH 可以被其他有效值替换。 %〜语法由有效的 FOR 变量名终止。选择大写变量名称(如%I)使其更具可读性并避免与修饰符混淆,修饰符不区分大小写。

您可以使用不同的字母,例如f表示 “完整路径名称”, d表示驱动器号, p表示路径,它们可以组合使用。 %~是每个序列的开头,数字I表示它适用于参数%I (其中%0是批处理文件的完整名称,就像您假设的那样)。

(首先,我想推荐这个有用的批量参考站点: http//ss64.com/nt/

然后只是另一个有用的解释: http//htipe.wordpress.com/2008/10/09/the-dp0-variable/

%~dp0 变量

在 Windows 批处理文件中引用时,%~dp0(即零)变量将扩展为该批处理文件的d rive 字母和p ath。

变量%0-%9 指的是批处理文件的命令行参数。 %1-%9 指批处理文件名后的命令行参数。 %0 表示批处理文件本身。

如果使用波形符(〜)跟随百分比字符(%),则可以在参数编号之前插入修饰符以更改变量的展开方式。 d 修饰符将扩展为驱动器号,p 修饰符将扩展为参数的路径。

示例:假设您在 C 上有一个目录:名为 bat_files,该目录中有一个名为 example.bat 的文件。在这种情况下,%~dp0(组合 d 和 p 修饰符)将扩展为 C:\ bat_files。

查看此 Microsoft 文章以获取完整说明。

另外,请查看此论坛帖子

而从一个更明确的参考这里

  • %CmdCmdLine%将返回传递给 CMD.EXE 的整个命令行

  • %*将从第一个命令行参数开始返回命令行的其余部分(在 Windows NT 4 中,%* 还包括所有前导空格)

  • 如果%n 是有效路径或文件名(无 UNC), %~dn将返回%n 的驱动器号(n 的范围为 0 到 9)

  • 如果%n 是有效路径或文件名(无 UNC), %~pn将返回%n 目录

  • 如果%n 是有效的文件名, %~nn将仅返回%n 的文件名

  • 如果%n 是有效的文件名, %~xn将仅返回%n 的文件扩展名

  • 如果%n 是有效的文件名或目录, %~fn将返回%n 的完全限定路径

添加 1

刚刚为神秘的 ~波浪运营商找到了一些很好的参考。

%~字符串称为百分比波浪号运算符。您可以在以下情况下找到它: %~0

:~字符串称为冒号代码运算符。您可以找到%SOME_VAR:~0,-1%

添加 2 - 下午 1:12 PM 7/6/2018

%1-%9指的是命令行参数。如果它们不是有效的路径值, %~dp1 - %~dp9将全部扩展为与%~dp0相同的值。但如果它们有效的路径值,它们将扩展为自己的驱动程序 / 路径值。

例如:(batch.bat)

@echo off
@echo ~dp0= %~dp0
@echo ~dp1= %~dp1
@echo ~dp2= %~dp2
@echo on

运行 1:

D:\Workbench>batch arg1 arg2

~dp0= D:\Workbench\
~dp1= D:\Workbench\
~dp2= D:\Workbench\

运行 2:

D:\Workbench>batch c:\123\a.exe e:\abc\b.exe

~dp0= D:\Workbench\
~dp1= c:\123\
~dp2= e:\abc\

http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/percent.mspx?mfr=true

批处理脚本中的变量%0设置为正在执行的批处理文件的名称。 %0之间的~dp特殊语法基本上表示扩展变量%0以显示驱动器号和路径,它为您提供包含批处理文件的当前目录!