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

如何记录Winget批量升级结果并分类解析?

Winget批量升级结果解析与格式化输出方案

核心思路

由于Winget官方返回码和日志参数无法满足精准解析需求,我们可以直接捕获winget upgrade命令的输出内容,通过文本匹配提取关键信息,再整理成指定格式的表格并写入日志。以下是PowerShell实现脚本:


完整脚本

# 配置参数
$logDir = "C:\WingetLogs"  # 指定日志文件夹路径
$logFile = Join-Path $logDir "WingetUpgrade_$(Get-Date -Format 'yyyyMMdd_HHmmss').log"
$operationDate = Get-Date -Format 'yyyy-MM-dd HH:mm:ss'

# 创建日志文件夹(如果不存在)
if (-not (Test-Path $logDir)) {
    New-Item -ItemType Directory -Path $logDir | Out-Null
}

# 执行Winget升级命令并捕获所有输出
$wingetOutput = & winget upgrade --all --accept-package-agreements --accept-source-agreements --silent 2>&1

# 初始化结果数组
$upgradeResults = @()

# 解析输出内容
$currentApp = [PSCustomObject]@{
    AppID = $null
    Name = $null
    PackageSize = $null
    Status = $null
    OperationDate = $operationDate
}

foreach ($line in $wingetOutput) {
    $lineText = $line.ToString().Trim()
    
    # 匹配AppID和软件名称(格式示例:"Microsoft.VisualStudioCode v1.85.1 -> v1.86.0")
    if ($lineText -match '^([\w\.]+\s+)([\w\s\.]+?)\s+v[\d\.]+\s->\s+v[\d\.]+$') {
        $currentApp.AppID = $matches[1].Trim()
        $currentApp.Name = $matches[2].Trim()
    }
    
    # 匹配包大小(格式示例:"包大小:123.4 MB")
    if ($lineText -match '包大小:([\d\.]+)\s+(\w+)') {
        $currentApp.PackageSize = "$($matches[1]) $($matches[2])"
    }
    
    # 匹配升级成功
    if ($lineText -match '已成功升级') {
        $currentApp.Status = '成功'
        $upgradeResults += $currentApp.PSObject.Copy()
        # 重置当前应用对象
        $currentApp = [PSCustomObject]@{
            AppID = $null
            Name = $null
            PackageSize = $null
            Status = $null
            OperationDate = $operationDate
        }
    }
    
    # 匹配哈希不匹配等失败情况(覆盖常见失败关键词)
    if ($lineText -match '哈希不匹配|下载失败|安装失败|无法验证') {
        $currentApp.Status = '失败'
        $upgradeResults += $currentApp.PSObject.Copy()
        # 重置当前应用对象
        $currentApp = [PSCustomObject]@{
            AppID = $null
            Name = $null
            PackageSize = $null
            Status = $null
            OperationDate = $operationDate
        }
    }
}

# 输出格式化表格到控制台
$upgradeResults | Format-Table AppID, Name, PackageSize, OperationDate, Status -AutoSize

# 将结果写入日志文件
"=== Winget批量升级结果 时间:$operationDate ===" | Out-File $logFile -Encoding utf8
$upgradeResults | Format-Table AppID, Name, PackageSize, OperationDate, Status -AutoSize | Out-File $logFile -Encoding utf8 -Append
"=== 原始输出日志 ===" | Out-File $logFile -Encoding utf8 -Append
$wingetOutput | Out-File $logFile -Encoding utf8 -Append

关键说明

  1. 输出捕获:通过2>&1同时捕获标准输出和错误输出,避免遗漏失败信息。
  2. 文本匹配规则:针对Winget默认输出格式编写正则表达式,提取AppID、名称、包大小等字段;可根据实际输出调整正则匹配逻辑。
  3. 结果分类:通过关键词识别成功/失败状态,哈希不匹配等失败场景已包含在匹配规则中,可根据需要添加更多失败关键词。
  4. 日志保存:同时保存格式化后的结果表格和原始输出日志,便于后续排查问题。

注意事项

  • 确保PowerShell以管理员权限运行,否则部分软件升级会失败。
  • 如果Winget输出格式更新,需要调整正则表达式以适配新的输出内容。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.27 15:02:26