[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] [已解决]for /r可以访问隐藏文件夹,不可访问隐藏文件

本帖最后由 coldsummerwei 于 2011-6-10 14:46 编辑

看了namejm的“批处理for语句从入门到精通”教程,感觉通俗易懂,收获很大。但也有一些疑问。
在第四部分“四、翻箱倒柜遍历文件夹:for /r ”中有如下一段话:
效果就是显示 d:\test 目录及其之下是所有子目录的路径,其效果与 dir /ad /b /s d:\test 类似。若要说到两者的区别,可以归纳出3点:
  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点for /r 不能列举带隐藏属性的目录,我测试后却发现可以列举。原文说了for /r 可以遍历文件夹,却没有明说也可以遍历文件。非常感谢7楼的Hello123World 同学,让我突然发现for /r 竟然也可以遍历文件。
我在G盘建立test文件夹,里面的目录a2(包括子目录和里面文件)和文件1.txt都带隐藏属性。比较命令dir /ad /b /sfor /r g:\test %i in (.) do @echo %i,运行效果如下图:

可以发现,两个命令的区别:for /r多列举了一个当前目录“g:\test”(而且每个文件夹后面多了"\."),其他没区别,都可以列举带隐藏属性的目录。
那么如何列举文件呢。再比较命令dir /a-d /b /sfor /r g:\test %i in (*) do @echo %i,运行效果如下图:

可以发现,两个命令的区别:for /r 不能列举带有隐藏属性的两个文件1.txt和3.txt,而dir /a-d /b /s则完全可以。
那么到了这一步,大家已经发现for /r是可以遍历文件的。那么用这两个命令怎么遍历所有的文件夹和文件呢。命令dir /a /b /s很容易就做到了。那么for /r呢。你可能已经想到方法了,点号.和星号*结合起来不就行了嘛!命令dir /a /b /sfor /r g:\test %i in (. *) do @echo %i运行效果如下图:

你可能已经发现了:for /r与dir命令比起来,少了两个带隐藏属性的文件1.txt和3.txt,却多了g:\test这个当前目录。
好了,以上就是已经发现的for /r和dir命令的真正明显的区别。
备注:点号.和星号*中间要有空格,顺序无所谓。(你可以调换顺序去体验它们的区别:都是先广度遍历后深度遍历,只是文件夹和文件显示顺序的区别)
附件: 您需要登录才可以下载或查看附件。没有帐号?注册
2

评分人数

Discuz!代码[fly]飞行的效果[/fly]达不到飞行的效果。

哈哈,有意思,这个还真没注意过

TOP

up一下。
是不是 for /r 其实可以访问隐藏属性的文件夹?
Discuz!代码[fly]飞行的效果[/fly]达不到飞行的效果。

TOP

本帖最后由 mxxcgzxxx 于 2011-6-8 20:54 编辑

经过测试,结果如下:
FOR /R 确实是进行了翻箱倒柜式的遍历文件夹,包括隐藏与只读目录
所以它会显示出所有的文件夹,楼主的测试只针对文件夹所以是这个结果。
那么教材上的又是什么结果呢,经测试是指隐藏文件不可显示。
你可以用1.txt来测试就可以看出结果了!
所以应该是“不能列举出隐藏文件”而不是“不能列举出隐藏目录”!

本人测试环境XP
世界上没有学不会的知识,也没有想得到却做不到的事!

TOP

测试成功,惊喜

TOP

本帖最后由 coldsummerwei 于 2011-6-9 09:34 编辑

4# mxxcgzxxx
经过测试,结果如下:
FOR /R 确实是进行了翻箱倒柜式的遍历文件夹,包括隐藏与只读目录
所以它会显示出所有的文件夹,楼主的测试只针对文件夹所以是这个结果。
那么教材上的又是什么结果呢,经测试是指隐藏文件不可显示。
你可以用1.txt来测试就可以看出结果了!
所以应该是“不能列举出隐藏文件”而不是“不能列举出隐藏目录”!
本人测试环境XP

