借用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文件夹"

测试验证可以直接使用

相关推荐
瑞雪兆丰年兮1 小时前
[从0开始学Java|第一天]Java入门
java·开发语言
沈雅馨1 小时前
SQL语言的云计算
开发语言·后端·golang
英俊潇洒美少年1 小时前
vue confirm、messageBox等弹窗关闭后焦点残留问题
前端·javascript·vue.js
东东最爱敲键盘2 小时前
第7天 进程间通信
java·服务器·前端
人道领域2 小时前
javaWeb从入门到进阶(SpringBoot基础案例)
java·开发语言·spring
harrain2 小时前
vue3怎么扩展第三方依赖库内部逻辑(拿element plus举例)
前端·javascript·vue.js·elementui
小二·2 小时前
Go 语言系统编程与云原生开发实战(第2篇):并发编程深度实战 —— Goroutine、Channel 与 Context 构建高并发 API 网关
开发语言·云原生·golang
u0104058362 小时前
利用Java CompletableFuture优化企业微信批量消息发送的异步编排
java·开发语言·企业微信
m0_686041612 小时前
C++中的装饰器模式变体
开发语言·c++·算法