FOR 循环不通过文件夹结构进行
FOR loop not progressing through folder structure
应该很简单,但出于某种原因,谷歌搜索甚至使用其他项目的类似代码都无法帮助我摆脱困境。
目标:
批处理文件位于 USB 记忆棒的根目录中,包含一个衬垫,该衬垫依次递归扫描驱动器上的所有文件夹,并在其中通过通配符名称找到某个 sfx 文件,更新其中的文件。
问题:
当前代码有效,但仅适用于它找到的第一个文件,并一遍又一遍地重复,永远不会掉到下一个有另一个文件的文件夹。
驱动器上大约有 10 个文件夹,其中 5 个有一个文件,其中需要定期更新,eg_file1.exe
、eg_file2.exe
、eg_file3.exe
、eg_file4.exe
, eg_file5.exe
。我可以有 5 行单独的代码,但更喜欢有一个高效、简洁的脚本。
我确定我遗漏了一些明显的东西,所以任何可以指出或提供帮助的人都会有很大帮助。
代码片段:
pushd %~dp0
for /r %%f in ("*EG_*.exe") DO ("%~dp07za.exe" u "%%~ff" "%~dp0configs\config.cfg")
pause
exit
有问题的批处理代码递归搜索 *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 文件系统的 U 盘上尤为重要,在 FAT 文件系统上,匹配通配符模式的文件列表不会像 NTFS 在 NTFS 分区上那样自动排序。在 FAT 分区上,匹配通配符模式的文件列表被返回为存储在 partition/drive 的文件分配 table 中,它在每次 file/directory 更新时发生变化。这可以通过 运行在 FAT 分区(FAT16、FAT32、exFAT)上的目录上创建一个简单的 DIR,然后修改该目录中的文件和 运行 再次 DIR。第二次 DIR 执行的文件名顺序与第一次 DIR 执行的文件名顺序不同,虽然输出相同的文件名,因为没有文件已在目录中添加或删除,因为仅修改(更新)了一个文件。
要了解使用的命令及其工作原理,请打开命令提示符 window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
dir /?
exit /?
for /?
popd /?
pushd /?
应该很简单,但出于某种原因,谷歌搜索甚至使用其他项目的类似代码都无法帮助我摆脱困境。
目标:
批处理文件位于 USB 记忆棒的根目录中,包含一个衬垫,该衬垫依次递归扫描驱动器上的所有文件夹,并在其中通过通配符名称找到某个 sfx 文件,更新其中的文件。
问题:
当前代码有效,但仅适用于它找到的第一个文件,并一遍又一遍地重复,永远不会掉到下一个有另一个文件的文件夹。
驱动器上大约有 10 个文件夹,其中 5 个有一个文件,其中需要定期更新,eg_file1.exe
、eg_file2.exe
、eg_file3.exe
、eg_file4.exe
, eg_file5.exe
。我可以有 5 行单独的代码,但更喜欢有一个高效、简洁的脚本。
我确定我遗漏了一些明显的东西,所以任何可以指出或提供帮助的人都会有很大帮助。
代码片段:
pushd %~dp0
for /r %%f in ("*EG_*.exe") DO ("%~dp07za.exe" u "%%~ff" "%~dp0configs\config.cfg")
pause
exit
有问题的批处理代码递归搜索 *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 文件系统的 U 盘上尤为重要,在 FAT 文件系统上,匹配通配符模式的文件列表不会像 NTFS 在 NTFS 分区上那样自动排序。在 FAT 分区上,匹配通配符模式的文件列表被返回为存储在 partition/drive 的文件分配 table 中,它在每次 file/directory 更新时发生变化。这可以通过 运行在 FAT 分区(FAT16、FAT32、exFAT)上的目录上创建一个简单的 DIR,然后修改该目录中的文件和 运行 再次 DIR。第二次 DIR 执行的文件名顺序与第一次 DIR 执行的文件名顺序不同,虽然输出相同的文件名,因为没有文件已在目录中添加或删除,因为仅修改(更新)了一个文件。
要了解使用的命令及其工作原理,请打开命令提示符 window,在其中执行以下命令,并仔细阅读为每个命令显示的所有帮助页面。
dir /?
exit /?
for /?
popd /?
pushd /?