求助:修复可排除指定文件的6个月以上旧文件删除批处理脚本
批处理脚本:删除6个月以上旧文件并保留指定排除列表文件
完整可运行脚本
@echo off setlocal enabledelayedexpansion :: 配置参数 - 根据实际需求修改 set "TARGET_DIR=C:\Your\Target\Folder" set "EXCLUDE_LIST=list.txt" set "MONTHS=6" :: 校验目标目录 if not exist "%TARGET_DIR%" ( echo 错误:目标目录不存在 - %TARGET_DIR% exit /b 1 ) :: 初始化排除列表标记 set "EXCLUDE_FLAG=0" if exist "%EXCLUDE_LIST%" ( set "EXCLUDE_FLAG=1" :: 将排除列表文件中的文件名拼接为|分隔的字符串,便于匹配 set "EXCLUDE_FILES=" for /f "delims=" %%f in (%EXCLUDE_LIST%) do ( set "EXCLUDE_FILES=!EXCLUDE_FILES!|%%f" ) set "EXCLUDE_FILES=|!EXCLUDE_FILES!" ) :: 扫描并处理文件 echo 开始扫描 %TARGET_DIR% 中超过%MONTHS%个月的文件... forfiles /p "%TARGET_DIR%" /s /m *.* /d -%MONTHS% /c "cmd /c if @isdir==FALSE ( set 'FILE=@fname@ext' set 'KEEP=0' if %EXCLUDE_FLAG% equ 1 ( echo !EXCLUDE_FILES! | findstr /i /c:"|!FILE!" >nul && set 'KEEP=1' ) if !KEEP! equ 0 ( echo 删除:@path del /f /q "@path" ) else ( echo 保留(排除列表):@path ) )" echo 操作完成 endlocal
关键说明
- 延迟变量扩展:
setlocal enabledelayedexpansion是必须的,确保在forfiles的嵌套命令中能实时读取变量值 - 日期判断:使用
forfiles /d -%MONTHS%直接匹配N个月前的文件,避免手动计算日期带来的系统格式兼容问题 - 排除列表处理:将
list.txt中的文件名拼接为|file1|file2|格式,通过findstr快速判断当前文件是否在排除列表中,支持大小写不敏感匹配 - 目录过滤:
@isdir==FALSE确保只处理文件,不会误删目录 - 安全提示:初次测试时,请将
del /f /q "@path"替换为echo 待删除:@path,确认删除范围正确后再执行实际删除
使用注意事项
- 修改
TARGET_DIR为你的目标目录完整路径 list.txt需每行填写一个要保留的文件名(如trial.csv、trial2.csv),可放在脚本同目录或指定完整路径- 若不需要遍历子目录,移除
forfiles命令中的/s参数
内容的提问来源于stack exchange,提问作者jshvt17
相关产品推荐
相关产品推荐

