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

我在Windows 7环境中执行CMD.EXEbatch file中有以下命令:

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命令将文件path视为string文字,并对它们进行迭代。 我误解了文档吗? 在我看来,文件(set)说明符中存在(或缺less)通配符不应该影响行为。

Solutions Collecting From Web of "了解(set)说明符的CMD.EXE FOR行为"

你完全理解它。

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

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

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

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

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

如果文件/文件夹存在(集合中的元素是一个有效的引用,或者通过展开通配符表达式来获取),则检索请求的信息,但是如果文件/文件夹不存在,则取决于具体的修饰符可以得到 :

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

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

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