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


1022

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

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

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

我还想知道它是否是一个已记录的功能,或易于弃用的功能。



2
你说得对,海伦。当我搜索%〜dp0时,这个问题没有出现。可能是因为它的标题上有%〜d0而不是%〜dp0。
塞巴斯蒂安·格里尼戈利

9
SymbolHound非常适合对字母数字字符以外的字符进行搜索。例如,搜索%~dp0。通常,我发现热门歌曲是指SO上的内容。
DavidRR 2015年

SymbolHound在搜索symbolhound.com/?q=%25~dp0中对我不起作用。但这有效:google.com/search ?
q=%25

1
SymbolHound 2019:不起作用,并且uMatrix表示它已连接到诸如blockchain.info和paypalobjects.com之类的第三方站点。
尼尔斯·林德曼

Answers:


810

呼唤

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是批处理文件的完整名称,就像您假设的一样)。


2
我不知道其他人,但是得到“在批参数替换中,路径运算符的以下用法无效。对于有效格式,请键入CALL /?或FOR /?。该命令的语法不正确。” 使用时I。我必须使用0代替I。我不知道我是否错过任何事情,只是让人们知道。
mythofechelon 2012年

71
@BenHooper,I是变量索引的占位符。0=调用文件,1=参数#1,2=参数#2,等等...
克里斯(Chris

9
这个答案很好。并且详尽无遗。对于有点更简洁,我喜欢这个问题的答案几乎复本问题:stackoverflow.com/questions/112055/...
弗兰克Nocke

1
这个答案有点令人困惑,因为这些替换可以在FOR之外使用。
大卫

346

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

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

%〜dp0变量

当Windows批处理文件中引用将扩大到该%〜DP0(这是一个零)可变d里沃信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中,%*还包括所有前导空格)

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

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

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

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

  • %~fn 如果%n是有效的文件名或目录,将返回%n的标准路径

加1

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

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

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

添加2018年6月6日下午2:12

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

也对此概念感到好奇,并在此处找到了很好的说明。谢谢鸣哥 ^ _ ^
尤金(Eugene)'18

1
对我来说,它扩展为c:\ bat_files \(带有尾随路径分隔符)
圣诞老人

Microsoft文章和论坛线程的链接不再起作用:(
wovano

150

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

~dp之间特殊语法%0基本上说来扩展变量%0,显示驱动器号和路径,它给你含有批处理文件的当前目录!

帮助= 链接


@Andy,有什么方法可以%0直接在cmd中进行测试,而无需将.bat文件保存到本地硬盘中?
和平者

链接已损坏,我找不到正确的链接。待处理的编辑仍然具有断开的链接。
George_E

44

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

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

C:\ script \ test.bat

内容:

@echo off
echo %~dp0

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

C:\脚本\


40

另一个有用的技巧是将当前目录设置为其他驱动器%~d0,然后必须使用cd %~dp0。这会将目录更改为批处理文件的驱动器,然后更改为其文件夹。

另外,对于#oneLinerLovers,如@Omni在注释中指出的,cd /d %~dp0将同时更改驱动器和目录:)

希望这对某人有帮助。


22
cd具有一个内置参数,它将同时切换驱动器和文件夹:cd /d %~dp0
OmnipotentEntity,2012年

2
您说/d对了,但论点很有帮助,但应将其作为候选替代答案发布,而不应对此发表评论谢谢您指出这一点,但我对此一无所知:)
Marvin Thobejane 2012年

4
您还可以使用“ pushd%〜dp0”来切换驱动器和文件夹
fmuecke 2014年

25

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%

不确定负数1自己在做什么,但可以有效!


11
+1非常有用。if语句检查是否存在反斜杠,并在必要时删除反斜杠。条件中的负1提取最后一个字符,而set语句中的表达式采用路径字符串减去最后一个字符(即反斜杠)。
马特2012年

1
负1减去最后一个字符。读取变量子字符串
phuclv

12

一个例子很好-这是一个简单的例子

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

我得到了“〜x这一次我很意外。” 试用示例-是因为我使用的是Win 7吗?
第三章

这是很好的信息,但是无法解决原始帖子。
巴蒂斯特
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.