@echo off
chcp 65001 >nul
setlocal enabledelayedexpansion
:: ============================================
:: 脚本说明:删除指定路径下N天前的文件和文件夹
:: 修正版特点:
:: 1. 支持含空格的路径
:: 2. 支持中文路径和文件名
:: 3. 更安全的删除操作
:: 4. 详细的日志记录
:: ============================================
:: 设置颜色
color 0A
title 文件清理工具 - 修正版
:: 配置参数
set "LOG_FILE=cleanup_log_%date:~0,4%%date:~5,2%%date:~8,2%.txt"
set /P "TARGET_PATH=请输入要清理的路径(直接拖拽文件夹到这里):"
set /P "DAYS_OLD=请输入要删除多少天前的文件(输入数字):"
:: 验证路径是否存在
if not exist "%TARGET_PATH%\" (
echo 错误:路径不存在!
pause
exit /b 1
)
:: 验证天数输入
echo %DAYS_OLD% | findstr /r "^[0-9][0-9]*$" >nul
if errorlevel 1 (
echo 错误:请输入有效的数字!
pause
exit /b 1
)
:: 显示警告信息
echo.
echo ════════════════════════════════════════════
echo 警告:将删除以下内容:
echo 路径:%TARGET_PATH%
echo 时间:%DAYS_OLD% 天前的文件和文件夹
echo ════════════════════════════════════════════
echo.
set /P "CONFIRM=确认执行删除操作?(y/n):"
if /i not "%CONFIRM%"=="y" (
echo 操作已取消。
pause
exit /b 0
)
:: 创建日志头
echo =========================================== > "%LOG_FILE%"
echo 清理时间:%date% %time% >> "%LOG_FILE%"
echo 目标路径:%TARGET_PATH% >> "%LOG_FILE%"
echo 删除条件:%DAYS_OLD% 天前 >> "%LOG_FILE%"
echo =========================================== >> "%LOG_FILE%"
echo. >> "%LOG_FILE%"
:: 计算截止日期(以天为单位)
for /f "tokens=2 delims==" %%I in ('wmic os get localdatetime /value') do set "datetime=%%I"
set "cutoff_date=%datetime:~0,8%"
set /a "cutoff_julian=1%cutoff_date:~4,4% - 10000"
set /a "cutoff_julian+=%cutoff_date:~0,4% * 365 + %cutoff_date:~0,4% / 4 - %cutoff_date:~0,4% / 100 + %cutoff_date:~0,4% / 400"
set /a "cutoff_julian-=%DAYS_OLD%"
:: 统计变量初始化
set /a file_count=0
set /a folder_count=0
set /a skip_count=0
set /a error_count=0
:: 显示开始信息
echo.
echo 开始清理操作...
echo 正在扫描文件和文件夹...
:: 第一步:删除符合条件的文件
echo.
echo [步骤1] 删除过期文件...
for /f "delims=" %%F in ('dir "%TARGET_PATH%\*" /a-d /b /s 2^>nul') do (
set "file_path=%%F"
:: 获取文件修改日期
for /f "tokens=1-3 delims=/ " %%a in ("%%~tF") do (
set "file_date=%%c%%a%%b"
)
:: 计算文件的儒略日
set /a "file_julian=1!file_date:~4,4! - 10000"
set /a "file_julian+=!file_date:~0,4! * 365 + !file_date:~0,4! / 4 - !file_date:~0,4! / 100 + !file_date:~0,4! / 400"
:: 比较日期并删除
if !file_julian! lss !cutoff_julian! (
echo 删除文件:%%F
echo 删除文件:%%F >> "%LOG_FILE%"
:: 尝试删除文件
del /f /q "%%F" >nul 2>&1
if errorlevel 1 (
echo [错误] 无法删除:%%F
echo [错误] 无法删除:%%F >> "%LOG_FILE%"
set /a error_count+=1
) else (
set /a file_count+=1
)
) else (
set /a skip_count+=1
)
)
:: 第二步:删除空文件夹(可选)
echo.
echo [步骤2] 清理空文件夹...
:clean_empty
set "changed="
for /f "delims=" %%D in ('dir "%TARGET_PATH%" /ad /b /s 2^>nul ^| sort /r') do (
dir "%%D" /b 2>nul | findstr . >nul
if errorlevel 1 (
echo 删除空文件夹:%%D
echo 删除空文件夹:%%D >> "%LOG_FILE%"
rd "%%D" 2>nul
if not errorlevel 1 (
set "changed=1"
set /a folder_count+=1
)
)
)
if defined changed goto clean_empty
:: 第三步:删除过期的非空文件夹(谨慎使用)
:: 注意:这行代码会删除包含过期文件的整个文件夹
:: 如果不需要此功能,请删除以下代码块
echo.
echo [步骤3] 删除过期文件夹(谨慎操作)...
set /P "DEL_OLD_FOLDERS=是否删除包含过期文件的整个文件夹?(y/n,谨慎选择):"
if /i "%DEL_OLD_FOLDERS%"=="y" (
for /f "delims=" %%D in ('dir "%TARGET_PATH%" /ad /b /s 2^>nul ^| sort /r') do (
set "folder_deleted="
for /f "delims=" %%F in ('dir "%%D\*" /a-d /b 2^>nul') do (
set "folder_deleted=1"
goto :skip_folder
)
:: 如果文件夹中已无文件,检查其修改时间
for /f "tokens=1-3 delims=/ " %%a in ('dir "%%D" /tc ^| find "%%D"') do (
set "folder_date=%%c%%a%%b"
)
if defined folder_date (
set /a "folder_julian=1!folder_date:~4,4! - 10000"
set /a "folder_julian+=!folder_date:~0,4! * 365 + !folder_date:~0,4! / 4 - !folder_date:~0,4! / 100 + !folder_date:~0,4! / 400"
if !folder_julian! lss !cutoff_julian! (
echo 删除过期文件夹:%%D
echo 删除过期文件夹:%%D >> "%LOG_FILE%"
rd /s /q "%%D" 2>nul
if not errorlevel 1 (
set /a folder_count+=1
)
)
)
:skip_folder
)
)
:: 生成统计报告
echo.
echo ════════════════════════════════════════════
echo 清理完成!
echo ════════════════════════════════════════════
echo 统计信息:
echo 删除文件数:%file_count%
echo 删除文件夹数:%folder_count%
echo 跳过文件数:%skip_count%
echo 错误数:%error_count%
echo.
echo 日志文件:%LOG_FILE%
echo ════════════════════════════════════════════
:: 写入日志统计
echo. >> "%LOG_FILE%"
echo =========================================== >> "%LOG_FILE%"
echo 清理统计: >> "%LOG_FILE%"
echo 删除文件数:%file_count% >> "%LOG_FILE%"
echo 删除文件夹数:%folder_count% >> "%LOG_FILE%"
echo 跳过文件数:%skip_count% >> "%LOG_FILE%"
echo 错误数:%error_count% >> "%LOG_FILE%"
echo =========================================== >> "%LOG_FILE%"
:: 打开日志文件选项
echo.
set /P "VIEW_LOG=是否查看日志文件?(y/n):"
if /i "%VIEW_LOG%"=="y" start notepad "%LOG_FILE%"
pause
使用说明:
保存脚本:将以上代码保存为 .bat 文件(如 clean_files.bat)
运行脚本:
- 双击运行或右键"以管理员身份运行"
- 输入要清理的路径(可直接拖拽文件夹到窗口)
- 输入天数(N天前)
- 确认执行
安全特性:
- 删除前需要确认
- 记录详细操作日志
- 支持中文路径和文件名
- 分步操作,更加安全
注意事项:
- 脚本会删除文件和空文件夹
- 删除过期文件夹功能是可选的
- 建议先在小范围测试
- 重要数据请提前备份
高级版本(使用PowerShell,功能更强大):
# 保存为 .ps1 文件,右键"使用PowerShell运行"
param(
[string]$Path = (Read-Host "请输入路径"),
[int]$DaysOld = (Read-Host "请输入天数"),
[switch]$WhatIf
)
# 检查路径
if (-not (Test-Path $Path)) {
Write-Host "错误:路径不存在!" -ForegroundColor Red
pause
exit
}
# 计算截止日期
$CutoffDate = (Get-Date).AddDays(-$DaysOld)
# 显示信息
Write-Host "`n将要清理:" -ForegroundColor Yellow
Write-Host "路径: $Path"
Write-Host "删除: $DaysOld 天前的文件"
Write-Host "截止日期: $CutoffDate"
$Confirm = Read-Host "`n确认执行?(y/n)"
if ($Confirm -ne 'y') {
Write-Host "操作已取消。" -ForegroundColor Green
pause
exit
}
# 执行清理
$Files = Get-ChildItem -Path $Path -Recurse -File | Where-Object {
$_.LastWriteTime -lt $CutoffDate
}
$Folders = Get-ChildItem -Path $Path -Recurse -Directory | Where-Object {
$_.LastWriteTime -lt $CutoffDate -and
(Get-ChildItem -Path $_.FullName -Recurse -Force).Count -eq 0
}
# 删除操作
if ($WhatIf) {
Write-Host "`n[模拟运行] 将要删除:" -ForegroundColor Cyan
$Files | ForEach-Object { Write-Host "文件: $($_.FullName)" }
$Folders | ForEach-Object { Write-Host "文件夹: $($_.FullName)" }
} else {
# 删除文件
$Files | Remove-Item -Force -Verbose
# 删除空文件夹(从最深层开始)
$Folders | Sort-Object -Property FullName -Descending |
Remove-Item -Force -Verbose
# 输出统计
Write-Host "`n清理完成!" -ForegroundColor Green
Write-Host "删除文件: $($Files.Count) 个"
Write-Host "删除文件夹: $($Folders.Count) 个"
}
pause
建议:
首次使用时先创建测试文件夹进行验证
使用
-WhatIf 参数先查看将要删除的内容
定期备份重要数据
在生产环境使用前充分测试