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

我发现%~dp0非常有用,而且我用它来使我的batch file更加便携。

但是这个标签本身对我来说似乎很神秘……这是怎么回事? dp是指驱动器和path吗? 0是指%0 ,包含文件名的batch file的path?

还是只是一个奇怪的标签?

我也想知道它是否是一个logging的function,或者是容易被弃用的东西。

调用

 for /? 

在命令行中给出了关于这个语法的帮助(可以在FOR之外使用,这只是可以find帮助的地方)。

另外,FORvariables引用的replace已被增强。 您现在可以使用以下可选语法:

 %~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可以被其他有效的值replace。 %〜语法由一个有效的FORvariables名称终止。 采用大写字母variables名称(例如%I)使其更具可读性,并避免与大小写不敏感的修饰符混淆。

你可以使用不同的字母,如f用于“完整path名称”, d表示驱动器号, p表示path,可以组合使用。 %~是每个序列的开始,数字I表示它对参数%I起作用(其中%0是batch file的完整名称,就像您假设的那样)。

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

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

%〜dp0variables

在Windowsbatch file中引用的%〜dp0(这是一个零)variables将扩展到该batch file的字母和数字。

variables%0-%9是指batch file的命令行参数。 %1-%9是指batch file名后面的命令行参数。 %0是指batch file本身。

如果使用波形符号(〜)跟随百分号(%),则可以在参数编号之前插入一个修饰符,以更改variables的扩展方式。 d修饰符展开为盘符,p修饰符展开为参数的path。

例子:假设你在C:上有一个名为bat_files的目录,在那个目录下有一个叫做example.bat的文件。 在这种情况下,%〜dp0(组合d和p修饰符)将展开为C:\ bat_files。

查看这篇Microsoft文章的完整说明。

另外,看看这个论坛主题 。

并从这里更清楚的参考:

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

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

  • 如果%n是有效path或文件名(无UNC),% %~dn将返回%n的驱动器号(n可以从0到9)

  • %~pn将返回%n的目录,如果%n是一个有效的path或文件名(没有UNC)

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

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

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

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

批处理脚本中的variables%0被设置为正在执行的batch file的名称。 %0之间的~dp特殊语法基本上是说扩展variables%0来显示驱动器号和path,从而为您提供包含batch file的当前目录!

另一个有用的技巧是将当前目录设置为不同的驱动器 ,首先使用%~d0 cd %~dp0 ,然后cd %~dp0 。 这会将目录更改为batch file的驱动器,然后更改为其文件夹。

另外,对于#oneLinerLovers,@Omni在注释中指出cd /d %~dp0会改变驱动器和目录:)

希望这有助于某人。

%〜dp0展开为正在运行的batch file的当前目录path。

为了清楚理解,我们在目录中创build一个batch file。

C:\脚本\ test.bat的

内容:

 @echo off echo %~dp0 

当你从命令行运行它时,你会看到这个结果:

C:\脚本\

草莓Perl的便携式shell发射器的一个很好的例子:

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

不知道负面的1在那里做我自己,但它是一种享受!

一个例子会很好 – 这是一个微不足道的

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

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

对于更多有用的variables组合(也在前面的回答中列出),从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 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