了解CMD.EXE FOR(set)说明符的行为

时间:2015-10-23 16:30:31

标签: windows batch-file for-loop cmd

我在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 确实存在

这会产生以下输出:

"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)说明符中存在(或缺少)通配符不应影响行为。

1 个答案:

答案 0 :(得分:5)

你完全理解它。

for命令旨在迭代一组不需要是文件或文件夹的元素(更准确地说,它们不需要存在于文件系统中)。

但是当集合中的一个元素包含通配符时,它将被视为对需要解析的文件系统的查询,并且集合中的元素将替换为与通配符匹配的文件/文件夹列表表达

您应该注意,此查询并不总是静态的。在查询期间,仅检索第一个匹配的文件/文件夹,但是如果文件系统通知存在与通配符表达式匹配的更多文件/文件夹,则将执行sucesive查询以检索剩余的元素。如果添加/重命名任何文件并匹配通配符表达式,它可以与否(取决于文件系统,命名,...)列在列表中。

不,没有办法逃避通配符表达式。当达到该集合的元素时,集合中元素中存在*?将执行文件系统查询。

在执行do子句中的代码时,如果使用for可替换参数修饰符(%%~...)来检索当前引用元素的信息,则文件系统也将被访问。

如果文件/文件夹存在(集合中的元素是有效引用或通过扩展通配符表达式检索到它),则检索所请求的信息,但如果文件/文件夹不存在,则取决于您可以获得特定修饰符:

  • 如果文件/文件夹存在,正确/逻辑值应该是什么:驱动器,路径,名称,扩展名,只包含元素中包含的部分,或者如果缺少,从文件系统检索的信息,假设该元素是相对于当前活动目录的文件/文件夹引用。

    此点的特定情况是短名称(~s修饰符)。它将返回存在于文件/文件夹引用的路径中的那些目录的 short 版本,并且在文件系统上存储了一个短名称,以及那些没有存储的文件系统的字符串文字。短名称或不存在。

  • 空字符串:属性,大小,时间戳,需要现有文件/文件夹检索其信息的所有元素。