借用Deepseek写一个定期清理备份文件的ps脚本

借用Deepseek写一个定期清理备份文件的ps脚本

需求

复制代码
windows server  2019服务器,D:\DMP\TAM\目录下存在按照年月命名的文件夹,比如D:\DMP\TAM\20260105,现在需要编译一个powershell脚本清理180天之前的文件夹以及文件夹里面的文件,并记录删除的文件内容到一个日志文件d:\scripts\logs\clear_tam_年月.log

DeepSeek 提供的方案

复制代码
# ==============================================
# 清理180天前的TAM文件夹并记录日志
# ==============================================

# 配置参数
$basePath = "D:\DMP\TAM"
$daysToKeep = 180
$logPath = "D:\Scripts\Logs"
$logFile = "clear_tam_$(Get-Date -Format 'yyyyMM').log"
$fullLogPath = Join-Path -Path $logPath -ChildPath $logFile

# 创建日志目录(如果不存在)
if (!(Test-Path $logPath)) {
    New-Item -ItemType Directory -Path $logPath -Force | Out-Null
    Write-Host "已创建日志目录: $logPath"
}

# 开始记录日志
function Write-Log {
    param(
        [string]$Message,
        [string]$Level = "INFO"
    )
    
    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    $logEntry = "[$timestamp] [$Level] $Message"
    
    # 写入日志文件
    Add-Content -Path $fullLogPath -Value $logEntry -Encoding UTF8
    
    # 同时在控制台显示(可选)
    switch ($Level) {
        "INFO"    { Write-Host $logEntry -ForegroundColor White }
        "SUCCESS" { Write-Host $logEntry -ForegroundColor Green }
        "WARNING" { Write-Host $logEntry -ForegroundColor Yellow }
        "ERROR"   { Write-Host $logEntry -ForegroundColor Red }
        "DEBUG"   { Write-Host $logEntry -ForegroundColor Gray }
    }
}

# 计算截止日期
$cutoffDate = (Get-Date).AddDays(-$daysToKeep)

# 脚本开始
Write-Log "========================================================================"
Write-Log "开始清理TAM文件夹" -Level "INFO"
Write-Log "清理目录: $basePath" -Level "INFO"
Write-Log "保留天数: $daysToKeep" -Level "INFO"
Write-Log "截止日期: $cutoffDate" -Level "INFO"
Write-Log "日志文件: $fullLogPath" -Level "INFO"
Write-Log "========================================================================"

# 统计变量
$deletedFolders = 0
$deletedFiles = 0
$totalSize = 0
$errors = 0

try {
    # 获取所有文件夹
    $folders = Get-ChildItem -Path $basePath -Directory -ErrorAction Stop
    
    if ($folders.Count -eq 0) {
        Write-Log "在 $basePath 目录下未找到任何文件夹。" -Level "WARNING"
        exit
    }
    
    Write-Log "找到 $($folders.Count) 个文件夹,开始分析..." -Level "INFO"
    
    foreach ($folder in $folders) {
        $folderName = $folder.Name
        $folderFullPath = $folder.FullName
        
        # 检查是否是8位数字格式(年月日)
        if ($folderName -match '^\d{8}$') {
            try {
                # 将文件夹名转换为日期
                $folderDate = [DateTime]::ParseExact($folderName, "yyyyMMdd", $null)
                
                # 如果文件夹日期早于截止日期
                if ($folderDate -lt $cutoffDate) {
                    
                    # 获取文件夹内所有文件
                    $files = Get-ChildItem -Path $folderFullPath -File -Recurse -ErrorAction SilentlyContinue
                    
                    # 计算文件夹大小
                    $folderSize = 0
                    if ($files) {
                        $folderSize = ($files | Measure-Object -Property Length -Sum -ErrorAction SilentlyContinue).Sum
                    }
                    
                    Write-Log "准备删除文件夹: $folderName (日期: $folderDate, 大小: {0:N2} MB, 文件数: $($files.Count))" -f ($folderSize / 1MB) -Level "INFO"
                    
                    # 记录文件夹内文件详情
                    if ($files) {
                        foreach ($file in $files) {
                            Write-Log "  ├─ 文件: $($file.Name), 大小: {0:N2} MB, 修改时间: $($file.LastWriteTime)" -f ($file.Length / 1MB) -Level "DEBUG"
                            $deletedFiles++
                        }
                    }
                    
                    # 删除文件夹及其内容
                    try {
                        Write-Log "正在删除文件夹: $folderFullPath" -Level "INFO"
                        Remove-Item -Path $folderFullPath -Recurse -Force -ErrorAction Stop
                        Write-Log "成功删除文件夹: $folderName" -Level "SUCCESS"
                        
                        $deletedFolders++
                        $totalSize += $folderSize
                    }
                    catch {
                        Write-Log "删除文件夹失败: $folderName - $_" -Level "ERROR"
                        $errors++
                    }
                    
                }
                else {
                    Write-Log "跳过文件夹(未过期): $folderName (日期: $folderDate)" -Level "DEBUG"
                }
            }
            catch {
                Write-Log "无法解析文件夹名: $folderName - $_ (跳过)" -Level "WARNING"
                continue
            }
        }
        else {
            Write-Log "文件夹名格式不符: $folderName (跳过)" -Level "DEBUG"
        }
    }
}
catch {
    Write-Log "执行过程中发生错误: $_" -Level "ERROR"
    $errors++
}

