You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

优化多路径指定扩展名文件清理PowerShell脚本的需求咨询

多路径Atlassian产品文件清理脚本优化方案

需求背景

当前通过批处理重复调用单路径清理脚本完成Bitbucket、Jira、Confluence等产品的文件清理工作,需整合为单脚本实现多路径批量清理,并生成包含产品标识、操作详情的结构化日志。

现有实现问题

  • 重复启动PowerShell进程,执行效率低,维护繁琐
  • 日志记录无规范格式,缺少时间戳、产品分类、操作结果等关键信息
  • 无错误捕获机制,删除失败或路径无效时无有效记录

优化方案实现

核心思路

  1. 集中配置管理:将所有清理任务(路径、保留数量、匹配规则、产品标识)整合到脚本内的配置数组,便于统一维护
  2. 结构化日志输出:每条日志包含时间戳、产品名称、操作状态、文件详情,提升可追溯性
  3. 完善错误处理:捕获路径无效、文件获取失败、删除异常等场景并记录
  4. 单脚本批量执行:无需外部批处理,一次运行完成所有清理任务

优化后完整脚本

# 日志文件存储路径,可根据实际环境修改
$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进程启动开销
  • 可视化反馈:控制台实时输出任务进度,同时保留持久化日志

使用说明

  1. 修改$logPath为实际日志存储路径
  2. 核对$cleanupTasks中的路径、保留数量、正则规则是否符合实际需求
  3. 直接执行脚本即可:powershell.exe -ExecutionPolicy remotesigned -File housekeep_all.ps1

内容的提问来源于stack exchange,提问作者ontljoshi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.24 10:06:20