Powershell XML文件到表视图

时间:2018-06-13 20:40:34

标签: xml powershell format

在我们的远程管理系统中,我们可以执行HPiLOcmdlet以从HP服务器中的iLO硬件管理卡中检索数据。

示例:

$tempstatus = Get-HPiLOTemperature -Server $server -Username $Username -Password $Password -Output XML

这将生成一个XML文件,我希望将其用作输入和输出作为Powershell中的表

输入XML:

<?xml version="1.0" encoding="UTF-8"?>
<RIBCL VERSION="2.23">
   <TEMPERATURE>
      <TEMP>
         <LABEL VALUE="01-Inlet Ambient" />
         <LOCATION VALUE="Ambient" />
         <STATUS VALUE="0K" />
         <CURRENTREADING VALUE="23" UNIT="Celsius" />
         <CAUTION VALUE="42" UNIT="Celsius" />
         <CRITICAL VALUE="46" UNIT="Celsius" />
      </TEMP>
      <TEMP>
         <LABEL VALUE="02-CPU 1" />
         <LOCATION VALUE="CPU" />
         <STATUS VALUE="0K" />
         <CURRENTREADING VALUE="40" UNIT="Celsius" />
         <CAUTION VALUE="70" UNIT="Celsius" />
         <CRITICAL VALUE="N/A" />
      </TEMP>
      <TEMP>
         <LABEL VALUE="03-CPU 2" />
         <LOCATION VALUE="CPU" />
         <STATUS VALUE="0K" />
         <CURRENTREADING VALUE="49" UNIT="Celsius" />
         <CAUTION VALUE="70" UNIT="Celsius" />
         <CRITICAL VALUE="N/A" />
      </TEMP>
   </TEMPERATURE>
</RIBCL>

到目前为止我试过了:

[xml]$XmlDocument = get-content test.xml
$XmlDocument.RIBCL.TEMPERATURE.ChildNodes | Format-Table

结果:

xml

通缉输出:

xml

感谢您的帮助!!!

3 个答案:

答案 0 :(得分:1)

我没有得到短信&#39; celsius&#39;在表中(因为这些列的处理方式不同,但这里有一些代码可以按照你想要的方式分割xml。它只是创建值为

的新对象
[xml]$XmlDocument = get-content test.xml
$XmlDocument.RIBCL.Temperature.TEMP | foreach-object {
    $obj=[ordered]@{}
    foreach($node in $_.ChildNodes){
       $obj[$node.Name]=($node.Value+ " " + $node.Unit).Trim()
    }
    write-output ([pscustomobject]$obj)
  } | format-table 

答案 1 :(得分:0)

以下代码可能适合您。

[xml]$XmlDocument = get-content hplio.xml

foreach ($r in $XmlDocument.RIBCL.TEMPERATURE.TEMP) {
    $info = [ordered]@{}
    $info.LABEL = $r.LABEL.VALUE
    $info.LOCATION = $r.LOCATION.VALUE
    $info.STATUS = $r.STATUS.VALUE
    $info.CURRENTREADING = $r.CURRENTREADING.VALUE + ' ' + $r.CURRENTREADING.UNIT
    $info.CAUTION = $r.CAUTION.VALUE + ' ' + $r.CAUTION.UNIT
    $info.CRITICAL = $r.CRITICAL.VALUE + ' ' + $r.CRITICAL.UNIT

    $reading = New-Object -TypeName PSObject -Prop $info
    Write-Output $reading
}

使用.\temp.ps1 | ft

输出示例
LABEL            LOCATION STATUS CURRENTREADING CAUTION    CRITICAL
-----            -------- ------ -------------- -------    --------
01-Inlet Ambient Ambient  0K     23 Celsius     42 Celsius 46 Celsius
02-CPU 1         CPU      0K     40 Celsius     70 Celsius N/A
03-CPU 2         CPU      0K     49 Celsius     70 Celsius N/A

答案 2 :(得分:0)

除了已经给出的答案。以下也有效。

[xml]$XmlDocument = get-content test.xml

$XmlDocument.RIBCL.TEMPERATURE.TEMP | Format-Table -Property @{LABEL="LABEL"; Expression={$_.LABEL.VALUE}}, 
    @{LABEL="LOCATION"; Expression={$_.LOCATION.VALUE}}, 
    @{LABEL="STATUS"; Expression={$_.STATUS.VALUE}}, 
    @{LABEL="CURRENTREADING"; Expression={$_.CURRENTREADING.VALUE + " " + $_.CURRENTREADING.UNIT}}, 
    @{LABEL="CAUTION"; Expression={$_.CAUTION.VALUE + " " + $_.CAUTION.UNIT}}, 
    @{LABEL="CRITICAL"; Expression={$_.CRITICAL.VALUE + " " + $_.CRITICAL.UNIT}}