# 生成统计报告
Write-Log "========================================================================"
Write-Log "清理完成统计报告" -Level "INFO"
Write-Log "已删除文件夹数量: $deletedFolders" -Level "SUCCESS"
Write-Log "已删除文件总数: $deletedFiles" -Level "SUCCESS"
Write-Log "释放空间总计: {0:N2} GB" -f ($totalSize / 1GB) -Level "SUCCESS"
Write-Log "发生错误数: $errors" -Level "INFO"
Write-Log "清理完成时间: $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')" -Level "INFO"
Write-Log "========================================================================"

# 如果未删除任何文件,记录信息
if ($deletedFolders -eq 0) {
    Write-Log "未找到需要清理的文件夹。" -Level "INFO"
}

# 脚本结束
exit 0

扩展功能版本(包含更多选项和错误处理):

复制代码
# ==============================================
# 清理180天前的TAM文件夹并记录日志(增强版)
# ==============================================

param(
    [int]$Days = 180,
    [switch]$WhatIf,
    [switch]$VerboseLog
)

# 配置参数
$basePath = "D:\DMP\TAM"
$logPath = "D:\Scripts\Logs"
$logFile = "clear_tam_$(Get-Date -Format 'yyyyMMdd').log"
$fullLogPath = Join-Path -Path $logPath -ChildPath $logFile

# 创建日志目录(如果不存在)
if (!(Test-Path $logPath)) {
    New-Item -ItemType Directory -Path $logPath -Force | Out-Null
}

# 日志函数
function Write-Log {
    param(
        [string]$Message,
        [string]$Level = "INFO"
    )
    
    $timestamp = Get-Date -Format "yyyy-MM-dd HH:mm:ss"
    $logEntry = "[$timestamp] [$Level] $Message"
    
    # 写入日志文件
    Add-Content -Path $fullLogPath -Value $logEntry -Encoding UTF8
    
    # 控制台输出
    if ($Level -eq "ERROR") {
        Write-Host $logEntry -ForegroundColor Red
    } elseif ($Level -eq "WARNING") {
        Write-Host $logEntry -ForegroundColor Yellow
    } elseif ($Level -eq "SUCCESS") {
        Write-Host $logEntry -ForegroundColor Green
    } elseif ($VerboseLog) {
        Write-Host $logEntry -ForegroundColor Gray
    }
}

# 验证目录存在
if (!(Test-Path $basePath)) {
    Write-Log "目录不存在: $basePath" -Level "ERROR"
    exit 1
}

# 脚本开始
Write-Log "================================================================"
Write-Log "TAM文件夹清理脚本启动" -Level "INFO"
Write-Log "目标目录: $basePath" -Level "INFO"
Write-Log "保留天数: $Days 天" -Level "INFO"
Write-Log "模拟模式: $WhatIf" -Level "INFO"
Write-Log "详细日志: $VerboseLog" -Level "INFO"
Write-Log "日志文件: $fullLogPath" -Level "INFO"
Write-Log "开始时间: $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')" -Level "INFO"
Write-Log "================================================================"

$cutoffDate = (Get-Date).AddDays(-$Days)

# 统计
$stats = @{
    FoldersToDelete = 0
    FoldersDeleted = 0
    FilesToDelete = 0
    FilesDeleted = 0
    TotalSize = 0
    Errors = 0
}

# 获取文件夹
$folders = Get-ChildItem -Path $basePath -Directory -ErrorAction SilentlyContinue

if (!$folders -or $folders.Count -eq 0) {
    Write-Log "未找到任何文件夹" -Level "WARNING"
    exit 0
}

Write-Log "找到 $($folders.Count) 个文件夹" -Level "INFO"

