优化多路径指定扩展名文件清理PowerShell脚本的需求咨询
多路径Atlassian产品文件清理脚本优化方案
需求背景
当前通过批处理重复调用单路径清理脚本完成Bitbucket、Jira、Confluence等产品的文件清理工作,需整合为单脚本实现多路径批量清理,并生成包含产品标识、操作详情的结构化日志。
现有实现问题
- 重复启动PowerShell进程,执行效率低,维护繁琐
- 日志记录无规范格式,缺少时间戳、产品分类、操作结果等关键信息
- 无错误捕获机制,删除失败或路径无效时无有效记录
优化方案实现
核心思路
- 集中配置管理:将所有清理任务(路径、保留数量、匹配规则、产品标识)整合到脚本内的配置数组,便于统一维护
- 结构化日志输出:每条日志包含时间戳、产品名称、操作状态、文件详情,提升可追溯性
- 完善错误处理:捕获路径无效、文件获取失败、删除异常等场景并记录
- 单脚本批量执行:无需外部批处理,一次运行完成所有清理任务
优化后完整脚本
# 日志文件存储路径,可根据实际环境修改 $logPath = "E:\backup\housekeep_log\Housekeep.log" # 清理任务配置:按产品分类,包含产品标识、目标路径、保留文件数、文件名匹配正则 $cleanupTasks = @( # Bitbucket相关任务 @{ Product = "Bitbucket" Path = "C:\Atlassian\ApplicationData\Bitbucket\export" Keep = 5 Regex = "^backup.*\.zip" }, @{ Product = "Bitbucket" Path = "C:\Atlassian\ApplicationData\Bitbucket\log\audit" Keep = 30 Regex = "^atlassian-bitbucket-audit-" }, @{ Product = "Bitbucket" Path = "C:\Atlassian\ApplicationData\Bitbucket\log" Keep = 30 Regex = "^atlassian-bitbucket-2" }, @{ Product = "Bitbucket" Path = "C:\Atlassian\ApplicationData\Bitbucket\log" Keep = 30 Regex = "^atlassian-bitbucket-access-" }, @{ Product = "Bitbucket" Path = "C:\Atlassian\bitbucket-backup-client-4.0.0\backups" Keep = 3 Regex = "^bitbucket.*\.tar" }, # Confluence相关任务 @{ Product = "Confluence" Path = "C:\Program Files\Atlassian\Application Data\Confluence\backups" Keep = 5 Regex = "^backup.*\.zip" }, @{ Product = "Confluence" Path = "C:\Program Files\Atlassian\Confluence\logs" Keep = 30 Regex = "^catalina.*log" }, @{ Product = "Confluence" Path = "C:\Program Files\Atlassian\Confluence\logs" Keep = 30 Regex = "^confluence" }, @{ Product = "Confluence" Path = "C:\Program Files\Atlassian\Confluence\logs" Keep = 30 Regex = "^commons-daemon" }, @{ Product = "Confluence" Path = "C:\Program Files\Atlassian\Confluence\logs" Keep = 30 Regex = "^gc-" }, # JIRA相关任务 @{ Product = "JIRA" Path = "C:\Program Files\Atlassian\Application Data\JIRA\export" Keep = 5 Regex = "^zip" }, @{ Product = "JIRA" Path = "C:\Program Files\Atlassian\JIRA\logs" Keep = 30 Regex = "^catalina.*log" }, @{ Product = "JIRA" Path = "C:\Program Files\Atlassian\JIRA\logs" Keep = 30 Regex = "^access.*log" }, @{ Product = "JIRA" Path = "C:\Program Files\Atlassian\JIRA\logs" Keep = 30 Regex = "^atlassian-jira-gc" }, @{ Product = "JIRA" Path = "C:\Program Files\Atlassian\JIRA\logs" Keep = 30 Regex = "^commons-daemon" }, @{ Product = "JIRA" Path = "C:\Program Files\Atlassian\JIRA\logs" Keep = 30 Regex = "^jirasoftware" }, @{ Product = "JIRA" Path = "C:\Program Files\Atlassian\JIRA\logs" Keep = 30 Regex = "^localhost" } ) # 自动创建日志目录(若不存在) if (-not (Test-Path (Split-Path $logPath))) { New-Item -ItemType Directory -Path (Split-Path $logPath) | Out-Null } # 遍历执行所有清理任务 foreach ($task in $cleanupTasks) { $product = $task.Product $path = $task.Path $keepCount = $task.Keep $regex = $task.Regex Write-Host "开始处理[$product]路径: $path" # 验证目标路径有效性 if (-not (Test-Path $path -PathType Container)) { $logEntry = "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] ERROR - [$product] 路径无效: $path" Write-Host $logEntry Add-Content -Path $logPath -Value $logEntry continue } # 获取符合规则的文件并按修改时间排序(旧文件在前) try { [array]$targetFiles = Get-ChildItem -Path $path -File | Where-Object { $_.Name -match $regex } | Sort-Object LastWriteTime } catch { $logEntry = "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] ERROR - [$product] 获取文件失败: $path,错误信息: $_" Write-Host $logEntry Add-Content -Path $logPath -Value $logEntry continue } $totalFiles = $targetFiles.Count $deleteCount = $totalFiles - $keepCount # 判断是否需要删除文件 if ($deleteCount -le 0) { $logEntry = "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] INFO - [$product] 路径: $path,保留数量$keepCount≥文件总数$totalFiles,无需删除" Write-Host $logEntry Add-Content -Path $logPath -Value $logEntry continue } $filesToDelete = $targetFiles | Select-Object -First $deleteCount Write-Host "[$product] 路径: $path,将删除$deleteCount个旧文件" # 执行删除并记录操作结果 foreach ($file in $filesToDelete) { try { Remove-Item -Path $file.FullName -Force -ErrorAction Stop $logEntry = "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] SUCCESS - [$product] 删除文件: $($file.FullName),修改时间: $($file.LastWriteTime.ToString('yyyy-MM-dd HH:mm:ss'))" Write-Host $logEntry } catch { $logEntry = "[$(Get-Date -Format 'yyyy-MM-dd HH:mm:ss')] ERROR - [$product] 删除文件失败: $($file.FullName),错误信息: $_" Write-Host $logEntry } Add-Content -Path $logPath -Value $logEntry } } Write-Host "所有清理任务执行完成,日志已写入: $logPath"
方案优势
- 配置集中化:所有清理规则按产品分类,新增/修改任务只需编辑
$cleanupTasks数组,无需维护多个批处理命令 - 日志可追溯性强:每条日志包含完整的时间、产品、操作状态和文件信息,便于排查问题
- 错误处理完善:覆盖路径无效、文件读取异常、删除失败等场景,避免静默失败
- 执行效率高:单脚本一次性完成所有任务,减少PowerShell进程启动开销
- 可视化反馈:控制台实时输出任务进度,同时保留持久化日志
使用说明
- 修改
$logPath为实际日志存储路径 - 核对
$cleanupTasks中的路径、保留数量、正则规则是否符合实际需求 - 直接执行脚本即可:
powershell.exe -ExecutionPolicy remotesigned -File housekeep_all.ps1
内容的提问来源于stack exchange,提问作者ontljoshi
相关产品推荐
相关产品推荐

