如何使用BATCH批处理统计多文件夹下子文件夹数量并导出结果
原代码问题梳理
- 第一版代码问题:
- 未开启延迟变量扩展:批处理执行括号包裹的代码块时会预读取所有变量值,普通变量
%count%的取值会固定为代码块执行前的结果,无法随计数实时更新 - 循环语法错误:遍历子目录需要使用
for /d /s语法,且后续计数、输出逻辑未用括号包裹,无法和循环绑定 - 变量操作不符合规范:批处理数值计算需要加
/a参数,变量赋值不能留空格,正确写法是set /a count+=1;且每次遍历新的父文件夹前未重置count,会累计之前的统计结果 - 输出逻辑不符合要求:未将父文件夹名和计数拼接为指定格式,而是分开输出两行
- 未开启延迟变量扩展:批处理执行括号包裹的代码块时会预读取所有变量值,普通变量
- 第二版代码问题:
- 要捕获命令的执行结果,
for需要加/f参数,你写的for /d无法正确读取dir命令的输出 - 统计路径未绑定当前遍历的父文件夹
%%a,而是使用了全局路径变量,所以只会输出所有子文件夹的总计数,无法按父文件夹拆分
- 要捕获命令的执行结果,
可直接运行的实现代码
@echo off setlocal enabledelayedexpansion :: 先清空旧的输出文件 cd.>output.txt :: 遍历当前目录下所有一级父文件夹 for /d %%a in (*) do ( :: 每次统计新父文件夹前先重置计数为0 set "count=0" :: 遍历当前父文件夹下所有子文件夹,每查到一个计数加1 for /d /s %%b in ("%%a\*") do ( set /a count+=1 ) :: 按指定格式输出到文件 echo %%a - !count! subfolders>>output.txt ) endlocal
代码说明
- 开头
setlocal enabledelayedexpansion开启延迟变量扩展,计数变量用!count!取值就能拿到实时更新的结果 - 每次遍历新的父文件夹都会先把count重置为0,避免和之前的统计结果累计
- 内层循环自动过滤了文件,只会统计文件夹,加
/s参数会统计当前父文件夹下所有层级的子文件夹,如果只需要统计直接一级子文件夹,删掉/s参数即可 - 路径加了引号处理,支持带空格、特殊字符的文件夹名,输出格式完全匹配要求
内容的提问来源于stack exchange,提问作者dasderwq
相关产品推荐
相关产品推荐

