借用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文件夹"
测试验证可以直接使用
