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

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

但是标签本身对我来说似乎很神秘……~在做什么?dp是指驱动器和路径吗?0是指%0,批处理文件的路径,包括文件名吗?

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

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

1204967 次浏览

呼唤

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 PATHenvironment variable and expands %I to thefully qualified name of the first one found.If the environment variable name is notdefined or the file is not found by thesearch, then this modifier expands to theempty 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 PATHenvironment variable for %I and expands to thedrive 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是批处理文件的完整名称,就像您假设的那样)。

批处理脚本中的变量%0设置为正在执行的批处理文件的名称。

%0之间的~dp特殊语法基本上说展开变量%0以显示驱动器号和路径,它为您提供包含批处理文件的当前目录!

帮助=Link

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

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

%~dp0变量

在Windows中引用时的%~dp0(零)变量批处理文件将扩展为该批处理的drive字母和path文件。

变量%0-%9引用批处理的命令行参数file.%1-%9引用批处理文件名之后的命令行参数。%0表示批处理文件本身。

如果您在百分比字符(%)后面跟一个波浪号字符(~),您可以在参数号之前插入修饰符以更改变量展开的方式。d修饰符扩展到驱动器p修饰符扩展到参数的路径。

示例:假设您在C:上有一个名为bat_files的目录,并且在该目录中有一个名为example.bat的文件。在这种情况下,%~dp0(结合dp修饰符)将扩展到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的完全限定路径

ADD1

刚刚为神秘~波浪号运算符找到了一些很好的参考。

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

:~字符串称为结肠波浪运算符。您可以像%SOME_VAR:~0,-1%一样找到它。

ADD 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\

举个例子就好了,这里有个小例子

for %I in (*.*) do @echo %~xI

它只列出了当前文件夹中每个文件的扩展

从CMD提示符执行更多有用的变量组合(也在之前的响应中列出):HELP FOR其中包含此代码段

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

%~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 PATHenvironment variable for %I and expands to thedrive letter and path of the first one found.%~ftzaI     - expands %I to a DIR like output line

另一个有很大帮助的提示是,要将当前目录设置为不同的驱动器,必须先使用#0,然后使用#1。这将把目录更改为批处理文件的驱动器,然后更改为其文件夹。

或者,对于#oneLinerLovers,正如@Omni在评论#0中指出的那样,将更改驱动器和目录:)

希望这有助于某人。

来自Strawberry Perl的便携式shell启动器的一个很好的例子:

set drive=%~dp0set drivep=%drive%if #%drive:~-1%# == #\# set drivep=%drive:~0,-1%
set PATH=%drivep%\perl\site\bin;%drivep%\perl\bin;%drivep%\c\bin;%PATH%

我不确定负1在那里做什么,但它是一种享受!

%~dp0扩展到正在运行的批处理文件的当前目录路径。

为了清楚地理解,让我们在目录中创建一个批处理文件。

C:\脚本\test.bat

内容:

@echo offecho %~dp0

当您从命令提示符运行它时,您将看到以下结果:

C:\脚本