for递归遍历目录

来源:互联网 发布:大数据整合 编辑:程序博客网 时间:2024/05/16 13:03
for /r 目录 %%i in (元素集合) do 命令语句集合
【解释】
在下面的语句中,如果“元素集合”中只是一个点号,那么,这条语句的作用就是:列举“目录”及其之下的所有子目录,对这些文件夹都执行“命令语句集合”中的命令语句。其作用与嵌套进 for /f 复合语句的 "dir /ad /b /s 路径" 功能类似。如果省略了“目录”,将在当前目录下执行前面描述的操作。 


【例1】
@echo off
for /r d:\test %%i in (.) do echo %%i
pause
【例1结果】
d:\test\.
d:\test\1\.
d:\test\2\.
d:\test\3\.
效果与dir /ad /b /s d:test类似,但有些区别
1、for /r 列举出来的路径最后都带有斜杠和点号,而 dir 语句则没有,会对获取到的路径进行进一步加工产生影响;
  2、for /r 不能列举带隐藏属性的目录,而 dir 语句则可以通过指定 /a 后面紧跟的参数来获取带指定属性的目录,更加灵活;
  3、若要对获取到的路径进行进一步处理,则需要把 dir 语句放入 for /f 语句中进行分析,写成 for /f %%i in ('dir /ad /b /s') do …… 的形式;由于 for /r 语句是边列举路径边进行处理,所以,在处理大量路径的时候,前期不会感到有停顿,而 for /f 语句则需要等到 dir /ad /b /s 语句把所有路径都列举完之后,再读入内存进行处理,所以,在处理大量路径的时候,前期会感到有明显的停顿。


【例2】
@echo off
for /r d:\test %%i in (a b c) do echo %%i
pause
【例2结果】
D:\test\1\a
D:\test\1\b
D:\test\1\c
D:\test\2\a
D:\test\2\b
D:\test\2\c
D:\test\3\a
D:\test\3\b
D:\test\3\c
含义是:列举 d:\test 及其所有的子目录,对所有的目录路径都分别添加a、b、c之后再显示出来。
【例3】
@echo off
for /r d:\test %%i in (*.txt) do echo %%i
pause
【例3结果】
D:\test\test.txt
D:\test\1\1.txt
D:\test\1\2.txt
D:\test\2\a.txt
D:\test\2\b.txt
D:\test\3\1.txt
含义是:列举 d:\test 及其所有子目录下的txt文本文件,但以.txt结尾的文件夹不会被列出来。
【小结】
【命令:for /r 目录 %%i in (元素集合) do 命令语句集合】
 1、列举“目录”及该目录路径下所有子目录,并把列举出来的目录路径和元素集合中的每一个元素拼接成形如“目录路径\元素”格式的新字符串,然后,对每一条这样的新
字符串执行“命令语句集合”中的每一条命令;
  特别的是:当“元素集合”带以点号分隔的通配符?或*的时候,把“元素集合”视为文件(不视为文件夹),整条语句的作用是匹配“目录”所指文件夹及其所有子文件夹下
匹配的文件;若不以点号分隔,则把“元素集合”视为文件夹(不视为文件);
  2、当省略掉“目录”时,则针对当前目录;
  3、当元素集合中仅仅是一个点号的时候,将只列举目录路径;
【for /r 还是 dir /ad /b /s?】
1、for /r:
    1)优点:
    ① 只通过1条语句就可以同时实现获取目录路径和处理目录路径的操作;
    ② 遍历文件夹的时候,是边列举边处理的,获取到一条路径就处理一条路径,内存占用小,处理大量路径的时候不会产生停顿感;
    2)缺点: 
    ① 不能获取到带隐藏属性的目录,会产生遗漏;
    ② 不能获取带指定属性的目录
  2、dir /ad /s:
    1)优点:
    ① 能一次性获取带任意属性的目录,不会产生遗漏;
    ② 能通过指定不同的参数获取带任意属性的目录,更具灵活性。
    2)缺点:
    ① dir /ad /s 语句仅能获取到目录路径,若要实现进一步的处理,还需要嵌入 for /f 语句中才能实现,写法不够简洁;
    ② 嵌入 for /f 语句之后,需要写成 for /f "delims=" %%i in ('dir /ad /b /s') do …… 的格式,受 for /f 语句运行机制的制约,需要先列举完所有的路径放入内存之后,才能对每一条路径进行进一步的处理,处理大量路径时,内存占用量偏大,并且在前期会产生明显的停顿感,用户体验度不够好;


  综合上述分析,可以做出如下选择:


  1、若仅仅是为了获取某文件夹及其所有子文件夹的路径的话,请选择 dir /ad /b /s 语句;
  2、若需要过滤带隐藏属性的文件夹的话,for /r 和 dir 语句都可以实现,但 for /r 内存占用小,处理速度快,是上上之选;
  3、若需要获取所有文件夹,则除了 dir /ad /b /s 外,别无选择,因为 for /r 语句会遗漏带隐藏属性的文件夹;
原创粉丝点击