标题: [文件操作] [已解决]for /r可以访问隐藏文件夹,不可访问隐藏文件 [打印本页]
作者: coldsummerwei 时间: 2011-6-8 19:03 标题: [已解决]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 /s和for /r g:\test %i in (.) do @echo %i,运行效果如下图:
[attach]3918[/attach][attach]3919[/attach]
可以发现,两个命令的区别:for /r多列举了一个当前目录“g:\test”(而且每个文件夹后面多了"\."),其他没区别,都可以列举带隐藏属性的目录。
那么如何列举文件呢。再比较命令dir /a-d /b /s和for /r g:\test %i in (*) do @echo %i,运行效果如下图:
[attach]3920[/attach][attach]3921[/attach]
可以发现,两个命令的区别:for /r 不能列举带有隐藏属性的两个文件1.txt和3.txt,而dir /a-d /b /s则完全可以。
那么到了这一步,大家已经发现for /r是可以遍历文件的。那么用这两个命令怎么遍历所有的文件夹和文件呢。命令dir /a /b /s很容易就做到了。那么for /r呢。你可能已经想到方法了,点号.和星号*结合起来不就行了嘛!命令dir /a /b /s和for /r g:\test %i in (. *) do @echo %i运行效果如下图:
[attach]3922[/attach][attach]3923[/attach]
你可能已经发现了:for /r与dir命令比起来,少了两个带隐藏属性的文件1.txt和3.txt,却多了g:\test这个当前目录。
好了,以上就是已经发现的for /r和dir命令的真正明显的区别。
备注:点号.和星号*中间要有空格,顺序无所谓。(你可以调换顺序去体验它们的区别:都是先广度遍历后深度遍历,只是文件夹和文件显示顺序的区别)
作者: CrLf 时间: 2011-6-8 19:12
哈哈,有意思,这个还真没注意过
作者: coldsummerwei 时间: 2011-6-8 19:12
up一下。
是不是 for /r 其实可以访问隐藏属性的文件夹?
作者: mxxcgzxxx 时间: 2011-6-8 20:52
本帖最后由 mxxcgzxxx 于 2011-6-8 20:54 编辑
经过测试,结果如下:
FOR /R 确实是进行了翻箱倒柜式的遍历文件夹,包括隐藏与只读目录
所以它会显示出所有的文件夹,楼主的测试只针对文件夹所以是这个结果。
那么教材上的又是什么结果呢,经测试是指隐藏文件不可显示。
你可以用1.txt来测试就可以看出结果了!
所以应该是“不能列举出隐藏文件”而不是“不能列举出隐藏目录”!
本人测试环境XP
作者: applba 时间: 2011-6-8 21:17
测试成功,惊喜
作者: coldsummerwei 时间: 2011-6-9 09:30
本帖最后由 coldsummerwei 于 2011-6-9 09:34 编辑
4# mxxcgzxxx
经过测试,结果如下:
FOR /R 确实是进行了翻箱倒柜式的遍历文件夹,包括隐藏与只读目录
所以它会显示出所有的文件夹,楼主的测试只针对文件夹所以是这个结果。
那么教材上的又是什么结果呢,经测试是指隐藏文件不可显示。
你可以用1.txt来测试就可以看出结果了!
所以应该是“不能列举出隐藏文件”而不是“不能列举出隐藏目录”!
本人测试环境XP
不好意思,原来截图中的1.txt是文件夹,不是文件,我当时随便建了这样的一个文件夹。
当然 for /r 和 dir /ad /b /s这两个命令都不可以显示目录中的文件,这里讨论的只是文件夹。
为了防止引起误解,已经把1.txt这个文件夹改名为“文件夹”了。重新截了图。
作者: Hello123World 时间: 2011-6-9 18:51
本帖最后由 Hello123World 于 2011-6-9 18:54 编辑
楼主本帖的主要目的是什么?——要说明for /r 可以显示出隐藏的目录和隐藏的文件吗?
可我怎么实验后,for /r 但凡是隐藏属性的,无论文件和文件夹都是显示不了的呢?
DeskSpace.lnk
新建文件夹
都是隐藏属性!- C:\Users\helloworld>for /f %i in ('dir /b /a c:\hello') do @echo %i
- DeskSpace.lnk
- Format
- KKJDock.exe.lnk
- mhdesk.exe.lnk
- PPTV在线影视.lnk
- PP游戏世界.lnk
- WPS文字.lnk
- WPS演示.lnk
- WPS表格.lnk
- YodaoDict.exe.lnk
- 华军软件高速下载器
- 启动Vagaa哇嘎.lnk
- 咔咕.lnk
- 新建文件夹
- 方正同花顺.lnk
- 湘财金禾独立交易版.lnk
- 热门游戏推荐.lnk
- 爱酷2.1.lnk
- 网络媒体播放器.lnk
- 迅雷游戏-女生免单.lnk
- 迅雷看看-免费高清影视.lnk
- 迅雷看看-免费高清电影.lnk
- 迅雷看看播放器.lnk
- 迅雷软件中心.lnk
- 酷狗音乐2010.lnk
- 酷狗音乐文件夹.lnk
- 飞秋FeiQ.exe
复制代码
- C:\Users\helloworld>for /r c:\hello %i in (*) do @echo %i
- c:\hello\Format Factory.lnk\
- c:\hello\KKJDock.exe.lnk\
- c:\hello\mhdesk.exe.lnk\
- c:\hello\PPTV在线影视.lnk\
- c:\hello\PP游戏世界.lnk\
- c:\hello\WPS文字.lnk\
- c:\hello\WPS演示.lnk\
- c:\hello\WPS表格.lnk\
- c:\hello\YodaoDict.exe.lnk\
- c:\hello\华军软件高速下载器 1.11 Beta.exe - 快捷
- c:\hello\启动Vagaa哇嘎.lnk\
- c:\hello\咔咕.lnk\
- c:\hello\方正同花顺.lnk\
- c:\hello\湘财金禾独立交易版.lnk\
- c:\hello\热门游戏推荐.lnk\
- c:\hello\爱酷2.1.lnk\
- c:\hello\网络媒体播放器.lnk\
- c:\hello\迅雷游戏-女生免单.lnk\
- c:\hello\迅雷看看-免费高清影视.lnk\
- c:\hello\迅雷看看-免费高清电影.lnk\
- c:\hello\迅雷看看播放器.lnk\
- c:\hello\迅雷软件中心.lnk\
- c:\hello\酷狗音乐2010.lnk\
- c:\hello\酷狗音乐文件夹.lnk\
- c:\hello\飞秋FeiQ.exe - 快捷方式.lnk\
复制代码
作者: coldsummerwei 时间: 2011-6-10 12:43
7# Hello123World
楼主本帖的主要目的是什么?——要说明for /r 可以显示出隐藏的目录和隐藏的文件吗?
可我怎么实验后,for /r 但凡是隐藏属性的,无论文件和文件夹都是显示不了的呢?
DeskSpace.lnk
新建文件夹
都是隐藏属性!
非常感谢你。帖子已经修改更新,真正想说的是:for /r可以访问带隐藏属性的目录,不可以访问带隐藏属性的文件!
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |