如何在PowerShell中从XML过滤失败包并关联SequenceName
解决PowerShell获取XML中失败包并包含所属序列名称的问题
我来帮你搞定这个问题!你需要的是把每个失败包所属的SequenceName也包含在输出里,因为Package对象本身并不直接持有上层Sequence的名称,所以得在遍历的时候把这个信息带下来。
完整解决方案代码
[xml]$Xml = @" <?xml version="1.0" encoding="utf-8"?> <Sequences> <Sequence> <SequenceName>Sequence1</SequenceName> <SequencePackages> <Package> <PackageName>Package1</PackageName> <PackageMeta> <PackageSuccess>True</PackageSuccess> </PackageMeta> </Package> <Package> <PackageName>Package2</PackageName> <PackageMeta> <PackageSuccess>False</PackageSuccess> </PackageMeta> </Package> </SequencePackages> <SequenceMeta> <Finished>True</Finished> </SequenceMeta> </Sequence> <Sequence> <SequenceName>Sequence2</SequenceName> <SequencePackages> <Package> <PackageName>Package3</PackageName> </Package> </SequencePackages> </Sequence> </Sequences> "@ Clear-Host $FailedPackages = $Xml.Sequences.Sequence | Where-Object { $_.SequenceMeta.Finished -eq $true } | ForEach-Object { # 保存当前序列的名称,后续传递给下属包 $currentSequenceName = $_.SequenceName # 过滤当前序列下的失败包,同时处理无PackageMeta的情况避免报错 $_.SequencePackages.Package | Where-Object { $null -ne $_.PackageMeta -and $_.PackageMeta.PackageSuccess -ne "True" } | Select-Object ` @{Name='PackageName'; Expression={$_.PackageName}}, @{Name='PackageSuccess'; Expression={$_.PackageMeta.PackageSuccess}}, @{Name='SequenceName'; Expression={$currentSequenceName}} } $FailedPackages
关键步骤说明
- 过滤已完成的序列:先用
Where-Object筛选出SequenceMeta.Finished为True的Sequence。 - 遍历序列并传递名称:用
ForEach-Object逐个处理每个符合条件的Sequence,把当前Sequence的名称存在变量$currentSequenceName中,这样下属的Package就能引用这个值。 - 安全过滤失败包:增加
$null -ne $_.PackageMeta的判断,避免像示例中Sequence2的Package3没有PackageMeta节点导致的运行错误,然后再筛选PackageSuccess不为True的包。 - 构建自定义输出对象:通过
Select-Object的计算属性功能,把PackageName、PackageSuccess和上层的SequenceName整合到同一个输出对象中,实现你想要的格式。
输出结果
运行后会得到你期望的格式:
PackageName PackageSuccess SequenceName ----------- ----------- ----------- Package2 False Sequence1
内容的提问来源于stack exchange,提问作者DukeDonnovan
相关产品推荐
相关产品推荐

