如何在PowerShell脚本中提取XML属性值并优化输出用于差异对比?
实现方案
1. 扩展脚本生成带标题的格式化内容
首先修改原脚本,同时提取data节点的name属性和对应文本值,并将name用**包裹作为标题前置,每个条目间添加空行方便后续对比:
# 从resx文件提取并格式化QIM相关资源 $currentContent = Select-Xml -XPath '//data[contains(@name,"QIM")]' -Path 'Resources.resx' | ForEach-Object { $name = $_.Node.Attributes['name'].Value $text = $_.Node.Value.'#text' # 拼接成「**name**: 文本值」的格式,空行分隔条目 "**$name**:`n$text`n" } | Out-String
2. 实现与基准文件的差异对比
步骤1:初始化基准文件
首次运行时,将当前提取的内容保存为基准文件,用于后续对比:
# 首次执行生成基准文件(仅需运行一次) $currentContent | Out-File -Path 'QIM_Resources_Baseline.txt' -Encoding utf8
步骤2:生成差异报告
后续每次运行脚本时,加载基准文件并对比差异,输出适合邮件通知的markdown格式报告:
# 加载基准内容 $baselineContent = Get-Content -Path 'QIM_Resources_Baseline.txt' -Raw -Encoding utf8 # 将内容按空行分割为单个资源条目,过滤空行 $currentEntries = $currentContent -split "`n`n" | Where-Object { $_ -match '\S' } $baselineEntries = $baselineContent -split "`n`n" | Where-Object { $_ -match '\S' } # 对比找出新增/删除的条目 $differences = Compare-Object -ReferenceObject $baselineEntries -DifferenceObject $currentEntries -PassThru # 整理差异为邮件友好的markdown格式 $diffReport = if ($differences) { $reportLines = @() # 处理新增条目 $added = $differences | Where-Object { $_.SideIndicator -eq '=>' } if ($added) { $reportLines += "### 新增资源条目" $reportLines += $added | ForEach-Object { "- $_" } $reportLines += "" } # 处理删除条目 $removed = $differences | Where-Object { $_.SideIndicator -eq '<=' } if ($removed) { $reportLines += "### 删除资源条目" $reportLines += $removed | ForEach-Object { "- $_" } $reportLines += "" } # 处理修改条目(name相同但文本值变化) $commonNames = $currentEntries | ForEach-Object { ($_ -split ":`n")[0].Trim('**') } | Where-Object { $_ -in ($baselineEntries | ForEach-Object { ($_ -split ":`n")[0].Trim('**') }) } $modified = @() foreach ($name in $commonNames) { $currentEntry = $currentEntries | Where-Object { $_ -match "^\*\*$name\*\*:" } $baselineEntry = $baselineEntries | Where-Object { $_ -match "^\*\*$name\*\*:" } if ($currentEntry -ne $baselineEntry) { $modified += @{ Name = $name OldValue = ($baselineEntry -split ":`n")[1].Trim() NewValue = ($currentEntry -split ":`n")[1].Trim() } } } if ($modified) { $reportLines += "### 修改资源条目" foreach ($item in $modified) { $reportLines += "- **$($item.Name)**" $reportLines += " 旧值: $($item.OldValue)" $reportLines += " 新值: $($item.NewValue)" $reportLines += "" } } $reportLines -join "`n" } else { "未检测到QIM相关资源内容变更。" } # 输出差异报告(可直接复制作为邮件正文) Write-Host $diffReport # 可选:确认变更后更新基准文件,用于下次对比 # $currentContent | Out-File -Path 'QIM_Resources_Baseline.txt' -Encoding utf8
3. 使用说明
- 首次运行先执行基准文件初始化命令,生成对比基准;
- 后续每次运行完整脚本,会自动输出markdown格式的差异报告,可直接用于邮件变更通知;
- 确认变更无误后,执行脚本末尾的基准更新命令,将当前内容设为新的对比基准。
内容的提问来源于stack exchange,提问作者Thomas
相关产品推荐
相关产品推荐

