代码之家  ›  专栏  ›  技术社区  ›  aschipfl

“for”或“for/R”在哪一点枚举目录(树)?

  •  10
  • aschipfl  · 技术社区  · 9 年前

    命令 for 可以用于枚举目录并对每个项目应用(a)某些命令。使用 /R 对于完整的目录树也可以做到这一点。

    当枚举目录(树)的内容被 对于 命令

    假设我们有目录 D:\data 内容如下:

    file1.txt
    file2.txt
    file3.txt
    

    的输出 for %F in ("*.txt") do echo %F 当在所述目录中执行时,将明显地反映上述列表。

    然而 对于 对于 body修改目录的内容?例如,列表中的一个文件被删除,比如 file3.txt ,在实际迭代之前?或者如果创建了新文件,如 file4.txt ,在循环完成之前?

    如何 for /R 在这种情况下表现如何?假设有几个子目录 sub1 , sub2 , sub3 ,每个包含上述文件列表; 用于/R 当前正在迭代 子2 , 子1 已处理,但 子3 还没有;的内容 子1 子3 在该点发生变化(当当前通过时 子2 如上所述);那么将列举什么?我想,内容的变化 子1 不会被认出,但是呢 子3 ?

    最后 对于 用于/R 在命令提示符或批处理文件中执行时?不同的Windows版本之间是否存在差异?

    注:
    另请参见我的 similar question 关于 forfiles 命令

    1 回复  |  直到 3 年前
        1
  •  9
  •   Aacini    9 年前

    这是一个很好的问题!

    让我们专注于简单 for 命令片刻。使用此命令时,存在与此命令相关的已知错误 重命名文件 。例如:

    set i=0
    for %%a in (*.txt) do (
       set /A i+=1
       ren "%%a" !i!.txt
    )
    

    在这种情况下,某些文件经常被重命名两次,在某些情况下甚至重命名三次。问题是,这种行为取决于一系列未记录的因素,例如第一个重命名文件在原始文件列表中的位置以及其他几个点。类似地,如果文件在由 对于 ,显示“找不到文件”消息 通常 发布(尽管不是所有时间)。如果在目录中创建了新文件 之后 这个 对于 开始执行,则可能会或可能不会由 对于 这(再次)取决于一系列因素。避免重命名问题的通常方法是强制 对于 命令首先读取整个文件列表 然后 处理列表:

    for /F "delims=" %%a in ('dir /B *.txt') do (
       set /A i+=1
       ren "%%a" !i!.txt
    )
    

    这样,对磁盘中的文件所做的更改无关紧要: for /F 命令将始终处理 起初的 文件列表。

    类似的问题也发生在 for /R 命令,但在这种情况下,出现问题的可能性更大,因为可以进行动态更改的目录更多。再次强调:确切的行为取决于一系列未知因素,避免这些因素的方法是通过 for /F ... in ('dir /S /B') 。然而,如果您是 真正地 对这一点感兴趣,我鼓励你对这一主题进行一系列测试(并发布结果)。 ;)