不好意思,原来截图中的1.txt是文件夹,不是文件,我当时随便建了这样的一个文件夹。
当然 for /r 和 dir /ad /b /s这两个命令都不可以显示目录中的文件,这里讨论的只是文件夹。
为了防止引起误解,已经把1.txt这个文件夹改名为“文件夹”了。重新截了图。
Discuz!代码[fly]飞行的效果[/fly]达不到飞行的效果。

TOP

本帖最后由 Hello123World 于 2011-6-9 18:54 编辑

楼主本帖的主要目的是什么?——要说明for /r 可以显示出隐藏的目录和隐藏的文件吗?

可我怎么实验后,for /r 但凡是隐藏属性的,无论文件和文件夹都是显示不了的呢?
DeskSpace.lnk
新建文件夹
都是隐藏属性!
  1. C:\Users\helloworld>for /f  %i in ('dir /b /a c:\hello')  do @echo %i
  2. DeskSpace.lnk
  3. Format
  4. KKJDock.exe.lnk
  5. mhdesk.exe.lnk
  6. PPTV在线影视.lnk
  7. PP游戏世界.lnk
  8. WPS文字.lnk
  9. WPS演示.lnk
  10. WPS表格.lnk
  11. YodaoDict.exe.lnk
  12. 华军软件高速下载器
  13. 启动Vagaa哇嘎.lnk
  14. 咔咕.lnk
  15. 新建文件夹
  16. 方正同花顺.lnk
  17. 湘财金禾独立交易版.lnk
  18. 热门游戏推荐.lnk
  19. 爱酷2.1.lnk
  20. 网络媒体播放器.lnk
  21. 迅雷游戏-女生免单.lnk
  22. 迅雷看看-免费高清影视.lnk
  23. 迅雷看看-免费高清电影.lnk
  24. 迅雷看看播放器.lnk
  25. 迅雷软件中心.lnk
  26. 酷狗音乐2010.lnk
  27. 酷狗音乐文件夹.lnk
  28. 飞秋FeiQ.exe
复制代码
  1. C:\Users\helloworld>for /r c:\hello %i in (*)  do @echo %i
  2. c:\hello\Format Factory.lnk\
  3. c:\hello\KKJDock.exe.lnk\
  4. c:\hello\mhdesk.exe.lnk\
  5. c:\hello\PPTV在线影视.lnk\
  6. c:\hello\PP游戏世界.lnk\
  7. c:\hello\WPS文字.lnk\
  8. c:\hello\WPS演示.lnk\
  9. c:\hello\WPS表格.lnk\
  10. c:\hello\YodaoDict.exe.lnk\
  11. c:\hello\华军软件高速下载器 1.11 Beta.exe - 快捷
  12. c:\hello\启动Vagaa哇嘎.lnk\
  13. c:\hello\咔咕.lnk\
  14. c:\hello\方正同花顺.lnk\
  15. c:\hello\湘财金禾独立交易版.lnk\
  16. c:\hello\热门游戏推荐.lnk\
  17. c:\hello\爱酷2.1.lnk\
  18. c:\hello\网络媒体播放器.lnk\
  19. c:\hello\迅雷游戏-女生免单.lnk\
  20. c:\hello\迅雷看看-免费高清影视.lnk\
  21. c:\hello\迅雷看看-免费高清电影.lnk\
  22. c:\hello\迅雷看看播放器.lnk\
  23. c:\hello\迅雷软件中心.lnk\
  24. c:\hello\酷狗音乐2010.lnk\
  25. c:\hello\酷狗音乐文件夹.lnk\
  26. c:\hello\飞秋FeiQ.exe - 快捷方式.lnk\
复制代码

TOP

7# Hello123World
楼主本帖的主要目的是什么?——要说明for /r 可以显示出隐藏的目录和隐藏的文件吗?
可我怎么实验后,for /r 但凡是隐藏属性的,无论文件和文件夹都是显示不了的呢?
DeskSpace.lnk
新建文件夹
都是隐藏属性!

非常感谢你。帖子已经修改更新,真正想说的是:for /r可以访问带隐藏属性的目录,不可以访问带隐藏属性的文件!
Discuz!代码[fly]飞行的效果[/fly]达不到飞行的效果。

TOP

返回列表