【问题标题】:Meaning of %%~dpa?%%~dpa 的含义?
【发布时间】:2011-04-09 16:24:00
【问题描述】:

我被要求维护一些批处理文件,我在每个批处理文件的开头反复看到这一行..

FOR /f "usebackq tokens=*" %%a IN ('%0') DO SET this_cmds_dir=%%~dpa
CD /d "%this_cmds_dir%"

有人知道第一行是做什么的吗?什么是%%~dpa?什么是 %0 ?什么是usebackq?

【问题讨论】:

    标签: batch-file cmd


    【解决方案1】:

    @Santhosh:%0 将是当前批处理文件的方式调用。这可能是以下任何一种形式:abc.batabc(无 .bat 后缀)、..\..\abc.batd:\path\to\abc.bat"e:\path with spaces\to\abc.bat" 可能还有更多。

    现在,使用%0 进行进一步处理在任何情况下都不起作用,因为它不是以规范形式存在的。您将使用

    • %~0 :删除可能出现在%0 周围的引号(如果有的话);
    • %~n0 :只使用%0 的名称,不带后缀;
    • %~nx0:使用%0的名称+后缀;
    • %~pnx0:使用%0的路径+名称+后缀(不带盘符);
    • %~dpnx0:使用驱动器号+路径+名称+%0的后缀。

    同样可用于清理%1%0 的第一个参数)、%2 等,以防这些参数是文件或目录。

    【讨论】:

    • 这非常有用。很多解决方案只提供直接脚本。我很少看到脚本的解释。在外人看来,这些解决方案只是一堆废话。
    【解决方案2】:

    %~dpa 为您提供%a 指向的文件的驱动器和路径(当然,使用双%,因为您在脚本中运行)。来自cmd.exe中的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 - 搜索 PATH 中列出的目录
                  %I 的环境变量并扩展为
                  找到的第一个驱动器号和路径。
    %~ftzaI - 将 %I 扩展为类似 DIR 的输出线
    
    在上述示例中,%I 和 PATH 可以替换为其他有效的
    价值观。 %~ 语法由有效的 FOR 变量名终止。
    选择像 %I 这样的大写变量名使其更具可读性和
    避免与不区分大小写的修饰符混淆。
    

    %0 是正在运行的批处理文件的名称,usebackqtokens=for 命令的选项。 tokens= 可用于将单词分配给特定变量,在这种情况下,使用 * 会将全部内容放入 %%a

    usebackq 更改围绕%0 参数处理引号的方式。没有它,单引号将运行命令并使用该命令的输出,而不是%0 的值。

    运行上述for /?可以找到更多详细信息。

    顺便说一句,PATH 的技巧是使用nifty way 在您的路径上查找可执行文件。

    【讨论】:

    • 而 %0 将是当前的批处理文件名?
    猜你喜欢
    • 1970-01-01
    • 2011-01-30
    • 2018-07-26
    • 1970-01-01
    • 2021-03-01
    • 2015-01-10
    • 2021-12-19
    • 2011-09-02
    • 2018-07-23
    相关资源
    最近更新 更多