如何用命令行获取目录及子目录下所有文件扩展名?附操作疑问
批量获取目录及子目录下所有文件类型的命令行实现
你的操作步骤说明
你的操作步骤没有错误,但可以更简化:
- 不用特意用
pushd命令,直接把bat文件放到目标父目录后双击运行,脚本默认会在自身所在目录执行递归遍历 - 如果非要用命令行操作,直接用
cd命令切换到父目录,再输入bat文件名运行即可,pushd主要用于临时切换网络共享路径这类场景,本地目录没必要用到
修改后的批处理脚本(支持递归遍历子目录)
原脚本只能遍历当前目录,要支持子目录递归,需要用到for /r参数,同时还要开启延迟变量扩展解决循环内变量更新的问题,下面是优化后的完整脚本:
@echo off & setlocal enabledelayedexpansion :: 初始化无扩展名文件的计数器 set "ext[none]=0" :: 递归遍历当前目录及所有子目录下的所有文件 for /r %%I in (*) do ( set "current_ext=%%~xI" :: 处理无扩展名的文件 if "!current_ext!"=="" ( set /a "ext[none] += 1" ) else ( :: 去掉扩展名前的点,统一转为小写(避免.TXT和.txt被当成不同类型) set "current_ext=!current_ext:~1!" set "current_ext=!current_ext:lcase!" set /a "ext[!current_ext!] += 1" ) ) :: 格式化输出结果 echo 所有文件类型及统计数量: echo ------------------------ for /f "tokens=2,3 delims=[]=" %%a in ('set ext[') do ( if "%%a"=="none" ( echo 无扩展名文件:%%b 个 ) else ( echo .%%a:%%b 个 ) ) endlocal
脚本关键说明
for /r:实现递归遍历当前目录及所有子文件夹下的文件enabledelayedexpansion:开启延迟扩展,让循环内部的变量修改能实时生效(批处理默认不开启,循环内变量会保持初始值)- 无扩展名文件单独计数:避免这类文件被遗漏
- 扩展名转小写:统一统计规则,避免大小写差异导致的重复统计(不需要的话可以删掉
set "current_ext=!current_ext:lcase!"这一行) - 格式化输出:把原始的
set ext[输出转换成更易读的格式
内容的提问来源于stack exchange,提问作者plast1cd0nk3y
相关产品推荐
相关产品推荐

