【发布时间】: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
我被要求维护一些批处理文件,我在每个批处理文件的开头反复看到这一行..
FOR /f "usebackq tokens=*" %%a IN ('%0') DO SET this_cmds_dir=%%~dpa
CD /d "%this_cmds_dir%"
有人知道第一行是做什么的吗?什么是%%~dpa?什么是 %0 ?什么是usebackq?
【问题讨论】:
标签: batch-file cmd
@Santhosh:%0 将是当前批处理文件的方式调用。这可能是以下任何一种形式:abc.bat、abc(无 .bat 后缀)、..\..\abc.bat、d:\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 等,以防这些参数是文件或目录。
【讨论】:
%~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 是正在运行的批处理文件的名称,usebackq 和 tokens= 是 for 命令的选项。 tokens= 可用于将单词分配给特定变量,在这种情况下,使用 * 会将全部内容放入 %%a。
usebackq 更改围绕%0 参数处理引号的方式。没有它,单引号将运行命令并使用该命令的输出,而不是%0 的值。
运行上述for /?可以找到更多详细信息。
顺便说一句,PATH 的技巧是使用nifty way 在您的路径上查找可执行文件。
【讨论】: