【问题标题】:In Powershell, how do I extract multiple values from XML在 Powershell 中,如何从 XML 中提取多个值
【发布时间】:2022-01-28 05:22:45
【问题描述】:

在这个 XML 中:

<?xml version="1.0">
<Devices ClientType="Desktop">
<Device HostName="12345-Desktop">
      <Parameter Name="DefaultEnvironment" Value="Test" />      
      <Parameter Name="WorkstationID" Value="T100" />
      <Parameter Name="WorkstationAgency" Value="A" />
      <Parameter Name="ServerIP_Trn" Value="tng.domain.com" />
      <Parameter Name="ServerIP_Stg" Value="stg.domain.com" />
      <Parameter Name="Production" Value="TRUE" />
      <Parameter Name="Training" Value="FALSE" />
      <Parameter Name="Staging" Value="FALSE" />
     </Device>
</Devices>

我试图在一行中提取主机名和 WorkstationID。我想看到的是

12345-Desktop   T100
 

这是我尝试过的:

[xml]$Config = $wc.DownloadString("http://xmlsource/xmlfile.xml")
$device=$Config.Devices.Device

#to get hostname:
$devices.hostname

#To get parameters:
$devices.parameter | select Name, value | where {$_.name -eq 'WorkstationID'}

如何像上面那样将两个输出组合在一行中?我需要使用 XPath 吗?

【问题讨论】:

    标签: xml powershell


    【解决方案1】:

    您在正确的轨道上,但您需要calculated property 才能访问数组:

    $devices | Select-Object -Property @(
        'HostName'
        @{
            L = 'WorkstationID'
            E = { $PSItem.Parameter.Where{ $PSItem.Name -eq 'WorkstationID' }.Value }
        }
    )
    

    e:使用Where-Object 代替 cmets 的示例-

    $devices | Select-Object -Property @(
        'HostName'
        @{
            L = 'WorkstationID'
            E = { ($_.Parameter | Where-Object Name -eq WorkstationID).Value }
        }
    )
    

    【讨论】:

    • 谢谢,这似乎有效! $PSItem 在这种情况下如何工作?
    • @15433 $PSItem 只是在 v3 中为当前管道项添加的别名,也就是您已经熟悉的 $_
    • 我明白了。实际上,我之前尝试过类似的方法,只是不知道如何在表达式中应用“where”过滤器。我不知道你可以像以前那样使用它。再次感谢,我会将您的答案标记为解决方案。
    • @15433 也可以通过管道传递到Where-Object,而不是使用.Where() 数组方法,但是它更慢并且使用更多管道可能更难读取字符。
    猜你喜欢
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    • 2021-01-30
    • 1970-01-01
    • 1970-01-01
    • 2012-07-05
    • 2022-01-27
    • 2020-05-05
    相关资源
    最近更新 更多