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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.15 15:10:25