使用带有Powershell的数据对象XML

时间:2015-11-12 09:59:18

标签: xml powershell

我正在尝试使用Powershell脚本从数据对象类型XML打印键值对。

<?xml version="1.0"?>
    <Objects>
      <Object Type="System.Management.Automation.PSCustomObject">
        <Property Name="Display" Type="System.String">Microsoft</Property>
        <Property Name="Service" Type="Microsoft.Management.Service">Database</Property>
      </Object>
      <Object Type="System.Management.Automation.PSCustomObject">
        <Property Name="Display" Type="System.String">Microsoft</Property>
        <Property Name="Service" Type="Microsoft.Management.Service">RPC</Property>
      </Object>
    </Objects>

这是使用的脚本。

[xml]$file = Get-Content C:\xml-report.xml

foreach ($obj in $file.Objects.Object) {
    echo $obj.Display;
echo $obj.Service;
}​

我应该如何遍历每个键(显示,服务)并仅打印那些键的值,即

Microsoft 
Database 
Microsoft 
RPC 

我现在得到的输出如下。有人可以帮助我吗?

Object
Object
Object

3 个答案:

答案 0 :(得分:3)

当您尝试显式访问名为ServiceDisplay的属性时,以下是直接访问这些属性的解决方案,以防您的xml文件包含更多您不关心的元素:

foreach ($obj in $file.Objects.Object.Property) {
  if('Display','Service' -contains $obj.Name) {
    write-output $obj.'#text'
  }
}

或者在一行中:

$file.Objects.Object.Property | ? { 'Display','Service' -contains $_.name } | Select '#text'

答案 1 :(得分:0)

您只是省略了Property元素。你的循环可以稍作修改:

[xml]$file = Get-Content "C:\temp\xml-report.xml"

foreach ($obj in $file.Objects.Object) 
{
    $obj.Property | % { $_.'#text' }
}

答案 2 :(得分:0)

If you are using Powershell version 3 or above you could try use this:

[xml]$file = Get-Content C:\xml-report.xml
$file.Objects.Object.Property.'#text'