2017-03-06 80 views
1

进展应该是轻松的一年,但由于某种原因,谷歌搜索,甚至使用类似的代码从其他项目并没有帮助我摆脱这种困境。FOR循环而不是通过文件夹结构

目的:
批处理文件坐在USB记忆棒的根目录包含一个内衬递归通过轮流驱动器,在那里发现了被通配符名称一定的自解压文件上的文件夹进行扫描,更新文件在它之内。

问题:
当前代码的作品,但只对第一个文件发现,只是重复了一遍又一遍,从来没有下降到那里是另一个文件中的一个文件夹。

有驱动器上的约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 
+2

提示:https://stackoverflow.com/documentation/batch-file/3695/for-loops- in-batch-files#t = 201703061006249850917 – DavidPostill

+0

感谢这个有用的链接,已经保存为未来参考。 – Tika9o9

回答

2

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

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

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 

这是使用在其通过NTFS NTFS分区上做不自动排序匹配通配符模式的文件列表中的FAT文件系统的USB棒尤其重要。在FAT分区上,匹配通配符模式的文件列表被存储在分区/驱动器的文件分配表中,该分区/驱动器在每个文件/目录更新时发生更改。这可以通过在FAT分区(FAT16,FAT32,exFAT的)一个目录中运行一个简单的DIR可以看出,然后修改该目录中的文件,并再次运行DIR。第二DIR执行的文件名的顺序是先DIR执行的文件名的顺序不同,尽管相同的文件名称被输出,因为没有文件被添加或在目录中删除仅作为一个文件被修改(更新)。

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

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

完美!谢谢。解释为什么在与(NTFS)不同的文件夹中使用类似的行为有所不同, – Tika9o9