powershell - 在 PowerShell 中使用 Where-Object 计数过滤 (xml-)Data ...
问题描述
我在 PowerShell 中有以下代码:
[xml]$Xml = @"
<?xml version="1.0" encoding="utf-8"?>
<Sequences>
<Sequence>
<SequenceName>Sequence-A</SequenceName>
<SequencePackages>
<Package>
<PackageFolder>Package-A</PackageFolder>
<PackageActive>False</PackageActive>
</Package>
<Package>
<PackageFolder>Package-B</PackageFolder>
</Package>
</SequencePackages>
</Sequence>
<Sequence>
<SequenceName>Sequence-B</SequenceName>
<SequencePackages>
<Package>
<PackageFolder>Package-C</PackageFolder>
<PackageMeta>
<PackageStart>2019-07-23T18:53:58.392+02:00</PackageStart>
<PackageEnd>2019-07-23T18:53:58.392+02:00</PackageEnd>
</PackageMeta>
</Package>
<Package>
<PackageFolder>Package-D</PackageFolder>
<PackageMeta>
<PackageStart>2019-07-23T18:53:58.407+02:00</PackageStart>
<PackageEnd>2019-07-23T18:53:58.407+02:00</PackageEnd>
</PackageMeta>
</Package>
</SequencePackages>
</Sequence>
</Sequences>
"@
Clear-Host
$Sequences = $Xml.Sequences.Sequence | Where-Object ...
$Sequences
如您所见,我加载了 XML-Data,然后我想使用“Where-Object”对其进行过滤。在 XML 中,我们看到 2 个序列节点,每个节点包含 2 个包节点。
我想选择那些“序列”节点,它们具有:
- 至少一个活动包。当存在(NO节点)或(IS TRUE)时,包处于活动状态(在示例中,Package-A 不活动)
- 至少一个包没有结束时间(属性“PackageEnd”)
在这个例子中,查询的结果应该是“Sequence-A”,因为它确实有一个包,它不包含属性“PackageActive”并且两个包都没有结束时间(属性“PackageEnd”没有设置) .
理想情况下,我正在寻找单线...
预先感谢您对我们的支持!
编辑: 我确实添加了更多示例以进行澄清...
[xml]$Xml = @"
<?xml version="1.0" encoding="utf-8"?>
<Sequences>
<Sequence>
<SequenceName>Sequence-A</SequenceName>
<SequencePackages>
<Package>
<PackageFolder>Package-A</PackageFolder>
<PackageActive>False</PackageActive>
</Package>
<Package>
<PackageFolder>Package-B</PackageFolder>
</Package>
</SequencePackages>
</Sequence>
<Sequence>
<SequenceName>Sequence-B</SequenceName>
<SequencePackages>
<Package>
<PackageFolder>Package-C</PackageFolder>
<PackageMeta>
<PackageEnd>2019-07-23T18:53:58.392+02:00</PackageEnd>
</PackageMeta>
</Package>
<Package>
<PackageFolder>Package-D</PackageFolder>
<PackageMeta>
<PackageEnd>2019-07-23T18:53:58.407+02:00</PackageEnd>
</PackageMeta>
</Package>
</SequencePackages>
</Sequence>
<Sequence>
<SequenceName>Sequence-C</SequenceName>
<SequencePackages>
<Package>
<PackageFolder>Package-E</PackageFolder>
<PackageActive>False</PackageActive>
</Package>
<Package>
<PackageFolder>Package-F</PackageFolder>
<PackageMeta>
<PackageEnd>2019-07-23T18:53:58.407+02:00</PackageEnd>
</PackageMeta>
</Package>
</SequencePackages>
</Sequence>
<Sequence>
<SequenceName>Sequence-D</SequenceName>
<SequencePackages>
<Package>
<PackageFolder>Package-G</PackageFolder>
<PackageActive>True</PackageActive>
</Package>
<Package>
<PackageFolder>Package-H</PackageFolder>
</Package>
</SequencePackages>
</Sequence>
</Sequences>
"@
- 应选择序列-A。Package-A 不会被处理,但 Package-B 不包含 PackageEnd-node。
- 不应选择序列-B。两个包都包含一个 PackageEnd 节点。
- 不应选择序列-C。Package-E 不是活动的,Package-F 包含一个 PackageEnd 节点。
- 应选择序列-D。包-G 是活动的,包-H 也是。两个包都不包含 PackageEnd 节点。
解决方案
您应该能够很容易地将其通过管道传输到 where-object 过滤器。我使用了第二个 xml 示例。也许xml可以设计得更好。Packagemeta 不会显示在 $xml.sequences.sequence.sequencepackages.package 下,除非您将其通过管道传输到格式列表。我只将外部 foreach 放在一边,& { }
这样您就可以从中抽出管道。
& {
foreach ($s in $xml.sequences.sequence) {
foreach ($p in $s.sequencepackages.package) {
[pscustomobject] @{
sequencename = $s.sequencename
packagefolder = $p.packagefolder
packageactive = $p.packageactive
packageend = $p.packagemeta.packageend
}
}
}
}
sequencename packagefolder packageactive packageend
------------ ------------- ------------- ----------
Sequence-A Package-A False
Sequence-A Package-B
Sequence-B Package-C 2019-07-23T18:53:58.392+02:00
Sequence-B Package-D 2019-07-23T18:53:58.407+02:00
Sequence-C Package-E False
Sequence-C Package-F 2019-07-23T18:53:58.407+02:00
Sequence-D Package-G True
Sequence-D Package-H
推荐阅读
- ruby-on-rails - 在rails响应对象中从mysql db渲染json数据字段
- r - mclapply 调用应该嵌套吗?
- javascript - 将代码从 php 重写为 node js (php openssl_encrypt)
- html - 创建圆形图像及其旁边的详细框 css、html、bootsrap
- c++ - 生成 Actor 时出现大量错误(虚幻引擎 4)
- bootstrap-4 - 垂直对齐引导轮播
- javascript - React.js get events on SVG's path
- jquery - 使 div 出现在当前用户屏幕中
- angular - 为什么导航离开并返回后此 ElementRef 未定义?
- javascript - 当我单击标记时,不会出现弹出窗口。我收到以下错误