At which point does `for` or `for /R` enumerate the directory (tree)?

前端 未结 1 1930
鱼传尺愫
鱼传尺愫 2020-11-22 10:38

The command for can be used to enumerate a directory and apply (a) certain command(s) on each item. With the /R the same can be accomplished for a

相关标签:
1条回答
  • 2020-11-22 11:25

    This is an excellent question!

    Let's concentrate on plain for command for a moment. There is a known bug related to this command when it is used to rename files. For example:

    set i=0
    for %%a in (*.txt) do (
       set /A i+=1
       ren "%%a" !i!.txt
    )
    

    In this case is frequently that certain files be renamed twice, and even three times in certain cases. The problem is that this behavior depends on a series of factors that are not documented, like the position of the first renamed file inside the list of original files and several other points. Similarly, if a file is deleted before it is processed by the for, a "File not found" message is usually issued (although not ALL times). If a new file is created in the directory after the for started execution, then it may or may not be processed by the for depending (again) on a series of factors. The usual way to avoid the problem with rename is to force for command to first read the whole list of files and then process the list:

    for /F "delims=" %%a in ('dir /B *.txt') do (
       set /A i+=1
       ren "%%a" !i!.txt
    )
    

    This way, don't matters the changes that can be made on the files in the disk: the for /F command will always process the original file list.

    A similar problem happen with for /R command, but in this case the possibility of problems is greater because there are more directories where dynamic changes can be made. Again: the exact behavior depends on a series of unknown factors and the way to avoid them is via for /F ... in ('dir /S /B'). However, if you are really interested in this point, I encourage you to made a series of tests on the subject (and post the results). ;)

    0 讨论(0)
提交回复
热议问题