ChatGPT解决这个技术问题 Extra ChatGPT

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

我发现 %~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。

s
schnaader

打电话

for /?

在命令行中提供有关此语法的帮助(也可以在 FOR 外部使用,这只是可以找到帮助的地方)。

此外,增强了 FOR 变量引用的替换。您现在可以使用以下可选语法: %~I - 扩展 %I 删除任何周围的引号 (") %~fI - 将 %I 扩展为完全限定的路径名 %~dI - 仅将 %I 扩展为驱动器号 %~ pI - 仅将 %I 扩展为路径 %~nI - 仅将 %I 扩展为文件名 %~xI - 仅将 %I 扩展为文件扩展名 %~sI - 扩展路径仅包含短名称 %~aI - 扩展 %I到文件 %~tI 的文件属性 - 将 %I 扩展到文件的日期/时间 %~zI - 将 %I 扩展到文件的大小 %~$PATH:I - 搜索 PATH 环境变量中列出的目录并将 %I 扩展到找到的第一个的全限定名,如果没有定义环境变量名或者搜索不到文件,那么这个修饰符扩展为空字符串 修饰符可以组合得到复合结果: %~dpI -仅将 %I 扩展为驱动器号和路径 %~nxI - 仅将 %I 扩展为文件名和扩展名 %~fsI - 将 %I 扩展为仅具有短名称的完整路径名 %~dp$PATH:I - 搜索直接%I 的 PATH 环境变量中列出的目录,并扩展为找到的第一个驱动器号和路径。 %~ftzaI - 将 %I 扩展为类似 DIR 的输出行 在上面的示例中,%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 来解决这个问题。
C
CitizenInsane

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

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

%~dp0 变量 在 Windows 批处理文件中引用时,%~dp0(即零)变量将扩展为该批处理文件的驱动器号和路径。变量 %0-%9 指的是批处理文件的命令行参数。 %1-%9 引用批处理文件名后的命令行参数。 %0 指的是批处理文件本身。如果您在百分号 (%) 后面加上波浪号 (~),则可以在参数编号前插入修饰符以更改变量的扩展方式。 d 修饰符扩展为驱动器号,p 修饰符扩展为参数的路径。示例:假设您在 C: 上有一个名为 bat_files 的目录,该目录中有一个名为 example.bat 的文件。在这种情况下,%~dp0(结合 d 和 p 修饰符)将扩展为 C:\bat_files\。查看这篇 Microsoft 文章以获得完整的解释。另外,请查看此论坛主题。

here 提供了更清晰的参考:

%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 的完全限定路径

加 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\ (带有尾随路径分隔符)
Microsoft 文章和论坛主题的链接不再起作用:(
T
Theraot

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

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

帮助 = Link


@Andy,有没有办法直接在 cmd 中测试 %0 而无需将 .bat 文件保存到本地硬盘?
链接已损坏,我无法找到正确的链接。待处理的编辑仍然有断开的链接。
n
null

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

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

C:\脚本\test.bat

内容:

@echo off
echo %~dp0

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

C:\脚本\


M
Marvin Thobejane

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

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

希望这可以帮助某人。


cd 有一个内置参数,可以同时切换驱动器和文件夹:cd /d %~dp0
您是对的,/d 参数很有帮助,但值得将其发布为 候选替代答案,而不是对此答案的评论谢谢你指出这一点,我不知道 :)
您也可以使用 ''pushd %~dp0'' 切换驱动器和文件夹
H
HansBKK

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

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

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

关注公众号,不定期副业成功案例分享
关注公众号

不定期副业成功案例分享

领先一步获取最新的外包任务吗?

立即订阅