我在Windows 7环境中执行的CMD.EXE批处理文件中有以下命令:
FOR %%f IN ("C:\TEMP\FILE.TXT" "C:\TEMP\FILE2.TXT") DO (
ECHO %%f
)
这会产生以下输出:
"C:\TEMP\FILE.TXT"
"C:\TEMP\FILE2.TXT"
但是,我发现如果我更改FOR
命令以包含存在的外卡如?或*在文件名中,我得到了我期望的结果,这只是C:\ TEMP \ FILE2.TXT的回声
IE:
FOR %%f IN ("C:\TEMP\FILE.TXT?" "C:\TEMP\FILE2.TXT?") DO (
ECHO %%f
)
产地:
C:\TEMP\file2.txt
FOR
命令的文档说明:
FOR %variable IN (set) DO command [command-parameters] %variable Specifies a single letter replaceable parameter. (set) Specifies a set of one or more files. Wildcards may be used. command Specifies the command to carry out for each file. command-parameters
似乎如果(set)
说明符中没有通配符,FOR
命令会将文件路径视为字符串文字,只是迭代它们。我误解了文档吗?在我看来,文件(set)
说明符中存在(或缺少)通配符不应影响行为。
答案 0 :(得分:5)
你完全理解它。
for
命令旨在迭代一组不需要是文件或文件夹的元素(更准确地说,它们不需要存在于文件系统中)。
但是当集合中的一个元素包含通配符时,它将被视为对需要解析的文件系统的查询,并且集合中的元素将替换为与通配符匹配的文件/文件夹列表表达
您应该注意,此查询并不总是静态的。在查询期间,仅检索第一个匹配的文件/文件夹,但是如果文件系统通知存在与通配符表达式匹配的更多文件/文件夹,则将执行sucesive查询以检索剩余的元素。如果添加/重命名任何文件并匹配通配符表达式,它可以与否(取决于文件系统,命名,...)列在列表中。
不,没有办法逃避通配符表达式。当达到该集合的元素时,集合中元素中存在*
或?
将执行文件系统查询。
在执行do
子句中的代码时,如果使用for
可替换参数修饰符(%%~...
)来检索当前引用元素的信息,则文件系统也将被访问。
如果文件/文件夹存在(集合中的元素是有效引用或通过扩展通配符表达式检索到它),则检索所请求的信息,但如果文件/文件夹不存在,则取决于您可以获得特定修饰符:
如果文件/文件夹存在,正确/逻辑值应该是什么:驱动器,路径,名称,扩展名,只包含元素中包含的部分,或者如果缺少,从文件系统检索的信息,假设该元素是相对于当前活动目录的文件/文件夹引用。
此点的特定情况是短名称(~s
修饰符)。它将返回存在于文件/文件夹引用的路径中的那些目录的 short 版本,并且在文件系统上存储了一个短名称,以及那些没有存储的文件系统的字符串文字。短名称或不存在。
空字符串:属性,大小,时间戳,需要现有文件/文件夹检索其信息的所有元素。