我发现%~dp0
非常有用,我使用它来使我的批处理文件更具可移植性。
但标签本身对我来说似乎很神秘...... ~
在做什么? dp
是否意味着驱动器和路径? 0
是否引用%0
,批处理文件的路径包含文件名?
或者它只是一个奇怪的标签?
我也想知道它是否是一个记录在案的功能,或者是一些容易被弃用的东西。
答案 0 :(得分:727)
调用
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
是批处理文件的完整名称,就像你假设)。
答案 1 :(得分:294)
(首先,我想为批次推荐这个有用的参考站点: http://ss64.com/nt/)
然后只是另一个有用的解释:http://htipe.wordpress.com/2008/10/09/the-dp0-variable/
%~dp0变量
在Windows中引用时%~dp0(这是一个零)变量 批处理文件将扩展为该批次的 d 铆钉字母和 p 文件。
变量%0-%9指的是批处理的命令行参数 文件。 %1-%9指批处理文件名后的命令行参数。 %0表示批处理文件本身。
如果您使用波形符(〜)跟随百分比字符(%), 你可以在参数号之前插入一个修饰符来改变它 变量扩展的方式。 d修饰符扩展到驱动器 letter和p修饰符扩展为参数的路径。
示例:假设您在C上有一个目录:名为bat_files,和 在该目录中是一个名为example.bat的文件。在这种情况下,%~dp0 (将d和p修饰符组合在一起)将扩展为C:\ bat_files。
查看this Microsoft article以获取完整说明。
另外,请查看this forum thread。
来自here的更明确的参考:
%CmdCmdLine%
将返回传递给CMD.EXE的整个命令行
%*
将从第一个命令行参数开始返回命令行的其余部分(在Windows NT 4中,%*还包括所有前导空格)
%~dn
将返回%n的驱动器号(n的范围为0到9)
%~pn
将返回%n目录
%~nn
将仅返回%n的文件名
%~xn
将仅返回%n的文件扩展名
%~fn
将返回%n的完全限定路径
刚刚为神秘的 ~
代字号运算符找到了一些很好的参考。
%~
字符串称为percent tilde运算符。您可以在以下情况下找到它:%~0
。
:~
字符串称为colon tilde运算符。您可以找到%SOME_VAR:~0,-1%
。
%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\
答案 2 :(得分:142)
http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/percent.mspx?mfr=true
批处理脚本中的变量%0
设置为正在执行的批处理文件的名称。 ~dp
和%
之间的0
特殊语法基本上表示扩展变量%0
以显示驱动器号和路径,从而为您提供包含批处理的当前目录文件!
答案 3 :(得分:36)
%~dp0扩展到正在运行的批处理文件的当前目录路径。
为了清楚理解,让我们在目录中创建一个批处理文件。
C:\脚本\ test.bat的
内容:
@echo off
echo %~dp0
从命令提示符运行它时,您将看到以下结果:
C:\脚本\
答案 4 :(得分:32)
另一个有用的提示是将当前目录设置为不同的驱动器,首先必须使用 %~d0
,然后 cd %~dp0
即可。这会将目录更改为批处理文件的驱动器,然后更改为其文件夹。
或者,对于#oneLinerLovers,正如@Omni在评论中指出的 cd /d %~dp0
将更改驱动器和目录:)
希望这有助于某人。
答案 5 :(得分:21)
Strawberry Perl便携式贝壳发射器的典范:
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%
我不确定那些负面的人自己在做什么,但这是一种享受!
答案 6 :(得分:12)
一个例子很好 - 这是一个微不足道的
for %I in (*.*) do @echo %~xI
它仅列出当前文件夹中每个文件的EXTENSIONS
从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