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

Seb*_*oli 970 batch-file

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

但标签本身对我来说似乎很神秘......这是~做什么的?是什么dp意思驱动器和路径?是否0引用%0包含文件名的批处理文件的路径?

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

我还想知道它是否是一个记录的功能,或者是一些容易被弃用的东西.

sch*_*der 768

调用

for /?
Run Code Online (Sandbox Code Playgroud)

在命令行中提供有关此语法的帮助(也可以在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
Run Code Online (Sandbox Code Playgroud)

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

%~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
Run Code Online (Sandbox Code Playgroud)

在上面的例子中,%I和PATH可以被其他有效值替换.%〜语法由有效的FOR变量名终止.选择大写变量名称(如%I)使其更具可读性并避免与修饰符混淆,修饰符不区分大小写.

您可以使用不同的字母,如f"完整路径名称",d驱动器号,p路径,它们可以组合使用.%~是每个序列的开头,数字I表示它适用于参数%I(%0批处理文件的完整名称,就像您假设的那样).

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

smw*_*dia 328

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

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

%~dp0变量

在Windows批处理文件中引用时,%~dp0(即零)变量将扩展为该批处理文件的d rive字母和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%.

添加2 - 下午1:12 PM 7/6/2018

%1-%9请参阅命令行参数.如果它们不是有效的路径值,%~dp1- %~dp9将全部扩展为相同的值%~dp0.但如果它们有效的路径值,它们将扩展为自己的驱动程序/路径值.

例如:(batch.bat)

@echo off
@echo ~dp0= %~dp0
@echo ~dp1= %~dp1
@echo ~dp2= %~dp2
@echo on
Run Code Online (Sandbox Code Playgroud)

运行1:

D:\Workbench>batch arg1 arg2

~dp0= D:\Workbench\
~dp1= D:\Workbench\
~dp2= D:\Workbench\
Run Code Online (Sandbox Code Playgroud)

运行2:

D:\Workbench>batch c:\123\a.exe e:\abc\b.exe

~dp0= D:\Workbench\
~dp1= c:\123\
~dp2= e:\abc\
Run Code Online (Sandbox Code Playgroud)

  • 对我来说它扩展到 c:\bat_files\ (带有尾随路径分隔符) (2认同)
  • 如果您给它相对路径,它们将扩展为相对路径,这意味着相对于您当前的目录...在您的测试中,它恰好与“%~dp0”位于同一目录。`%~dp1` 不会因为文件 `arg1` 不存在而神奇地变成 `%~dp0`;您可能希望您的批处理文件来创建它! (2认同)

And*_*ite 147

http://www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/percent.mspx?mfr=true

%0批处理脚本中的变量设置为正在执行的批处理文件的名称.该~dp之间特殊语法%0基本上说来扩展变量%0,显示驱动器号和路径,它给你含有批处理文件的当前目录!


nul*_*ull 41

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

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

C:\脚本\ test.bat的

内容:

@echo off
echo %~dp0
Run Code Online (Sandbox Code Playgroud)

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

C:\脚本\


Mar*_*ane 38

另一个技巧,将有很大的帮助是当前目录设置为不同的驱动器一个将不得不使用%~d0第一,然后cd %~dp0.这会将目录更改为批处理文件的驱动器,然后更改为其文件夹.

或者,对于#oneLinerLovers,因为@Omni在注释中指出cd /d %~dp0将改变驱动器和目录:)

希望这有助于某人.

  • `cd`有一个内置参数,可以切换驱动器和文件夹:`cd/d%~dp0` (21认同)
  • 你也可以使用''pushd%~dp0''切换驱动器和文件夹 (4认同)
  • 您是对的,`/ d`参数很有帮助,但应作为**候选替代答案**和**不能对此发表评论**发布。_谢谢您指出这一点,但我对此一无所知:) (2认同)

小智 24

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%
Run Code Online (Sandbox Code Playgroud)

不知道负面的1在那里做什么,但它有效!

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

小智 12

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

for %I in (*.*) do @echo %~xI
Run Code Online (Sandbox Code Playgroud)

它仅列出当前文件夹中每个文件的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
Run Code Online (Sandbox Code Playgroud)