使用 Powershell export csv 遍历并检索 xml 值
Loop through and retrieve xml values with Powershell export csv
我花了很多时间试图提取这些数据 - 来自以下 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>
比 "FAN/TEMP/POWER" 等多得多,因此我试图不定义整个 "piece" 并寻找循环解决方案。这将以 csv 格式输出值。 SOOOO,当数据格式如下时,以下脚本可以正常工作,但是,不幸的是,我没有收到那种格式的数据。另外,当我进入 TEMP、Power 时,它们有不同的 labels/criteria
系统
风扇 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" 的值并研究了 get-member,select 等,但我仍然在面对片刻。当有人向我展示我可能有多接近并且这很简单时,我可能会面对手掌!提前致谢
所以,我一直致力于此,并且在我第一次尝试根据我的需要进行修改时一定有错字。然后陷入困境,试图弄清楚如何做到这一点。
我只需要根据需要更改一件事。
$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 而没有意识到。
我花了很多时间试图提取这些数据 - 来自以下 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>
比 "FAN/TEMP/POWER" 等多得多,因此我试图不定义整个 "piece" 并寻找循环解决方案。这将以 csv 格式输出值。 SOOOO,当数据格式如下时,以下脚本可以正常工作,但是,不幸的是,我没有收到那种格式的数据。另外,当我进入 TEMP、Power 时,它们有不同的 labels/criteria 系统 风扇 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" 的值并研究了 get-member,select 等,但我仍然在面对片刻。当有人向我展示我可能有多接近并且这很简单时,我可能会面对手掌!提前致谢
所以,我一直致力于此,并且在我第一次尝试根据我的需要进行修改时一定有错字。然后陷入困境,试图弄清楚如何做到这一点。 我只需要根据需要更改一件事。
$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 而没有意识到。