Sat*_*dra 3 shell for-loop batch-file createfile
我编写了以下批处理文件来使用FOR循环创建多个文件:
@echo off
cls
FOR /L %%i IN (1 1 10) DO (
echo.> file%%i.txt
IF ERRORLEVEL 0 echo Successfully created file 'file%%i.txt'.
)
dir /b *.txt
FOR %%i IN (*.txt) DO (
echo.> file%%i.txt
IF ERRORLEVEL 0 echo Successfully created file 'file%%i.txt'.
)
这里,在第一个FOR循环中创建了10个文件(即file1.txt.... file10.txt).
在第二个FOR循环中,我使用这些文件来构建下一个新文件的名称.(即filefile1.txt.txt... filefile10.txt.txt)
但是,正在创建一个额外的文件:
导致创建这个额外文件的逻辑问题是什么?filefilefile1.txt.txt.txt
编辑 - 似乎我没有正确解释它,人们不知道它是如何工作的.我的错.我将尝试更好地解释它.
原因是for命令在内部工作的方式.
for var in (files)到达该行时,将检查目录以查看是否有任何文件匹配且需要处理.
然后,for命令(cmd确实),发出目录查询以枚举文件.此查询仅返回set中的第一个文件.如果有任何与for命令中的文件掩码匹配的aditional文件,则会设置一个标志,指示调用方(cmd)有更多要处理的文件,但尚未检索剩余文件的列表.
当内部代码的执行for到达迭代结束时,并且有待读取的文件待处理时,将发送查询以获取待处理的文件列表的剩余部分以及与for文件选择匹配的文件.
系统使用剩余的文件列表填充缓冲区.如果此时文件列表足够短,可以在缓冲区中完全重写,则不会重复查询.如果文件列表大到不适合缓冲区,则检索部分列表,当处理检索列表中的文件时,将再次发送查询以获取更多要处理的文件.
缓冲区中的文件数取决于文件名的长度.文件名更短,缓冲区中的文件更多,文件系统查询更少.
此行为(在第一次文件处理结束时检索剩余的文件列表)仅在文件查询返回有待处理文件时才会执行.当一个查询未返回该标志时,不再检索任何文件.
例外
如果在NTFS中工作,如果文件按字母顺序大于在for命令中处理的最后一个文件,则文件仅包含在"重新查询"中.
如果FAT工作,则查询将包括生成的所有新文件,该for文件与命名文件选择独立于其名称.是的,它可以进入无限循环.(在测试中,系统缓冲区仅检索一个文件名,并在每次迭代中重新查询).你可以试试
break > a.txt && cmd /v:on /c "for %f in (*.txt) do break > !random!.txt"
Run Code Online (Sandbox Code Playgroud)
我所有的测试都是在Windows 7 64位,NTFS和FAT32分区上完成的(这在USB驱动器上).无法测试其他配置.如果有人看到不同的行为,请发表评论.
有关更多信息,请使用ZwQueryDirectoryFile