如何记录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
关键说明
- 输出捕获:通过
2>&1同时捕获标准输出和错误输出,避免遗漏失败信息。 - 文本匹配规则:针对Winget默认输出格式编写正则表达式,提取AppID、名称、包大小等字段;可根据实际输出调整正则匹配逻辑。
- 结果分类:通过关键词识别成功/失败状态,哈希不匹配等失败场景已包含在匹配规则中,可根据需要添加更多失败关键词。
- 日志保存:同时保存格式化后的结果表格和原始输出日志,便于后续排查问题。
注意事项
- 确保PowerShell以管理员权限运行,否则部分软件升级会失败。
- 如果Winget输出格式更新,需要调整正则表达式以适配新的输出内容。
内容的提问来源于stack exchange,提问作者ProprietaryCloudGaming
相关产品推荐
相关产品推荐

