【问题标题】:FOR loop not progressing through folder structureFOR循环没有通过文件夹结构进行
【发布时间】:2017-03-06 09:33:51
【问题描述】:

应该很容易,但出于某种原因,谷歌搜索甚至使用来自其他项目的类似代码并不能帮助我摆脱困境。

目标:
批处理文件位于 USB 记忆棒的根目录中,包含一个行,该行依次递归扫描驱动器上的所有文件夹,并在其中通过通配符名称找到某个 sfx 文件,更新其中的文件。

问题:
当前代码有效,但仅适用于它找到的第一个文件,只是一遍又一遍地重复,永远不会掉到有另一个文件的下一个文件夹。

驱动器上大约有 10 个文件夹,其中 5 个有一个需要定期更新的文件,eg_file1.exeeg_file2.exeeg_file3.exeeg_file4.exeeg_file5.exe。我可以有 5 行单独的代码,但更喜欢有一个高效且不那么杂乱的脚本。

我确定我遗漏了一些明显的东西,所以任何能指出或提供帮助的人都会有很大的帮助。

代码片段:

pushd %~dp0

for /r %%f in ("*EG_*.exe") DO ("%~dp07za.exe" u "%%~ff" "%~dp0configs\config.cfg")

pause
exit

【问题讨论】:

标签: loops batch-file for-loop 7zip


【解决方案1】:

有问题的批处理代码递归地搜索*EG_*.exe 并更新所有找到的文件,这会导致一次又一次地处理同一个文件,因为通配符模式匹配的文件列表在处理每个匹配该模式的文件时都会发生变化。

解决方案是使用命令 DIR 首先获取与通配符模式匹配的所有文件的完整列表,然后在下一步处理此列表。在这种情况下,更新找到的文件并不重要,因为在 FOR 处理文件列表之前,DIR 命令已经完全输出了文件列表。

pushd "%~dp0"
for /F "delims=" %%I in ('dir /A-D /B /ON /S "*EG_*.exe"') do "%~dp07za.exe" u "%%~fI" "%~dp0configs\config.cfg"
popd
exit /B

这在使用 FAT 文件系统的 USB 记忆棒上尤为重要,在该文件系统上,匹配通配符模式的文件列表不会像 NTFS 在 NTFS 分区上所做的那样自动排序。在 FAT 分区上,匹配通配符模式的文件列表被返回为存储在分区/驱动器的文件分配表中,该表在每次文件/目录更新时都会更改。这可以通过在 FAT 分区(FAT16、FAT32、exFAT)上的目录上运行简单的 DIR 来看到,然后修改该目录中的文件并再次运行 DIR .第二次 DIR 执行的文件名顺序与第一次 DIR 执行的文件名顺序不同,尽管输出相同的文件名,因为目录中没有添加或删除文件因为只有一个文件被修改(更新)。

要了解所使用的命令及其工作原理,请打开命令提示符窗口,在其中执行以下命令,并仔细阅读每个命令显示的所有帮助页面。

  • dir /?
  • exit /?
  • for /?
  • popd /?
  • pushd /?

【讨论】:

  • 完美!谢谢。解释为什么在具有 (NTFS) 的不同文件夹中使用相似时行为会有所不同
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多