我发现 %~dp0
非常有用,我经常使用它来使我的批处理文件更便携。
但标签本身对我来说似乎很神秘...... ~
在做什么? dp
表示驱动器和路径吗? 0
是否引用 %0
,即包含文件名的批处理文件的路径?
或者它只是一个奇怪的标签?
我还想知道它是否是已记录的功能,还是容易被弃用的功能。
%~dp0
。通常我发现最热门的内容是指 SO 上的内容。
打电话
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
是批处理文件的完整名称,就像您假设的那样)。
(首先,我想推荐这个有用的批处理参考站点: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\
批处理脚本中的变量 %0
设置为正在执行的批处理文件的名称。
%
和 0
之间的 ~dp
特殊语法基本上表示扩展变量 %0
以显示驱动器号和路径,从而为您提供包含批处理文件的当前目录!
帮助 = Link
%0
而无需将 .bat 文件保存到本地硬盘?
%~dp0 扩展为正在运行的批处理文件的当前目录路径。
为了清楚地理解,让我们在目录中创建一个批处理文件。
C:\脚本\test.bat
内容:
@echo off
echo %~dp0
从命令提示符运行它时,您将看到以下结果:
C:\脚本\
另一个很有帮助的提示是,要将当前目录设置为不同的驱动器,必须先使用 %~d0
,然后再使用 cd %~dp0
< /强>。这会将目录更改为批处理文件的驱动器,然后更改为其文件夹。
或者,对于#oneLinerLovers,正如@Omni 在评论中指出的那样 cd /d %~dp0
将同时更改驱动器和目录 :)
希望这可以帮助某人。
cd
有一个内置参数,可以同时切换驱动器和文件夹:cd /d %~dp0
/d
参数很有帮助,但值得将其发布为 候选替代答案,而不是对此答案的评论。 谢谢你指出这一点,我不知道 :)
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 自己在那里做什么,但它很有效!
一个例子会很好 - 这是一个微不足道的例子
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
~xI
或 ~xl
或 L / 低 = l
或 I / 低 = i
? 😲
I
时。我必须使用0
而不是I
。我不知道我是否错过了什么或其他什么,只是让人们知道。I
是变量索引的占位符。0
= 调用文件,1
= 参数 #1,2
= 参数 #2,等等...%~dp0
作为 C# 程序的工作目录,而不是批处理文件的位置。如果您使用 Process.Start 运行cmd.exe
,而后者又运行批处理文件(例如使用参数/C foo.bat
),那么一切都很好。我怀疑这与 PATH 的扩展方式和位置有关。您可以设置 Process 的 WorkingDirectory 来解决这个问题。