我发现%~dp0非常有用,我经常使用它使我的批处理文件更具可移植性。
但对我来说,这个标签本身就很神秘……他在做什么?dp是指驱动器和路径吗?0是否指包含文件名的批处理文件的路径%0 ?
或者这只是一个奇怪的标签?
我还想知道它是否是一个文档化的特性,或者是容易被弃用的特性。
我发现%~dp0非常有用,我经常使用它使我的批处理文件更具可移植性。
但对我来说,这个标签本身就很神秘……他在做什么?dp是指驱动器和路径吗?0是否指包含文件名的批处理文件的路径%0 ?
或者这只是一个奇怪的标签?
我还想知道它是否是一个文档化的特性,或者是容易被弃用的特性。
当前回答
来自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在这里做什么,但它很有效!
其他回答
%~dp0展开到运行批处理文件的当前目录路径。
为了更清楚地理解,让我们在目录中创建一个批处理文件。
C: \ \ test.bat脚本
与内容:
@echo off
echo %~dp0
当你从命令提示符运行它时,你会看到这样的结果:
C: \ \的脚本
调用
for /?
在命令行中提供了关于此语法的帮助(也可以在FOR之外使用,这只是可以找到帮助的地方)。
In addition, substitution of FOR variable references has been enhanced. You can now use the following optional syntax: %~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 The modifiers can be combined to get compound results: %~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 In the above examples %I and PATH can be replaced by other valid values. The %~ syntax is terminated by a valid FOR variable name. Picking upper case variable names like %I makes it more readable and avoids confusion with the modifiers, which are not case sensitive.
您可以使用不同的字母,例如f表示“完整路径名”,d表示驱动器号,p表示路径,它们可以组合在一起。%~是每个序列的开始,数字I表示它在参数%I上工作(其中%0是批处理文件的完整名称,正如您所假设的那样)。
批处理脚本中的变量%0被设置为正在执行的批处理文件的名称。
%和0之间的~dp特殊语法基本上是说展开变量%0以显示驱动器号和路径,这将为您提供包含批处理文件的当前目录!
Help = Link
举个例子就好了,这里有一个简单的例子
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
另一个有很大帮助的技巧是,要将当前目录设置到不同的驱动器,必须先使用%~d0,然后使用cd %~dp0。这将把目录更改为批处理文件的驱动器,然后更改为其文件夹。
或者,对于#oneLinerLovers,正如@Omni在评论中指出的那样,cd /d %~dp0将同时改变驱动器和目录:)
希望这能帮助到一些人。