琼海市护送服务网

Windows定时删除指定路径下N天前的文件以及文件夹(脚本之家修正版)

2026-03-26 07:22:02 浏览次数:1
详细信息

@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

运行脚本

安全特性

注意事项

高级版本(使用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 参数先查看将要删除的内容 定期备份重要数据 在生产环境使用前充分测试
相关推荐