首页 文章

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

提问于
浏览
850

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

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

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

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

7 回答

  • 11

    调用

    for /?
    

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

    此外,FOR变量引用的替换已得到增强 . 您现在可以使用以下可选语法:%~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 - 搜索PATH中列出的目录
    %I的环境变量并扩展为
    找到第一个驱动器号和路径 .
    %~ftzaI - 将%I扩展为类似于输出行的DIR
    在上面的例子中,%I和PATH可以被其他有效值替换 . %〜语法由有效的FOR变量名终止 . 选择大写变量名称(如%I)使其更具可读性并避免与修饰符混淆,修饰符不区分大小写 .

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

  • 21

    (首先,我想为批次推荐这个有用的参考站点: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的完全限定路径

    ADD 1

    刚刚为神秘的 ~ 代字号运算符找到了一些很好的参考 .

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

    :~ 字符串称为colon tilde运算符 . 你可以找到它像 %SOME_VAR:~0,-1% .

    ADD 2 - 1:12 PM 7/6/2018

    %1-%9 参考命令行args . 如果它们是 not 有效路径值, %~dp1 - %~dp9 将全部扩展为与 %~dp0 相同的值 . 但如果它们有效的路径值,它们将扩展为 their own 驱动程序/路径值 .

    例如:(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\
    
  • 32

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

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

  • 266

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

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

    C:\ script \ test.bat

    内容:

    @echo off
    echo %~dp0
    

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

    C:\ script \

  • 680

    另一个有用的提示是,要将当前目录设置为 different drive ,首先必须使用 %~d0 ,然后是 cd %~dp0 . 这会将目录更改为批处理文件的驱动器,然后更改为其文件夹 .

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

    希望这有助于某人 .

  • 138

    Strawberry Perl便携式外壳 Launcher 的典范:

    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自己做了什么,但它有效!

  • 35

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

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

    它仅列出当前文件夹中每个文件的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
    

相关问题