foreach ($folder in $folders) {
    $folderName = $folder.Name
    $folderPath = $folder.FullName
    
    # 检查日期格式
    if ($folderName -match '^\d{8}$') {
        try {
            $folderDate = [DateTime]::ParseExact($folderName, "yyyyMMdd", $null)
            
            if ($folderDate -lt $cutoffDate) {
                $stats.FoldersToDelete++
                
                # 获取文件信息
                $files = Get-ChildItem -Path $folderPath -File -Recurse -ErrorAction SilentlyContinue
                $folderSize = ($files | Measure-Object -Property Length -Sum -ErrorAction SilentlyContinue).Sum
                
                Write-Log "发现过期文件夹: $folderName" -Level "INFO"
                Write-Log "  创建日期: $folderDate" -Level "INFO"
                Write-Log "  文件数量: $($files.Count)" -Level "INFO"
                Write-Log "  文件夹大小: {0:N2} MB" -f ($folderSize / 1MB) -Level "INFO"
                
                # 记录文件详情
                if ($VerboseLog -and $files) {
                    foreach ($file in $files) {
                        Write-Log "    文件: $($file.Name), 大小: {0:N2} KB" -f ($file.Length / 1KB) -Level "DEBUG"
                    }
                }
                
                $stats.FilesToDelete += $files.Count
                $stats.TotalSize += $folderSize
                
                # 执行删除
                if (!$WhatIf) {
                    try {
                        Write-Log "正在删除文件夹: $folderPath" -Level "INFO"
                        Remove-Item -Path $folderPath -Recurse -Force -ErrorAction Stop
                        Write-Log "删除成功: $folderName" -Level "SUCCESS"
                        $stats.FoldersDeleted++
                        $stats.FilesDeleted += $files.Count
                    }
                    catch {
                        Write-Log "删除失败: $folderName - $_" -Level "ERROR"
                        $stats.Errors++
                    }
                }
                else {
                    Write-Log "[模拟] 将删除文件夹: $folderName" -Level "WARNING"
                }
            }
            else {
                Write-Log "文件夹未过期: $folderName ($folderDate)" -Level "DEBUG"
            }
        }
        catch {
            Write-Log "日期解析失败: $folderName - $_" -Level "WARNING"
        }
    }
    else {
        Write-Log "忽略非日期文件夹: $folderName" -Level "DEBUG"
    }
}

# 生成报告
Write-Log "================================================================"
Write-Log "清理作业完成" -Level "INFO"
Write-Log "完成时间: $(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')" -Level "INFO"
Write-Log "发现过期文件夹: $($stats.FoldersToDelete)" -Level "INFO"
Write-Log "实际删除文件夹: $($stats.FoldersDeleted)" -Level "SUCCESS"
Write-Log "发现文件总数: $($stats.FilesToDelete)" -Level "INFO"
Write-Log "实际删除文件: $($stats.FilesDeleted)" -Level "SUCCESS"
Write-Log "释放空间: {0:N2} GB" -f ($stats.TotalSize / 1GB) -Level "SUCCESS"
Write-Log "发生错误: $($stats.Errors)" -Level "INFO"
Write-Log "================================================================"

if ($WhatIf) {
    Write-Log "注意:本次运行处于模拟模式,未实际删除任何文件" -Level "WARNING"
}

exit 0

审计计划任务

复制代码
$action = New-ScheduledTaskAction -Execute "PowerShell.exe" -Argument "-NoProfile -WindowStyle Hidden -File `"D:\Scripts\Clear-TAMFolders.ps1`""
$trigger = New-ScheduledTaskTrigger -Daily -At 3:00AM
$principal = New-ScheduledTaskPrincipal -UserId "SYSTEM" -LogonType ServiceAccount -RunLevel Highest
Register-ScheduledTask -TaskName "CleanTAMFolders" -Action $action -Trigger $trigger -Principal $principal -Description "清理TAM文件夹"

测试验证可以直接使用

相关推荐
毕设源码-邱学长18 小时前
【开题答辩全过程】以 基于PHP的发热病人管理平台的设计与实现为例,包含答辩的问题和答案
开发语言·php
HellowAmy18 小时前
我的C++规范 - 线程池
开发语言·c++·代码规范
独自破碎E18 小时前
【BISHI9】田忌赛马
android·java·开发语言
czy878747518 小时前
const 在 C/C++ 中的全面用法(C/C++ 差异+核心场景+实战示例)
c语言·开发语言·c++
范纹杉想快点毕业18 小时前
实战级ZYNQ中断状态机FIFO设计
java·开发语言·驱动开发·设计模式·架构·mfc
Byron070719 小时前
Vue 中使用 Tiptap 富文本编辑器的完整指南
前端·javascript·vue.js
css趣多多19 小时前
地图快速上手
前端
zhengfei61119 小时前
面向攻击性安全专业人员的一体化浏览器扩展程序[特殊字符]
前端·chrome·safari
马猴烧酒.19 小时前
【面试八股|Java集合】Java集合常考面试题详解
java·开发语言·python·面试·八股
以卿a19 小时前
C++(继承)
开发语言·c++·算法