应该是一个简单的,但谷歌搜索,甚至使用其他项目中的类似代码的某些原因并没有帮助我解开。
目的:
批处理文件位于USB记忆棒的根目录中,包含一个内核,依次递归扫描驱动器上的所有文件夹,并通过通配符名称找到某个sfx文件,更新其中的文件。
问题:
当前代码可以工作,但仅适用于它找到的第一个文件,并且只是一遍又一遍地重复,永远不会掉到下一个有另一个文件的文件夹。
驱动器上有大约10个文件夹,其中5个文件夹中有定期需要更新的文件,eg_file1.exe
,eg_file2.exe
,eg_file3.exe
,eg_file4.exe
,{{ 1}}。我可以有5行独立的代码,但更喜欢使用效率较低的简洁脚本。
我确信我错过了一些明显的东西,所以任何可以指出或协助的人都会有很大的帮助。
CODE SNIPPET
eg_file5.exe
答案 0 :(得分:2)
有问题的批处理代码递归搜索*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 /?