首页 > 解决方案 > 在 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 个包节点。

我想选择那些“序列”节点,它们具有:

在这个例子中,查询的结果应该是“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>
"@

标签: powershell

解决方案


您应该能够很容易地将其通过管道传输到 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

推荐阅读