如何用forfiles筛选本月修改且非新建的文件并统计数量?
解决批处理筛选本月修订文件(排除新建文件)的问题
我来帮你搞定这个需求!你想要识别本月初以来修改但非新建的文件,核心是要同时满足两个条件:文件创建时间早于本月初,且修改时间在本月初及之后。之前的forfiles命令只筛选了修改时间,所以会把本月新建的文件也包含进去,咱们来调整代码实现精准筛选。
实现思路
要达到目标,需要:
- 先筛选出修改时间≥本月初的文件(用
forfiles的/D参数) - 对这些文件额外判断创建时间<本月初,只保留符合这个条件的文件
- 统计符合条件的文件数量,可选输出文件名
完整批处理代码
@echo off setlocal enabledelayedexpansion REM 设置目标文件夹路径(注意不要加末尾的引号,后面会统一处理) set "revisions=C:\Users\nlehman\Desktop\New folder (3)" REM 设置本月初的日期(格式要和系统区域设置一致,比如MM/DD/YYYY) set "month_start=08/01/2024" REM 初始化计数器 set "revision_count=0" REM 创建输出文件,写入表头 echo 本月初以来修订的文件列表(排除新建文件)> "Revisions_since_month_start.txt" REM 遍历目标文件夹下所有文件,先筛选修改时间≥本月初的文件 forfiles /P "%revisions%" /S /M *.* /D +%month_start% /C "cmd /c if @isdir==FALSE ( for /f "tokens=1-3" %%a in ('dir /tc "@path" ^| findstr /r "^[0-9]"') do ( set "create_date=%%a/%%b/%%c" if "!create_date!" LSS "%month_start%" ( echo @path >> "Revisions_since_month_start.txt" set /a revision_count+=1 ) ) )" REM 把统计数量写入文件并在控制台提示 echo.>> "Revisions_since_month_start.txt" echo 总计符合条件的修订文件数量:%revision_count%>> "Revisions_since_month_start.txt" echo 处理完成!共找到 %revision_count% 个本月修订(非新建)的文件,详情请查看 Revisions_since_month_start.txt endlocal
代码关键点解释
setlocal enabledelayedexpansion:启用延迟变量扩展,这样在循环内部修改和读取变量时能正常生效forfiles /D +%month_start%:先过滤出修改时间在本月初及之后的文件,缩小范围dir /tc "@path":获取文件的创建时间(/tc参数指定显示创建时间),再用findstr提取日期行- 日期格式处理:把提取到的日期转换成和
month_start一致的格式,才能进行比较 if "!create_date!" LSS "%month_start%":判断创建时间是否早于本月初,满足则计数并可选输出文件名
可选调整
- 如果只需要统计数量,不需要输出文件名:把代码里的
echo @path >> "Revisions_since_month_start.txt"这一行删掉即可 - 日期格式适配:如果你的系统区域设置是
YYYY/MM/DD,请把month_start改成对应的格式(比如2024/08/01),同时调整create_date的拼接方式为set "create_date=%%c/%%a/%%b"
内容的提问来源于stack exchange,提问作者ihateu3
相关产品推荐
相关产品推荐

