【问题标题】:What does %~dp0 mean, and how does it work?%~dp0 是什么意思,它是如何工作的?
【发布时间】:2011-06-29 09:03:15
【问题描述】:

我发现%~dp0 非常有用,我经常使用它来使我的批处理文件更便携。

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

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

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

【问题讨论】:

  • 你是对的,海伦。当我搜索 %~dp0 时,这个问题没有出现。可能是因为它的标题上有 %~d0 而不是 %~dp0。
  • SymbolHound 非常适合对非字母数字字符进行搜索。例如,search for %~dp0。通常我发现热门点击是指 SO 上的内容。
  • SymbolHound 不适用于搜索 symbolhound.com/?q=%25~dp0。然而这有效:google.com/search?q=%25~dp0 - 只是说'...
  • SymbolHound 2019:不起作用,uMatrix 表明它连接到第三方网站,如 blockchain.info 和 paypalobjects.com。

标签: batch-file


【解决方案1】:

打电话

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

【讨论】:

  • 我不了解其他人,但我得到“以下在批处理参数替换中路径运算符的用法无效。对于有效格式,请键入 CALL /? 或 FOR /?。语法命令不正确。”使用I 时。我必须使用0 而不是I。我不知道我是否错过了什么或其他什么,只是让人们知道。
  • @BenHooper, I 是变量索引的占位符。 0 = 调用文件,1 = 参数 #1,2 = 参数 #2,等等...
  • 这个答案很好。并且详尽无遗。为了更简洁,我喜欢这个几乎重复的问题的答案:stackoverflow.com/questions/112055/…
  • 这个答案有点令人困惑,因为这些替换可以在 FOR 之外使用。
  • 请注意,如果您使用 Process.Start 直接从 C# 运行批处理文件,该批处理文件将扩展 %~dp0 作为 C# 程序的工作目录,而不是批处理文件的位置。如果您使用 Process.Start 来运行 cmd.exe,而后者又运行批处理文件(例如,使用参数 /C foo.bat),那么一切都很好。我怀疑这与 PATH 的扩展方式和位置有关。你可以设置Process的WorkingDirectory来解决这个问题。
【解决方案2】:

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

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

帮助 = Link

【讨论】:

  • @Andy,有没有什么方法可以直接在 cmd 中测试%0 而无需将 .bat 文件保存到本地硬盘?
  • 链接已损坏,我无法找到正确的链接。待处理的编辑仍然有损坏的链接。
【解决方案3】:

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

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

%~dp0 变量

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

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

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

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

查看this Microsoft article 了解完整说明。

另外,请查看this forum thread

还有来自here的更清晰的参考:

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

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

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

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

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

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

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

添加 1

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

%~ 字符串称为percent tilde 运算符。您可以在以下情况下找到它:%~0

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

添加 2 - 2018 年 7 月 6 日下午 1: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\

【讨论】:

  • 也对这个概念很好奇,在这里找到了很好的说明。谢谢明哥。 ^_^
  • 对我来说它扩展为 c:\bat_files\(带有尾随路径分隔符)
  • 微软文章和论坛主题的链接不再起作用:(
【解决方案4】:

举个例子就好了 - 这是一个简单的例子

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

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

对于更多有用的变量组合(也列在前面的响应中)从 CMD 提示符执行:HELP FOR 其中包含这个sn-p

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

%~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 吗?
  • 这是很好的信息,但它无法解决原始帖子。
  • @chapter3 ~xI~xlL / 低 = lI / 低 = i ? ?
【解决方案5】:

另一个很有帮助的提示是将当前目录设置为不同的驱动器,必须先使用 %~d0,然后再使用 @ 987654322@。这会将目录更改为批处理文件的驱动器,然后更改为它的文件夹。

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

希望这对某人有所帮助。

【讨论】:

  • cd 有一个内置参数可以切换驱动器和文件夹:cd /d %~dp0
  • 你是对的,/d 参数很有帮助,但它应该作为候选替代答案而不是评论发布到这个。 谢谢你指出这一点,但我不知道:)
  • 你也可以使用''pushd %~dp0''来切换驱动器和文件夹
【解决方案6】:

Strawberry 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 自己在那里做了什么,但它很管用!

【讨论】:

  • +1 非常有用。 if 语句检查是否存在反斜杠,并在必要时删除反斜杠。条件中的负 1 提取最后一个字符,set 语句中的表达式取路径字符串减去最后一个字符(即反斜杠)。
  • 负 1 是减去最后一个字符。阅读variable substring
【解决方案7】:

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

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

C:\script\test.bat

内容:

@echo off
echo %~dp0

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

C:\脚本\

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-27
    • 2012-08-21
    • 2022-12-10
    • 2021-09-16
    • 2011-06-07
    • 1970-01-01
    • 2013-08-21
    相关资源
    最近更新 更多