powershell - 使用 Where-Object 从 XML 中过滤数据
问题描述
我有一个 XML 文件,其中包含有关包含包的序列的数据。我正在尝试获取一个包含有关失败包的信息的 powershell 对象。( <PackageSuccess>False</PackageSuccess>
)
您可以在下面找到包含示例数据的 XML 文件的结构。(简化。我希望它仍然是真实的......)
您还可以找到过滤失败包的代码:
[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
$ProcessedSequences = $Xml.Sequences.Sequence | Where-Object { $_.SequenceMeta.Finished -eq $true }
$FailedPackages = $ProcessedSequences.SequencePackages.Package | Where-Object { $_.PackageMeta.PackageSuccess -ne "True" }
$FailedPackages
输出如下:
PackageName PackageMeta
----------- -----------
Package2 PackageMeta
这在某种程度上是可以的,但我也希望在输出中有 SequenceName,如下所示:
PackageName PackageSuccess SequenceName
----------- ----------- -----------
Package2 False Sequence1
我无法为此找到一个干净的解决方案。
谢谢
解决方案
使用计算属性Select-Object
并使用ParentNode
元素上的属性走到保存SequenceName
元素的祖先节点:
$FailedPackages |Select-Object PackageName,PackageMeta,@{Name='SequenceName';Expression={$_.ParentNode.ParentNode.SequenceName}}
推荐阅读
- c# - 有没有办法可以确定我在 foreach 循环中的哪一行?
- spring - 从春季批处理中的步骤启动作业
- python - gz文件解压过程的不同行为
- powershell - $ie.document 方法对于 powershell 中的控制台页面不可见
- java - Java 类 TreeSet 中的 Java 方法 headSet 和 tailSet 是否在 log(N) 时间内工作?
- javascript - 移动背景位置
- version-control - 阻止一个模块安装为 dev-master
- oracle - Oracle SQL Developer 在启动后立即崩溃
- php - 即使没有显示错误,我的代码也在插入数据
- jquery - 通过在 ASP.NET MVC 5 中使用 Jquery-Ajax 单击删除按钮来删除每一行