Board logo

标题: [文件操作] [知识] for /d /r 可以枚举所有子文件夹 [打印本页]

作者: aries215    时间: 2020-6-14 18:33     标题: [知识] for /d /r 可以枚举所有子文件夹

很多人说, for /d 只能匹配第一层目录,对了一半。
  1. for /d /r %%i in (*) do echo %%i
复制代码

作者: went    时间: 2020-6-14 19:32

/r /d 可以替代dir的大部分命令参数
/r /d效率要比for+dir高些
  1. @echo off
  2. REM /d Directory 文件夹
  3. REM /r Recurse 递归(对某个目录进行递归操作.默认递归文件,加上/d参数则递归文件夹)
  4. REM 指定文件夹
  5. set "folder=C:\Users\lenovo\Desktop\test"
  6. REM 获取文件 (dir /b /a-d)
  7. for %%i in ("%folder%\*") do echo %%i
  8. REM 递归获取文件 (dir /s /b /a-d)
  9. for /r "%folder%" %%i in ("*") do echo %%i
  10. REM 获取文件夹 (dir /b /ad)
  11. for /d %%i in ("%folder%\*") do echo %%i
  12. REM 递归获取文件夹 (dir /s /b /ad)
  13. for /r "%folder%" /d %%i in ("*") do echo %%i
  14. pause&exit
复制代码

作者: 不知道是谁    时间: 2020-6-14 22:27

有没有想过有隐藏文件怎么办?
作者: flashercs    时间: 2020-6-14 22:39

强烈建议减少使用for /f +dir,建议使用for /d /r
理由:for /f +dir原理是建立 新的子进程cmd.exe,处理dir指令,它的stdout输出字符串转换成ANSI字节数组array1,然后原cmd.exe进程将stdin重定向到array1,由ANSI字节数组转换为字符串,这其实就是管道传输的过程一致的.但是平常看不出差别,一旦文件名含有Unicode字符就会丢失字符变成问号?,这样就会导致找不到文件路径....自己可以测试一下.
而for /d /r就可以完全避免Unicode文件名问题,因为它没有经过两个转换过程(char->byte和byte->char),它是一直以Unicode字符来处理文件名的,所以不会出现乱码和找不到文件路径的问题.
作者: went    时间: 2020-6-15 19:19

回复 3# 不知道是谁
隐藏文件就只有用for+dir 了
for /r可以列出系统文件和正常文件,就是列不出隐藏文件,




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2