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

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

最佳答案

你完全理解它。

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

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

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

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

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

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

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

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

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

关于windows - 了解 (set) 说明符的 CMD.EXE FOR 行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33307279/

相关文章:

c++ - 如何访问 UPnP 设备的服务?

batch-file - .bat 重命名文件运行多次

mysql - 批处理文件没有将结果写入所需的目录?

python - 如何在 Windows 中设置 LANG 变量?

c# - 调试 Windows 窗体应用程序 C# 添加监视

c++ - 在基于 C++ 范围的 for 循环中获取当前元素的索引

python - 如果发现重复项,则取列表中值的平均值

Java 排列赋值

java - Windows 找不到 rmi 注册表

powershell - 在 Powershell 中运行 .cmd/.bat 脚本