【问题标题】:Loop through and retrieve xml values with Powershell export csv使用 Powershell export csv 循环并检索 xml 值
【发布时间】:2015-01-09 20:31:54
【问题描述】:

我花了很多时间试图从下面的 XML 中提取这些数据——我“重新设计了一个工作脚本,它可以很好地满足其他人的需求——并且真的非常接近我的需要。

示例 XML -

<?xml version="1.0"?>
 <GET_EMBEDDED_HEALTH_DATA>
    <FANS>
      <FAN type="object">
           <ZONE VALUE="System"/>
           <LABEL VALUE="Fan 1"/>
           <STATUS VALUE="OK"/>
           <SPEED VALUE="26" UNIT="Percentage"/>
      </FAN>
           <FAN type="object">
           <ZONE VALUE = "System"/>
           <LABEL VALUE = "Fan 10"/>
           <STATUS VALUE = "OK"/>
           <SPEED VALUE = "26" UNIT="Percentage"/>
      </FAN>
</FANS>
<TEMPERATURE>
      <TEMP>
           <LABEL VALUE = "01-Inlet Ambient"/>
           <LOCATION VALUE = "Ambient"/>
           <STATUS VALUE = "OK"/>
           <CURRENTREADING VALUE = "20" UNIT="Celsius"/>
           <CAUTION VALUE = "42" UNIT="Celsius"/>
           <CRITICAL VALUE = "46" UNIT="Celsius"/>
      </TEMP>
     </TEMPERATURE>
<POWER_SUPPLIES>
           <SUPPLY>
           <LABEL VALUE = "Power Supply 1"/>
           <PRESENT VALUE = "Yes"/>
           <STATUS VALUE = "Good, In Use"/>
           <PDS VALUE = "No"/>
           <HOTPLUG_CAPABLE VALUE = "Yes"/>
           <MODEL VALUE = "656364-B21                      "/>
           <SPARE VALUE = "Unknown"/>
           <SERIAL_NUMBER VALUE = "5BXRK0DLL7B0S1  "/>
           <CAPACITY VALUE = "1200 Watts"/>
           <FIRMWARE_VERSION VALUE = "N/A"/>
      </SUPPLY>
</POWER_SUPPLIES>
</GET_EMBEDDED_HEALTH_DATA>

除了“风扇/温度/电源”等之外,还有很多其他的东西,因此我试图不定义这整个“部分”并寻找一个循环解决方案。这将以 csv 格式输出值。 SOOOO,当数据格式如下时,以下脚本可以正常工作,但是,不幸的是,我没有收到该格式的数据。此外,当我进入 TEMP、Power 时,它们有不同的标签/标准 系统 风扇 1

到目前为止,我的代码如下(此块用于 FAN) 理想情况下,我希望再上一层,以便它吐出 FAN/ZONE/LABEL/... 然后是 TEMP/LABEL/ LOCATION....但是我可以忍受为每种类型做多个代码块,如果我可以避免指定每个内部成员或者它是外部成员..

[xml]$convertMe = Get-Content .\new.xml
[Array]$MeConverted = $convertMe.GetElementsByTagName('FAN')
$Collection = @()
ForEach($Record in $MeConverted){
 $Output = new-object psobject
$Record.selectnodes("*")|%{Add-Member -InputObject $Output -MemberType NoteProperty -Name $_.Name -Value $_.'#text'}
If($Collection){
    $T2Keys = $Collection|gm|?{$_.MemberType -match "VALUE"}|Select-Xml -XPath -Debug
    $T1Keys = $Output|gm |?{$_.MemberType -match "VALUE"}|Select -ExpandProperty Name
    $KeysToAdd = $T2Keys|?{$T1Keys -notcontains $_}
    $KeysToAdd|%{$Collection|Add-Member $_ ""}
}
$Collection += $Output
}
$Collection | Export-CSV FAN.csv -notype

...重复 TEMP/POWER/...

我确实花了几个小时试图修改上面的脚本以读取“VALUE”的值并研究、获取成员、选择等,但我现在仍然面无表情。当有人向我展示我可能有多接近并且这很简单时,我可能会面对手掌!提前致谢

【问题讨论】:

    标签: xml powershell export-to-csv


    【解决方案1】:

    所以,我一直在做这个,并且在我第一次尝试根据我的需要进行修改时一定有错字。然后陷入了试图弄清楚如何做到这一点的兔子洞。 我只需要根据自己的需要更改一件事。

    $Record.selectnodes("*")|%{Add-Member -InputObject $Output -MemberType NoteProperty -Name $_.Name -Value $_.'#text'
    

    $Record.selectnodes("*")|%{Add-Member -InputObject $Output -MemberType NoteProperty -Name $_.Name -Value $_.'VALUE'
    

    我想知道我是否可能在昨晚输入了 VALUES 而没有意识到。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-02-05
      • 1970-01-01
      • 1970-01-01
      • 2018-02-08
      • 2016-11-24
      • 2018-02-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多