Need help working with .XML files

Hello.

I am trying to retrieve storage metrics from an HPE MSA array using a PS script. I’m using PS to launch a plink -ssh command to retrieve the information. The problem is that MSA returns the values in .xml format.

The .xml is large, here is an excerpt with the values I’m interested in:

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<RESPONSE VERSION="L100" REQUEST="show pools">
<COMP G="0" P="1"/>  <OBJECT basetype="pools" name="pools" oid="1" format="rows">
  <PROPERTY name="name" type="string" size="32" draw="true" sort="string" display-name="Name">A</PROPERTY>
  <PROPERTY name="total-size" units="GB" type="string" size="9" draw="true" sort="size" display-name="Total Size">5590.0GB</PROPERTY>
  <PROPERTY name="total-avail" units="GB" type="string" size="9" draw="true" sort="size" display-name="Avail">4098.4GB</PROPERTY>
  <PROPERTY name="name" type="string" size="32" draw="true" sort="string" display-name="Name">B</PROPERTY>
  <PROPERTY name="total-size" units="GB" type="string" size="9" draw="true" sort="size" display-name="Total Size">5590.0GB</PROPERTY>
  <PROPERTY name="total-avail" units="GB" type="string" size="9" draw="true" sort="size" display-name="Avail">2689.8GB</PROPERTY>
  </OBJECT>
</RESPONSE>

Basically, I need the pool name (A), the total size (5590.0GB) and Avail (4098.4GB) for each pool. In this case, there are only two pools, but other arrays may contain more.

I would like to convert these values to a text file, for example:

Pool Name: A
Pool Size: 5590.0
Available: 4098.4

Pool Name: B
Pool Size: 5590.0
Available: 2689.8

I came across the ConvertTo-Xml but there doesn’t seem to be a ConvertFrom-Xml available.

I also found this example, but throws an error:

function ConvertFrom-Xml($XML) {
    foreach ($Object in @($XML.Objects.Object)) {
        $Object
        $PSObject = New-Object PSObject
        foreach ($Property in @($Object.Property)) {
            $PSObject | Add-Member NoteProperty $Property.Name $Property.InnerText
        }
        $PSObject
    }
}
[xml]$XMLDocument = Get-Content -Path C:\temp\Test.xml
ConvertFrom-Xml $XMLDocument
Add-Member : Cannot bind argument to parameter 'Name' because it is null.
At C:\Temp\Test.ps1:8 char:49
+   $PSObject | Add-Member NoteProperty $Property.Name $Proper ...
+                                       ~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidData: (:) [Add-Member], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Microsoft.PowerShell.Command 
   s.AddMemberCommand

Any help or suggestions greatly appreciated.

Thank you.

This XML is not easy to iterate as per your requirement as everything is dumped under PROPERTY

might not be a straight forward approach, but below code might help

$XML = Get-Content -Path <path to xml>
$TemplValues = New-Object -TypeName PSObject
$XML.RESPONSE.OBJECT.PROPERTY | ForEach-Object -Process {
    # Recreate PSCustomObject as duplicate headers are not possible
    if (($TemplValues | Get-Member -MemberType noteproperty).count -eq 3) {
        $TemplValues
        Remove-Variable -Name TemplValues
        $TemplValues = New-Object -TypeName PSObject
    }
    $PoolName = $_ | Where-Object -FilterScript { $_.'display-name' -eq 'Name' }
    $PoolSize = $_ | Where-Object -FilterScript { $_.'display-name' -eq 'Total Size' }
    $Avail    = $_ | Where-Object -FilterScript { $_.'display-name' -eq 'Avail' }

    if ($PoolName) { Add-Member -InputObject $TemplValues -MemberType NoteProperty -Name 'PoolName' -Value $PoolName.InnerText }
    if ($PoolSize) { Add-Member -InputObject $TemplValues -MemberType NoteProperty -Name 'PoolSize' -Value $PoolSIze.InnerText }
    if ($Avail) { Add-Member -InputObject $TemplValues -MemberType NoteProperty -Name 'Avail' -Value $Avail.InnerText }
}
1 Like

As long as it’s a known set of properties you could clean it up like this.

$xml | Select-Xml -XPath 'RESPONSE' | ForEach-Object {
    switch($_.node.object.property){
        {$_.name -eq 'name'}{
            $ht = [ordered]@{Name=$_.'#text'}
        }
        {$_.name -eq 'total-size'}{
            $ht.add($_.name,$_.'#text')
        }
        {$_.name -eq 'total-avail'}{
            $ht.add($_.name,$_.'#text')
            [PSCustomObject]$ht
        }
    }
}

Basically when it encounters a property named “name” it will initialize the hash table and upon finding ‘total-avail’ it will finish creating the object and output. This will handle any number of these in this same structure

image

2 Likes

Hi.

First of all, thank you very much for your suggestion.

Here is what I have so far:

[xml]$xml = Get-Content 'c:\temp\XMLTest4.xml'

$xml | Select-Xml -XPath 'RESPONSE' | ForEach-Object {
    switch($_.node.object.property){
        {$_.name -eq 'name'}{
            $ht = [ordered]@{Name=$_.'#text'}
        }
        {$_.name -eq 'total-size'}{
            $ht.add($_.name,$_.'#text')
        }
        {$_.name -eq 'total-avail'}{
            $ht.add($_.name,$_.'#text')
            [PSCustomObject]$ht
        }
    }
}

It seems to work but throws the following error:

Cannot convert value "System.Object[]" to type "System.Xml.XmlDocument". Error: "The specified node cannot be 
inserted as the valid child of this node, because the specified node is the wrong type."
At line:1 char:1
+ [xml]$xml = Get-Content 'c:\temp\XMLTest4.xml'
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : MetadataError: (:) [], ArgumentTransformationMetadataException
    + FullyQualifiedErrorId : RuntimeException
 

Name total-size total-avail
---- ---------- -----------
A    5590.0GB   4098.4GB   
B    5590.0GB   2689.8GB   

I’m wondering if it has to do with the version of PS I’m using. It throws the above error on this version:

Version          : 5.1.19041.610

Tried it on an earlier version and it throws even more errors:

Version          : 5.1.14393.3866

Here is the entire .xml file I’m using. Sorry for the size, I can see no way to attach it as a file:

# show pools
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<RESPONSE VERSION="L100" REQUEST="show pools">
<COMP G="0" P="1"/>  <OBJECT basetype="pools" name="pools" oid="1" format="rows">
    <PROPERTY name="name" type="string" size="32" draw="true" sort="string" display-name="Name">A</PROPERTY>
    <PROPERTY name="serial-number" key="true" type="string" size="32" draw="true" sort="string" display-name="Serial Number">00c0ff3bb3340000741ed35b01000000</PROPERTY>
    <PROPERTY name="url" key="true" type="string" size="32" draw="false" sort="string" display-name="URL">/pools/00c0ff3bb3340000741ed35b01000000</PROPERTY>
    <PROPERTY name="storage-type" type="string" size="8" draw="false" sort="string" display-name="Class">Virtual</PROPERTY>
    <PROPERTY name="storage-type-numeric" type="uint32" size="8" draw="false" sort="string" display-name="Class">1</PROPERTY>
    <PROPERTY name="blocksize" type="uint32" size="9" draw="true" sort="size" display-name="Blocksize">512</PROPERTY>
    <PROPERTY name="total-size" units="GB" type="string" size="9" draw="true" sort="size" display-name="Total Size">4193.5GB</PROPERTY>
    <PROPERTY name="total-size-numeric" units="blocks512" type="uint64" size="9" draw="true" sort="size" display-name="Total Size">8190623744</PROPERTY>
    <PROPERTY name="total-avail" units="GB" type="string" size="9" draw="true" sort="size" display-name="Avail">2875.1GB</PROPERTY>
    <PROPERTY name="total-avail-numeric" units="blocks512" type="uint64" size="9" draw="true" sort="size" display-name="Avail">5615616000</PROPERTY>
    <PROPERTY name="snap-size" units="B" type="string" size="9" draw="true" sort="size" display-name="Snap Size">0B</PROPERTY>
    <PROPERTY name="snap-size-numeric" units="blocks512" type="uint64" size="9" draw="true" sort="size" display-name="Snap Size">0</PROPERTY>
    <PROPERTY name="allocated-pages" type="uint32" size="16" draw="true" sort="size" display-name="Allocated Pages">314332</PROPERTY>
    <PROPERTY name="available-pages" type="uint32" size="16" draw="true" sort="size" display-name="Available Pages">685500</PROPERTY>
    <PROPERTY name="overcommit" type="string" size="11" draw="false" sort="string" display-name="OverCommit">Enabled</PROPERTY>
    <PROPERTY name="overcommit-numeric" type="uint32" size="11" draw="false" sort="string" display-name="OverCommit">1</PROPERTY>
    <PROPERTY name="over-committed" type="string" size="8" draw="true" sort="string" display-name="Over-Committed">True</PROPERTY>
    <PROPERTY name="over-committed-numeric" type="uint32" size="8" draw="true" sort="string" display-name="Over-Committed">1</PROPERTY>
    <PROPERTY name="disk-groups" type="uint16" size="11" draw="true" sort="string" display-name="Disk Groups">1</PROPERTY>
    <PROPERTY name="volumes" type="uint16" size="8" draw="true" sort="string" display-name="Volumes">2</PROPERTY>
    <PROPERTY name="page-size" units="KB" type="string" size="17" draw="false" sort="size" display-name="Page Size (Blocks)">4194.3KB</PROPERTY>
    <PROPERTY name="page-size-numeric" units="blocks512" type="uint64" size="17" draw="false" sort="size" display-name="Page Size (Blocks)">8192</PROPERTY>
    <PROPERTY name="low-threshold" type="string" size="11" draw="true" sort="string" display-name="Low Thresh">50.00 %</PROPERTY>
    <PROPERTY name="middle-threshold" type="string" size="11" draw="true" sort="string" display-name="Mid Thresh">75.00 %</PROPERTY>
    <PROPERTY name="high-threshold" type="string" size="12" draw="true" sort="string" display-name="High Thresh">94.87 %</PROPERTY>
    <PROPERTY name="utility-running" type="string" size="9" draw="false" sort="string" display-name="(null)"></PROPERTY>
    <PROPERTY name="utility-running-numeric" type="uint32" size="9" draw="false" sort="string" display-name="(null)">0</PROPERTY>
    <PROPERTY name="preferred-owner" type="string" size="4" draw="true" sort="string" display-name="Preferred Owner">A</PROPERTY>
    <PROPERTY name="preferred-owner-numeric" type="uint32" size="4" draw="true" sort="string" display-name="Preferred Owner">1</PROPERTY>
    <PROPERTY name="owner" type="string" size="3" draw="true" sort="string" display-name="Current Owner">A</PROPERTY>
    <PROPERTY name="owner-numeric" type="uint32" size="3" draw="true" sort="string" display-name="Current Owner">1</PROPERTY>
    <PROPERTY name="rebalance" type="string" size="12" draw="false" sort="nosort" display-name="Rebalance Tier">Enabled</PROPERTY>
    <PROPERTY name="rebalance-numeric" type="uint32" size="12" draw="false" sort="nosort" display-name="Rebalance Tier">1</PROPERTY>
    <PROPERTY name="migration" type="string" size="12" draw="false" sort="nosort" display-name="Tiered Migration">Enabled</PROPERTY>
    <PROPERTY name="migration-numeric" type="uint32" size="12" draw="false" sort="nosort" display-name="Tiered Migration">1</PROPERTY>
    <PROPERTY name="zero-scan" type="string" size="12" draw="false" sort="nosort" display-name="Zero Page Scan">Enabled</PROPERTY>
    <PROPERTY name="zero-scan-numeric" type="uint32" size="12" draw="false" sort="nosort" display-name="Zero Page Scan">1</PROPERTY>
    <PROPERTY name="idle-page-check" type="string" size="12" draw="false" sort="nosort" display-name="Idle Page Check">Enabled</PROPERTY>
    <PROPERTY name="idle-page-check-numeric" type="uint32" size="12" draw="false" sort="nosort" display-name="Idle Page Check">1</PROPERTY>
    <PROPERTY name="read-flash-cache" type="string" size="12" draw="false" sort="nosort" display-name="Read Flash Cache">Enabled</PROPERTY>
    <PROPERTY name="read-flash-cache-numeric" type="uint32" size="12" draw="false" sort="nosort" display-name="Read Flash Cache">1</PROPERTY>
    <PROPERTY name="metadata-vol-size" units="MB" type="string" size="8" draw="false" sort="size" display-name="Metadata Volume Size">2147.4MB</PROPERTY>
    <PROPERTY name="metadata-vol-size-numeric" units="blocks512" type="uint64" size="8" draw="false" sort="size" display-name="Metadata Volume Size">4194304</PROPERTY>
    <PROPERTY name="total-rfc-size" units="B" type="string" size="22" draw="false" sort="string" display-name="Total RFC Size">0B</PROPERTY>
    <PROPERTY name="total-rfc-size-numeric" units="blocks512" type="uint64" size="22" draw="false" sort="string" display-name="Total RFC Size">0</PROPERTY>
    <PROPERTY name="available-rfc-size" units="B" type="string" size="22" draw="false" sort="string" display-name="Available RFC Size">0B</PROPERTY>
    <PROPERTY name="available-rfc-size-numeric" units="blocks512" type="uint64" size="22" draw="false" sort="string" display-name="Available RFC Size">0</PROPERTY>
    <PROPERTY name="reserved-size" units="B" type="string" size="22" draw="false" sort="string" display-name="Reserved Size">0B</PROPERTY>
    <PROPERTY name="reserved-size-numeric" units="blocks512" type="uint64" size="22" draw="false" sort="string" display-name="Reserved Size">0</PROPERTY>
    <PROPERTY name="reserved-unalloc-size" units="B" type="string" size="22" draw="false" sort="string" display-name="Unallocated Reserved Size">0B</PROPERTY>
    <PROPERTY name="reserved-unalloc-size-numeric" units="blocks512" type="uint64" size="22" draw="false" sort="string" display-name="Unallocated Reserved Size">0</PROPERTY>
    <PROPERTY name="pool-sector-format" type="string" size="9" draw="true" sort="string" display-name="Sector Format">512n</PROPERTY>
    <PROPERTY name="pool-sector-format-numeric" type="uint32" size="9" draw="true" sort="string" display-name="Sector Format">0</PROPERTY>
    <PROPERTY name="health" type="string" size="10" draw="true" sort="string" display-name="Health">OK</PROPERTY>
    <PROPERTY name="health-numeric" type="uint32" size="10" draw="true" sort="string" display-name="Health">0</PROPERTY>
    <PROPERTY name="health-reason" type="string" size="80" draw="true" sort="string" display-name="Health Reason"></PROPERTY>
    <PROPERTY name="health-recommendation" type="string" size="900" draw="true" sort="string" display-name="Health Recommendation"></PROPERTY>
  </OBJECT>
<COMP G="1" P="2"/>  <OBJECT basetype="disk-groups" name="disk-group" oid="2" format="rows">
    <PROPERTY name="name" type="string" size="32" draw="true" sort="string" display-name="Name">dgA01</PROPERTY>
    <PROPERTY name="url" type="string" size="32" draw="false" sort="string" display-name="URL">/disk-groups/00c0ff3bb3340000701ed35b00000000</PROPERTY>
    <PROPERTY name="blocksize" type="uint32" size="9" draw="true" sort="size" display-name="Blocksize">512</PROPERTY>
    <PROPERTY name="size" units="GB" type="string" size="16" draw="true" sort="size" display-name="Size">4193.5GB</PROPERTY>
    <PROPERTY name="size-numeric" units="blocks512" type="uint64" size="16" draw="true" sort="size" display-name="Size">8190623744</PROPERTY>
    <PROPERTY name="freespace" units="GB" type="string" size="16" draw="true" sort="size" display-name="Free">2875.1GB</PROPERTY>
    <PROPERTY name="freespace-numeric" units="blocks512" type="uint64" size="16" draw="true" sort="size" display-name="Free">5615493120</PROPERTY>
    <PROPERTY name="raw-size" units="GB" type="string" size="16" draw="false" sort="size" display-name="Raw Size">5401.1GB</PROPERTY>
    <PROPERTY name="raw-size-numeric" units="blocks512" type="uint64" size="16" draw="false" sort="size" display-name="Raw Size">10549112112</PROPERTY>
    <PROPERTY name="storage-type" type="string" size="8" draw="false" sort="string" display-name="Class">Virtual</PROPERTY>
    <PROPERTY name="storage-type-numeric" type="uint32" size="8" draw="false" sort="string" display-name="Class">1</PROPERTY>
    <PROPERTY name="pool" type="string" size="32" draw="true" sort="string" display-name="Pool">A</PROPERTY>
    <PROPERTY name="pools-url" type="string" size="32" draw="false" sort="string" display-name="Pools URL">/pools/00c0ff3bb3340000741ed35b01000000</PROPERTY>
    <PROPERTY name="pool-serial-number" type="string" size="32" draw="false" sort="string" display-name="Pool Serial Number">00c0ff3bb3340000741ed35b01000000</PROPERTY>
    <PROPERTY name="storage-tier" type="string" size="5" draw="true" sort="string" display-name="Tier">Standard</PROPERTY>
    <PROPERTY name="storage-tier-numeric" type="uint32" size="5" draw="true" sort="string" display-name="Tier">2</PROPERTY>
    <PROPERTY name="total-pages" type="uint32" size="16" draw="false" sort="size" display-name="Total Pages">999832</PROPERTY>
    <PROPERTY name="allocated-pages" type="uint32" size="16" draw="false" sort="size" display-name="Allocated Pages">314347</PROPERTY>
    <PROPERTY name="available-pages" type="uint32" size="16" draw="false" sort="string" display-name="Available Pages">685485</PROPERTY>
    <PROPERTY name="pool-percentage" type="uint8" size="10" draw="true" sort="string" display-name="% of Pool">100</PROPERTY>
    <PROPERTY name="performance-rank" type="uint8" size="17" draw="false" sort="size" display-name="Disk Group Performance Rank">0</PROPERTY>
    <PROPERTY name="owner" type="string" size="3" draw="true" sort="string" display-name="Current Owner">A</PROPERTY>
    <PROPERTY name="owner-numeric" type="uint32" size="3" draw="true" sort="string" display-name="Current Owner">1</PROPERTY>
    <PROPERTY name="preferred-owner" type="string" size="6" draw="true" sort="string" display-name="Preferred Owner">A</PROPERTY>
    <PROPERTY name="preferred-owner-numeric" type="uint32" size="6" draw="true" sort="string" display-name="Preferred Owner">1</PROPERTY>
    <PROPERTY name="raidtype" type="string" size="6" draw="true" sort="string" display-name="RAID">RAID6</PROPERTY>
    <PROPERTY name="raidtype-numeric" type="uint32" size="6" draw="true" sort="string" display-name="RAID">11</PROPERTY>
    <PROPERTY name="diskcount" type="uint16" size="5" draw="true" sort="string" display-name="Disks">9</PROPERTY>
    <PROPERTY name="sparecount" type="uint16" size="3" draw="true" sort="string" display-name="Spares">0</PROPERTY>
    <PROPERTY name="chunksize" type="string" size="4" draw="true" sort="string" display-name="Chunk Size">64k</PROPERTY>
    <PROPERTY name="status" type="string" size="6" draw="true" sort="string" display-name="Status">FTOL</PROPERTY>
    <PROPERTY name="status-numeric" type="uint32" size="6" draw="true" sort="string" display-name="Status">0</PROPERTY>
    <PROPERTY name="lun" type="uint32" size="6" draw="false" sort="string" display-name="LUN">4294967295</PROPERTY>
    <PROPERTY name="min-drive-size" units="GB" type="string" size="17" draw="false" sort="size" display-name="Minimum Disk Size">599.4GB</PROPERTY>
    <PROPERTY name="min-drive-size-numeric" units="blocks512" type="uint64" size="17" draw="false" sort="size" display-name="Minimum Disk Size">1170722049</PROPERTY>
    <PROPERTY name="create-date" type="string" size="20" draw="false" sort="string" display-name="Created">2018-10-26 14:02:24</PROPERTY>
    <PROPERTY name="create-date-numeric" type="uint32" size="20" draw="false" sort="string" display-name="Created">1540562544</PROPERTY>
    <PROPERTY name="cache-read-ahead" units="B" type="string" size="6" draw="false" sort="string" display-name="Cache Read Ahead">0B</PROPERTY>
    <PROPERTY name="cache-read-ahead-numeric" units="blocks512" type="uint64" size="6" draw="false" sort="string" display-name="Cache Read Ahead">0</PROPERTY>
    <PROPERTY name="cache-flush-period" type="uint32" size="6" draw="false" sort="string" display-name="Cache Flush Period">0</PROPERTY>
    <PROPERTY name="read-ahead-enabled" type="string" size="6" draw="false" sort="string" display-name="Read Ahead Enabled">Enabled</PROPERTY>
    <PROPERTY name="read-ahead-enabled-numeric" type="uint32" size="6" draw="false" sort="string" display-name="Read Ahead Enabled">1</PROPERTY>
    <PROPERTY name="write-back-enabled" type="string" size="6" draw="false" sort="string" display-name="Write Back Enabled">Enabled</PROPERTY>
    <PROPERTY name="write-back-enabled-numeric" type="uint32" size="6" draw="false" sort="string" display-name="Write Back Enabled">1</PROPERTY>
    <PROPERTY name="job-running" type="string" size="9" draw="true" sort="string" display-name="Current Job"></PROPERTY>
    <PROPERTY name="current-job" type="string" size="9" draw="false" sort="string" display-name="Current Job"></PROPERTY>
    <PROPERTY name="current-job-numeric" type="uint32" size="9" draw="false" sort="string" display-name="Current Job">0</PROPERTY>
    <PROPERTY name="current-job-completion" type="string" size="9" draw="true" sort="string" display-name="Current Job Completion"></PROPERTY>
    <PROPERTY name="num-array-partitions" type="uint32" size="6" draw="false" sort="string" display-name="Number of Volumes">4</PROPERTY>
    <PROPERTY name="largest-free-partition-space" units="B" type="string" size="6" draw="false" sort="string" display-name="Largest Free Partition Space">0B</PROPERTY>
    <PROPERTY name="largest-free-partition-space-numeric" units="blocks512" type="uint64" size="6" draw="false" sort="string" display-name="Largest Free Partition Space">0</PROPERTY>
    <PROPERTY name="num-drives-per-low-level-array" type="uint8" size="6" draw="false" sort="string" display-name="Number of Disks per sub-vdisk">1</PROPERTY>
    <PROPERTY name="num-expansion-partitions" type="uint8" size="6" draw="false" sort="string" display-name="Number of Expansion Volumes">0</PROPERTY>
    <PROPERTY name="num-partition-segments" type="uint8" size="6" draw="false" sort="string" display-name="Number of Volume Segments">0</PROPERTY>
    <PROPERTY name="new-partition-lba" units="B" type="string" size="6" draw="false" sort="string" display-name="New Volume LBA">0B</PROPERTY>
    <PROPERTY name="new-partition-lba-numeric" units="blocks512" type="uint64" size="6" draw="false" sort="string" display-name="New Volume LBA">0</PROPERTY>
    <PROPERTY name="array-drive-type" type="string" size="6" draw="false" sort="string" display-name="Disk Type">SAS</PROPERTY>
    <PROPERTY name="array-drive-type-numeric" type="uint32" size="6" draw="false" sort="string" display-name="Disk Type">4</PROPERTY>
    <PROPERTY name="is-job-auto-abortable" type="string" size="6" draw="false" sort="string" display-name="Is Job Auto Abortable">false</PROPERTY>
    <PROPERTY name="is-job-auto-abortable-numeric" type="uint32" size="6" draw="false" sort="string" display-name="Is Job Auto Abortable">0</PROPERTY>
    <PROPERTY name="serial-number" key="true" type="string" size="32" draw="true" sort="string" display-name="Serial Number">00c0ff3bb3340000701ed35b00000000</PROPERTY>
    <PROPERTY name="blocks" blocksize="512" type="uint64" size="32" draw="false" sort="integer" display-name="Blocks">8194818048</PROPERTY>
    <PROPERTY name="disk-dsd-enable-vdisk" type="string" size="22" draw="true" sort="nosort" display-name="Active Drive Spin Down Enable">Disabled</PROPERTY>
    <PROPERTY name="disk-dsd-enable-vdisk-numeric" type="uint32" size="22" draw="true" sort="nosort" display-name="Active Drive Spin Down Enable">0</PROPERTY>
    <PROPERTY name="disk-dsd-delay-vdisk" type="uint32" size="21" draw="true" sort="nosort" display-name="Active Drive Spin Down Delay">0</PROPERTY>
    <PROPERTY name="scrub-duration-goal" type="uint16" size="20" draw="false" sort="string" display-name="Scrub Duration Goal">0</PROPERTY>
    <PROPERTY name="adapt-target-spare-capacity" units="B" type="string" size="16" draw="true" sort="nosort" display-name="ADAPT Target Spare Capacity">0B</PROPERTY>
    <PROPERTY name="adapt-target-spare-capacity-numeric" units="blocks512" type="uint64" size="16" draw="true" sort="nosort" display-name="ADAPT Target Spare Capacity">0</PROPERTY>
    <PROPERTY name="adapt-actual-spare-capacity" units="B" type="string" size="16" draw="true" sort="nosort" display-name="ADAPT Actual Spare Capacity">0B</PROPERTY>
    <PROPERTY name="adapt-actual-spare-capacity-numeric" units="blocks512" type="uint64" size="16" draw="true" sort="nosort" display-name="ADAPT Actual Spare Capacity">0</PROPERTY>
    <PROPERTY name="adapt-critical-capacity" units="B" type="string" size="16" draw="true" sort="nosort" display-name="ADAPT Critical Disk Capacity">0B</PROPERTY>
    <PROPERTY name="adapt-critical-capacity-numeric" units="blocks512" type="uint64" size="16" draw="true" sort="nosort" display-name="ADAPT Critical Disk Capacity">0</PROPERTY>
    <PROPERTY name="adapt-degraded-capacity" units="B" type="string" size="16" draw="true" sort="nosort" display-name="ADAPT Degraded Disk Capacity">0B</PROPERTY>
    <PROPERTY name="adapt-degraded-capacity-numeric" units="blocks512" type="uint64" size="16" draw="true" sort="nosort" display-name="ADAPT Degraded Disk Capacity">0</PROPERTY>
    <PROPERTY name="adapt-linear-volume-boundary" type="uint32" size="32" draw="true" sort="nosort" display-name="ADAPT Linear Volume Partition Boundary">0</PROPERTY>
    <PROPERTY name="pool-sector-format" type="string" size="9" draw="true" sort="string" display-name="Sector Format">512n</PROPERTY>
    <PROPERTY name="pool-sector-format-numeric" type="uint32" size="9" draw="true" sort="string" display-name="Sector Format">0</PROPERTY>
    <PROPERTY name="health" type="string" size="10" draw="true" sort="string" display-name="Health">OK</PROPERTY>
    <PROPERTY name="health-numeric" type="uint32" size="10" draw="true" sort="string" display-name="Health">0</PROPERTY>
    <PROPERTY name="health-reason" type="string" size="80" draw="true" sort="string" display-name="Health Reason"></PROPERTY>
    <PROPERTY name="health-recommendation" type="string" size="900" draw="true" sort="string" display-name="Health Recommendation"></PROPERTY>
  </OBJECT>
<COMP G="1" P="3"/>  <OBJECT basetype="tiers" name="tiers" oid="3" format="rows">
    <PROPERTY name="serial-number" type="string" size="32" draw="false" sort="string" display-name="Serial Number">00c0ff3bb3340000741ed35b01000002</PROPERTY>
    <PROPERTY name="pool" type="string" size="32" draw="true" sort="string" display-name="Pool">A</PROPERTY>
    <PROPERTY name="tier" type="string" size="20" draw="true" sort="string" display-name="Tier">Standard</PROPERTY>
    <PROPERTY name="tier-numeric" type="uint32" size="20" draw="true" sort="string" display-name="Tier">2</PROPERTY>
    <PROPERTY name="pool-percentage" type="uint8" size="5" draw="true" sort="string" display-name="% of Pool">100</PROPERTY>
    <PROPERTY name="diskcount" type="uint8" size="6" draw="true" sort="string" display-name="Disks">9</PROPERTY>
    <PROPERTY name="raw-size" units="GB" type="string" size="22" draw="true" sort="string" display-name="Raw Size">5401.1GB</PROPERTY>
    <PROPERTY name="raw-size-numeric" units="blocks512" type="uint64" size="22" draw="true" sort="string" display-name="Raw Size">10549112112</PROPERTY>
    <PROPERTY name="total-size" units="GB" type="string" size="22" draw="true" sort="string" display-name="Total Size">4193.5GB</PROPERTY>
    <PROPERTY name="total-size-numeric" units="blocks512" type="uint64" size="22" draw="true" sort="string" display-name="Total Size">8190623744</PROPERTY>
    <PROPERTY name="allocated-size" units="GB" type="string" size="22" draw="true" sort="string" display-name="Allocated Size">1318.4GB</PROPERTY>
    <PROPERTY name="allocated-size-numeric" units="blocks512" type="uint64" size="22" draw="true" sort="string" display-name="Allocated Size">2575130624</PROPERTY>
    <PROPERTY name="available-size" units="GB" type="string" size="22" draw="true" sort="string" display-name="Available Size">2875.1GB</PROPERTY>
    <PROPERTY name="available-size-numeric" units="blocks512" type="uint64" size="22" draw="true" sort="string" display-name="Available Size">5615616000</PROPERTY>
    <PROPERTY name="affinity-size" units="B" type="string" size="22" draw="true" sort="string" display-name="Affinity Size">0B</PROPERTY>
    <PROPERTY name="affinity-size-numeric" units="blocks512" type="uint64" size="22" draw="true" sort="string" display-name="Affinity Size">0</PROPERTY>
  </OBJECT>
<COMP G="0" P="4"/>  <OBJECT basetype="status" name="status" oid="4">
    <PROPERTY name="response-type" type="string" size="12" draw="false" sort="nosort" display-name="Response Type">Success</PROPERTY>
    <PROPERTY name="response-type-numeric" type="uint32" size="12" draw="false" sort="nosort" display-name="Response Type">0</PROPERTY>
    <PROPERTY name="response" type="string" size="180" draw="true" sort="nosort" display-name="Response">Command completed successfully. (2021-03-09 09:14:13)</PROPERTY>
    <PROPERTY name="return-code" type="sint32" size="15" draw="false" sort="nosort" display-name="Return Code">0</PROPERTY>
    <PROPERTY name="component-id" type="string" size="80" draw="false" sort="nosort" display-name="Component ID"></PROPERTY>
    <PROPERTY name="time-stamp" type="string" size="25" draw="false" sort="datetime" display-name="Time">2021-03-09 09:14:13</PROPERTY>
    <PROPERTY name="time-stamp-numeric" type="uint32" size="25" draw="false" sort="datetime" display-name="Time">1615281253</PROPERTY>
  </OBJECT>
</RESPONSE>
# 

Much appreciated.

UPDATE
OK. I noticed the resulting .xml is generated with a # in the header and the last line. This seems to be what was causing the error.

However, with the full file, it only returns the first “hit”.

Name total-size total-avail
---- ---------- -----------
A    4193.5GB   2875.1GB   


I need to figure out a quick way to remove those lines that contain a # and make sure it finds all pools.

It appears you are just getting information out of the pools node, so something like this would take all of the properties and make them a PSObject:

[xml]$xml = @"
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<RESPONSE VERSION="L100" REQUEST="show pools">
    <COMP G="0" P="1"/>  
    <OBJECT basetype="pools" name="pools" oid="1" format="rows">
        <PROPERTY name="name" type="string" size="32" draw="true" sort="string" display-name="Name">A</PROPERTY>
        <PROPERTY name="serial-number" key="true" type="string" size="32" draw="true" sort="string" display-name="Serial Number">00c0ff3bb3340000741ed35b01000000</PROPERTY>
        <PROPERTY name="url" key="true" type="string" size="32" draw="false" sort="string" display-name="URL">/pools/00c0ff3bb3340000741ed35b01000000</PROPERTY>
        <PROPERTY name="storage-type" type="string" size="8" draw="false" sort="string" display-name="Class">Virtual</PROPERTY>
        <PROPERTY name="storage-type-numeric" type="uint32" size="8" draw="false" sort="string" display-name="Class">1</PROPERTY>
        <PROPERTY name="blocksize" type="uint32" size="9" draw="true" sort="size" display-name="Blocksize">512</PROPERTY>
        <PROPERTY name="total-size" units="GB" type="string" size="9" draw="true" sort="size" display-name="Total Size">4193.5GB</PROPERTY>
        <PROPERTY name="total-size-numeric" units="blocks512" type="uint64" size="9" draw="true" sort="size" display-name="Total Size">8190623744</PROPERTY>
        <PROPERTY name="total-avail" units="GB" type="string" size="9" draw="true" sort="size" display-name="Avail">2875.1GB</PROPERTY>
        <PROPERTY name="total-avail-numeric" units="blocks512" type="uint64" size="9" draw="true" sort="size" display-name="Avail">5615616000</PROPERTY>
        <PROPERTY name="snap-size" units="B" type="string" size="9" draw="true" sort="size" display-name="Snap Size">0B</PROPERTY>
        <PROPERTY name="snap-size-numeric" units="blocks512" type="uint64" size="9" draw="true" sort="size" display-name="Snap Size">0</PROPERTY>
        <PROPERTY name="allocated-pages" type="uint32" size="16" draw="true" sort="size" display-name="Allocated Pages">314332</PROPERTY>
        <PROPERTY name="available-pages" type="uint32" size="16" draw="true" sort="size" display-name="Available Pages">685500</PROPERTY>
        <PROPERTY name="overcommit" type="string" size="11" draw="false" sort="string" display-name="OverCommit">Enabled</PROPERTY>
        <PROPERTY name="overcommit-numeric" type="uint32" size="11" draw="false" sort="string" display-name="OverCommit">1</PROPERTY>
        <PROPERTY name="over-committed" type="string" size="8" draw="true" sort="string" display-name="Over-Committed">True</PROPERTY>
        <PROPERTY name="over-committed-numeric" type="uint32" size="8" draw="true" sort="string" display-name="Over-Committed">1</PROPERTY>
        <PROPERTY name="disk-groups" type="uint16" size="11" draw="true" sort="string" display-name="Disk Groups">1</PROPERTY>
        <PROPERTY name="volumes" type="uint16" size="8" draw="true" sort="string" display-name="Volumes">2</PROPERTY>
        <PROPERTY name="page-size" units="KB" type="string" size="17" draw="false" sort="size" display-name="Page Size (Blocks)">4194.3KB</PROPERTY>
        <PROPERTY name="page-size-numeric" units="blocks512" type="uint64" size="17" draw="false" sort="size" display-name="Page Size (Blocks)">8192</PROPERTY>
        <PROPERTY name="low-threshold" type="string" size="11" draw="true" sort="string" display-name="Low Thresh">50.00 %</PROPERTY>
        <PROPERTY name="middle-threshold" type="string" size="11" draw="true" sort="string" display-name="Mid Thresh">75.00 %</PROPERTY>
        <PROPERTY name="high-threshold" type="string" size="12" draw="true" sort="string" display-name="High Thresh">94.87 %</PROPERTY>
        <PROPERTY name="utility-running" type="string" size="9" draw="false" sort="string" display-name="(null)"></PROPERTY>
        <PROPERTY name="utility-running-numeric" type="uint32" size="9" draw="false" sort="string" display-name="(null)">0</PROPERTY>
        <PROPERTY name="preferred-owner" type="string" size="4" draw="true" sort="string" display-name="Preferred Owner">A</PROPERTY>
        <PROPERTY name="preferred-owner-numeric" type="uint32" size="4" draw="true" sort="string" display-name="Preferred Owner">1</PROPERTY>
        <PROPERTY name="owner" type="string" size="3" draw="true" sort="string" display-name="Current Owner">A</PROPERTY>
        <PROPERTY name="owner-numeric" type="uint32" size="3" draw="true" sort="string" display-name="Current Owner">1</PROPERTY>
        <PROPERTY name="rebalance" type="string" size="12" draw="false" sort="nosort" display-name="Rebalance Tier">Enabled</PROPERTY>
        <PROPERTY name="rebalance-numeric" type="uint32" size="12" draw="false" sort="nosort" display-name="Rebalance Tier">1</PROPERTY>
        <PROPERTY name="migration" type="string" size="12" draw="false" sort="nosort" display-name="Tiered Migration">Enabled</PROPERTY>
        <PROPERTY name="migration-numeric" type="uint32" size="12" draw="false" sort="nosort" display-name="Tiered Migration">1</PROPERTY>
        <PROPERTY name="zero-scan" type="string" size="12" draw="false" sort="nosort" display-name="Zero Page Scan">Enabled</PROPERTY>
        <PROPERTY name="zero-scan-numeric" type="uint32" size="12" draw="false" sort="nosort" display-name="Zero Page Scan">1</PROPERTY>
        <PROPERTY name="idle-page-check" type="string" size="12" draw="false" sort="nosort" display-name="Idle Page Check">Enabled</PROPERTY>
        <PROPERTY name="idle-page-check-numeric" type="uint32" size="12" draw="false" sort="nosort" display-name="Idle Page Check">1</PROPERTY>
        <PROPERTY name="read-flash-cache" type="string" size="12" draw="false" sort="nosort" display-name="Read Flash Cache">Enabled</PROPERTY>
        <PROPERTY name="read-flash-cache-numeric" type="uint32" size="12" draw="false" sort="nosort" display-name="Read Flash Cache">1</PROPERTY>
        <PROPERTY name="metadata-vol-size" units="MB" type="string" size="8" draw="false" sort="size" display-name="Metadata Volume Size">2147.4MB</PROPERTY>
        <PROPERTY name="metadata-vol-size-numeric" units="blocks512" type="uint64" size="8" draw="false" sort="size" display-name="Metadata Volume Size">4194304</PROPERTY>
        <PROPERTY name="total-rfc-size" units="B" type="string" size="22" draw="false" sort="string" display-name="Total RFC Size">0B</PROPERTY>
        <PROPERTY name="total-rfc-size-numeric" units="blocks512" type="uint64" size="22" draw="false" sort="string" display-name="Total RFC Size">0</PROPERTY>
        <PROPERTY name="available-rfc-size" units="B" type="string" size="22" draw="false" sort="string" display-name="Available RFC Size">0B</PROPERTY>
        <PROPERTY name="available-rfc-size-numeric" units="blocks512" type="uint64" size="22" draw="false" sort="string" display-name="Available RFC Size">0</PROPERTY>
        <PROPERTY name="reserved-size" units="B" type="string" size="22" draw="false" sort="string" display-name="Reserved Size">0B</PROPERTY>
        <PROPERTY name="reserved-size-numeric" units="blocks512" type="uint64" size="22" draw="false" sort="string" display-name="Reserved Size">0</PROPERTY>
        <PROPERTY name="reserved-unalloc-size" units="B" type="string" size="22" draw="false" sort="string" display-name="Unallocated Reserved Size">0B</PROPERTY>
        <PROPERTY name="reserved-unalloc-size-numeric" units="blocks512" type="uint64" size="22" draw="false" sort="string" display-name="Unallocated Reserved Size">0</PROPERTY>
        <PROPERTY name="pool-sector-format" type="string" size="9" draw="true" sort="string" display-name="Sector Format">512n</PROPERTY>
        <PROPERTY name="pool-sector-format-numeric" type="uint32" size="9" draw="true" sort="string" display-name="Sector Format">0</PROPERTY>
        <PROPERTY name="health" type="string" size="10" draw="true" sort="string" display-name="Health">OK</PROPERTY>
        <PROPERTY name="health-numeric" type="uint32" size="10" draw="true" sort="string" display-name="Health">0</PROPERTY>
        <PROPERTY name="health-reason" type="string" size="80" draw="true" sort="string" display-name="Health Reason"></PROPERTY>
        <PROPERTY name="health-recommendation" type="string" size="900" draw="true" sort="string" display-name="Health Recommendation"></PROPERTY>
    </OBJECT>
    <COMP G="0" P="4"/>  
    <OBJECT basetype="status" name="status" oid="4">
        <PROPERTY name="response-type" type="string" size="12" draw="false" sort="nosort" display-name="Response Type">Success</PROPERTY>
        <PROPERTY name="response-type-numeric" type="uint32" size="12" draw="false" sort="nosort" display-name="Response Type">0</PROPERTY>
        <PROPERTY name="response" type="string" size="180" draw="true" sort="nosort" display-name="Response">Command completed successfully. (2021-03-09 09:14:13)</PROPERTY>
        <PROPERTY name="return-code" type="sint32" size="15" draw="false" sort="nosort" display-name="Return Code">0</PROPERTY>
        <PROPERTY name="component-id" type="string" size="80" draw="false" sort="nosort" display-name="Component ID"></PROPERTY>
        <PROPERTY name="time-stamp" type="string" size="25" draw="false" sort="datetime" display-name="Time">2021-03-09 09:14:13</PROPERTY>
        <PROPERTY name="time-stamp-numeric" type="uint32" size="25" draw="false" sort="datetime" display-name="Time">1615281253</PROPERTY>
    </OBJECT>
    <OBJECT basetype="pools" name="pools" oid="1" format="rows">
        <PROPERTY name="name" type="string" size="32" draw="true" sort="string" display-name="Name">B</PROPERTY>
        <PROPERTY name="serial-number" key="true" type="string" size="32" draw="true" sort="string" display-name="Serial Number">00c0ff3bb3340000741ed35b01000000</PROPERTY>
        <PROPERTY name="url" key="true" type="string" size="32" draw="false" sort="string" display-name="URL">/pools/00c0ff3bb3340000741ed35b01000000</PROPERTY>
        <PROPERTY name="storage-type" type="string" size="8" draw="false" sort="string" display-name="Class">Virtual</PROPERTY>
        <PROPERTY name="storage-type-numeric" type="uint32" size="8" draw="false" sort="string" display-name="Class">1</PROPERTY>
        <PROPERTY name="blocksize" type="uint32" size="9" draw="true" sort="size" display-name="Blocksize">512</PROPERTY>
        <PROPERTY name="total-size" units="GB" type="string" size="9" draw="true" sort="size" display-name="Total Size">4193.5GB</PROPERTY>
        <PROPERTY name="total-size-numeric" units="blocks512" type="uint64" size="9" draw="true" sort="size" display-name="Total Size">8190623744</PROPERTY>
        <PROPERTY name="total-avail" units="GB" type="string" size="9" draw="true" sort="size" display-name="Avail">2875.1GB</PROPERTY>
        <PROPERTY name="total-avail-numeric" units="blocks512" type="uint64" size="9" draw="true" sort="size" display-name="Avail">5615616000</PROPERTY>
        <PROPERTY name="snap-size" units="B" type="string" size="9" draw="true" sort="size" display-name="Snap Size">0B</PROPERTY>
        <PROPERTY name="snap-size-numeric" units="blocks512" type="uint64" size="9" draw="true" sort="size" display-name="Snap Size">0</PROPERTY>
        <PROPERTY name="allocated-pages" type="uint32" size="16" draw="true" sort="size" display-name="Allocated Pages">314332</PROPERTY>
        <PROPERTY name="available-pages" type="uint32" size="16" draw="true" sort="size" display-name="Available Pages">685500</PROPERTY>
        <PROPERTY name="overcommit" type="string" size="11" draw="false" sort="string" display-name="OverCommit">Enabled</PROPERTY>
        <PROPERTY name="overcommit-numeric" type="uint32" size="11" draw="false" sort="string" display-name="OverCommit">1</PROPERTY>
        <PROPERTY name="over-committed" type="string" size="8" draw="true" sort="string" display-name="Over-Committed">True</PROPERTY>
        <PROPERTY name="over-committed-numeric" type="uint32" size="8" draw="true" sort="string" display-name="Over-Committed">1</PROPERTY>
        <PROPERTY name="disk-groups" type="uint16" size="11" draw="true" sort="string" display-name="Disk Groups">1</PROPERTY>
        <PROPERTY name="volumes" type="uint16" size="8" draw="true" sort="string" display-name="Volumes">2</PROPERTY>
        <PROPERTY name="page-size" units="KB" type="string" size="17" draw="false" sort="size" display-name="Page Size (Blocks)">4194.3KB</PROPERTY>
        <PROPERTY name="page-size-numeric" units="blocks512" type="uint64" size="17" draw="false" sort="size" display-name="Page Size (Blocks)">8192</PROPERTY>
        <PROPERTY name="low-threshold" type="string" size="11" draw="true" sort="string" display-name="Low Thresh">50.00 %</PROPERTY>
        <PROPERTY name="middle-threshold" type="string" size="11" draw="true" sort="string" display-name="Mid Thresh">75.00 %</PROPERTY>
        <PROPERTY name="high-threshold" type="string" size="12" draw="true" sort="string" display-name="High Thresh">94.87 %</PROPERTY>
        <PROPERTY name="utility-running" type="string" size="9" draw="false" sort="string" display-name="(null)"></PROPERTY>
        <PROPERTY name="utility-running-numeric" type="uint32" size="9" draw="false" sort="string" display-name="(null)">0</PROPERTY>
        <PROPERTY name="preferred-owner" type="string" size="4" draw="true" sort="string" display-name="Preferred Owner">A</PROPERTY>
        <PROPERTY name="preferred-owner-numeric" type="uint32" size="4" draw="true" sort="string" display-name="Preferred Owner">1</PROPERTY>
        <PROPERTY name="owner" type="string" size="3" draw="true" sort="string" display-name="Current Owner">A</PROPERTY>
        <PROPERTY name="owner-numeric" type="uint32" size="3" draw="true" sort="string" display-name="Current Owner">1</PROPERTY>
        <PROPERTY name="rebalance" type="string" size="12" draw="false" sort="nosort" display-name="Rebalance Tier">Enabled</PROPERTY>
        <PROPERTY name="rebalance-numeric" type="uint32" size="12" draw="false" sort="nosort" display-name="Rebalance Tier">1</PROPERTY>
        <PROPERTY name="migration" type="string" size="12" draw="false" sort="nosort" display-name="Tiered Migration">Enabled</PROPERTY>
        <PROPERTY name="migration-numeric" type="uint32" size="12" draw="false" sort="nosort" display-name="Tiered Migration">1</PROPERTY>
        <PROPERTY name="zero-scan" type="string" size="12" draw="false" sort="nosort" display-name="Zero Page Scan">Enabled</PROPERTY>
        <PROPERTY name="zero-scan-numeric" type="uint32" size="12" draw="false" sort="nosort" display-name="Zero Page Scan">1</PROPERTY>
        <PROPERTY name="idle-page-check" type="string" size="12" draw="false" sort="nosort" display-name="Idle Page Check">Enabled</PROPERTY>
        <PROPERTY name="idle-page-check-numeric" type="uint32" size="12" draw="false" sort="nosort" display-name="Idle Page Check">1</PROPERTY>
        <PROPERTY name="read-flash-cache" type="string" size="12" draw="false" sort="nosort" display-name="Read Flash Cache">Enabled</PROPERTY>
        <PROPERTY name="read-flash-cache-numeric" type="uint32" size="12" draw="false" sort="nosort" display-name="Read Flash Cache">1</PROPERTY>
        <PROPERTY name="metadata-vol-size" units="MB" type="string" size="8" draw="false" sort="size" display-name="Metadata Volume Size">2147.4MB</PROPERTY>
        <PROPERTY name="metadata-vol-size-numeric" units="blocks512" type="uint64" size="8" draw="false" sort="size" display-name="Metadata Volume Size">4194304</PROPERTY>
        <PROPERTY name="total-rfc-size" units="B" type="string" size="22" draw="false" sort="string" display-name="Total RFC Size">0B</PROPERTY>
        <PROPERTY name="total-rfc-size-numeric" units="blocks512" type="uint64" size="22" draw="false" sort="string" display-name="Total RFC Size">0</PROPERTY>
        <PROPERTY name="available-rfc-size" units="B" type="string" size="22" draw="false" sort="string" display-name="Available RFC Size">0B</PROPERTY>
        <PROPERTY name="available-rfc-size-numeric" units="blocks512" type="uint64" size="22" draw="false" sort="string" display-name="Available RFC Size">0</PROPERTY>
        <PROPERTY name="reserved-size" units="B" type="string" size="22" draw="false" sort="string" display-name="Reserved Size">0B</PROPERTY>
        <PROPERTY name="reserved-size-numeric" units="blocks512" type="uint64" size="22" draw="false" sort="string" display-name="Reserved Size">0</PROPERTY>
        <PROPERTY name="reserved-unalloc-size" units="B" type="string" size="22" draw="false" sort="string" display-name="Unallocated Reserved Size">0B</PROPERTY>
        <PROPERTY name="reserved-unalloc-size-numeric" units="blocks512" type="uint64" size="22" draw="false" sort="string" display-name="Unallocated Reserved Size">0</PROPERTY>
        <PROPERTY name="pool-sector-format" type="string" size="9" draw="true" sort="string" display-name="Sector Format">512n</PROPERTY>
        <PROPERTY name="pool-sector-format-numeric" type="uint32" size="9" draw="true" sort="string" display-name="Sector Format">0</PROPERTY>
        <PROPERTY name="health" type="string" size="10" draw="true" sort="string" display-name="Health">OK</PROPERTY>
        <PROPERTY name="health-numeric" type="uint32" size="10" draw="true" sort="string" display-name="Health">0</PROPERTY>
        <PROPERTY name="health-reason" type="string" size="80" draw="true" sort="string" display-name="Health Reason"></PROPERTY>
        <PROPERTY name="health-recommendation" type="string" size="900" draw="true" sort="string" display-name="Health Recommendation"></PROPERTY>
    </OBJECT>    
</RESPONSE>
"@


$results = foreach ($pool in ($xml.RESPONSE.OBJECT | Where{$_.basetype -eq 'pools'})) {
    $props = @{}
    foreach( $xmlProp in $pool.PROPERTY ) {
        $props.Add($xmlProp.name,$xmlProp.'#text')
    }
    [pscustomobject]$props 
}

$results

Output:

PS C:\Users\rasim\Dropbox\GitHub\Powershell\RemedyForce> $results


reserved-size                 : 0B
rebalance                     : Enabled
health-numeric                : 0
available-rfc-size-numeric    : 0
over-committed-numeric        : 1
low-threshold                 : 50.00 %
page-size-numeric             : 8192
allocated-pages               : 314332
zero-scan-numeric             : 1
page-size                     : 4194.3KB
storage-type                  : Virtual
idle-page-check               : Enabled
read-flash-cache-numeric      : 1
metadata-vol-size-numeric     : 4194304
read-flash-cache              : Enabled
over-committed                : True
utility-running-numeric       : 0
health-recommendation         :
migration-numeric             : 1
migration                     : Enabled
url                           : /pools/00c0ff3bb3340000741ed35b01000000
total-avail-numeric           : 5615616000
high-threshold                : 94.87 %
snap-size                     : 0B
reserved-unalloc-size         : 0B
serial-number                 : 00c0ff3bb3340000741ed35b01000000
preferred-owner-numeric       : 1
available-pages               : 685500
snap-size-numeric             : 0
health-reason                 :
overcommit                    : Enabled
utility-running               :
idle-page-check-numeric       : 1
overcommit-numeric            : 1
health                        : OK
metadata-vol-size             : 2147.4MB
pool-sector-format            : 512n
blocksize                     : 512
owner-numeric                 : 1
reserved-unalloc-size-numeric : 0
total-size-numeric            : 8190623744
rebalance-numeric             : 1
total-size                    : 4193.5GB
total-avail                   : 2875.1GB
owner                         : A
total-rfc-size                : 0B
disk-groups                   : 1
zero-scan                     : Enabled
pool-sector-format-numeric    : 0
preferred-owner               : A
storage-type-numeric          : 1
available-rfc-size            : 0B
reserved-size-numeric         : 0
name                          : A
volumes                       : 2
middle-threshold              : 75.00 %
total-rfc-size-numeric        : 0

reserved-size                 : 0B
rebalance                     : Enabled
health-numeric                : 0
available-rfc-size-numeric    : 0
over-committed-numeric        : 1
low-threshold                 : 50.00 %
page-size-numeric             : 8192
allocated-pages               : 314332
zero-scan-numeric             : 1
page-size                     : 4194.3KB
storage-type                  : Virtual
idle-page-check               : Enabled
read-flash-cache-numeric      : 1
metadata-vol-size-numeric     : 4194304
read-flash-cache              : Enabled
over-committed                : True
utility-running-numeric       : 0
health-recommendation         :
migration-numeric             : 1
migration                     : Enabled
url                           : /pools/00c0ff3bb3340000741ed35b01000000
total-avail-numeric           : 5615616000
high-threshold                : 94.87 %
snap-size                     : 0B
reserved-unalloc-size         : 0B
serial-number                 : 00c0ff3bb3340000741ed35b01000000
preferred-owner-numeric       : 1
available-pages               : 685500
snap-size-numeric             : 0
health-reason                 :
overcommit                    : Enabled
utility-running               :
idle-page-check-numeric       : 1
overcommit-numeric            : 1
health                        : OK
metadata-vol-size             : 2147.4MB
pool-sector-format            : 512n
blocksize                     : 512
owner-numeric                 : 1
reserved-unalloc-size-numeric : 0
total-size-numeric            : 8190623744
rebalance-numeric             : 1
total-size                    : 4193.5GB
total-avail                   : 2875.1GB
owner                         : A
total-rfc-size                : 0B
disk-groups                   : 1
zero-scan                     : Enabled
pool-sector-format-numeric    : 0
preferred-owner               : A
storage-type-numeric          : 1
available-rfc-size            : 0B
reserved-size-numeric         : 0
name                          : B
volumes                       : 2
middle-threshold              : 75.00 %
total-rfc-size-numeric        : 0
3 Likes

Seems I have multiple solutions. With the PS object, I can then convert to .csv if additional fields are needed.

Thank you very much for all your suggestions. I’ve learned a lot about .xml.

Hello rob,

Not sure what I’m doing wrong. Here is what I added to your code:

$OutTbl = @()
$results | ForEach {
    $OutObj   = "" | Select PoolName, RawTB, UsableTB, AllocatedTB, FreeTB, PCTFull
    $OutObj.PoolName    = $_.name
    $OutObj.RawTB       = ([math]::round(($_.'total-size-numeric'/1073741824),2))   #Convert to TB
    $OutObj.UsableTB    = ([math]::round((($_.'total-size' -split 'GB')/1024),2))   #Convert to TB
    $OutObj.AllocatedTB = ([math]::round((($_.'total-avail' -split 'GB')/1024),2))  #Convert to TB
    $OutObj.FreeTB      = ($OutObj.UsableTB - $OutObj.AllocatedTB)
    $OutObj.PCTFull     = ($OutObj.AllocatedTB / $OutObj.UsableTB)
    $OutTbl+=$OutObj
    }
$OutTbl

This is what I end up with:

PoolName    : A
RawTB       : 7.63
UsableTB    : 
AllocatedTB : 
FreeTB      : 0
PCTFull     : 

PoolName    : B
RawTB       : 7.63
UsableTB    : 
AllocatedTB : 
FreeTB      : 0
PCTFull     :

Basically, I’m trying to convert to TB and build a table for export to CSV with the shown headers.

Much appreciated.

Palmero,

First let me just point out that all this

$OutTbl = @()
$OutObj   = "" | Select PoolName, RawTB, UsableTB, AllocatedTB, FreeTB, PCTFull
$OutTbl+=$OutObj

Is unnecessary and in larger data sets can be extremely slow. I implore you to look into alternative ways whenever you feel the urge to do any of these.

As far as your issue with your last script, first issue is if you run this by itself

$results | ForEach-Object {
    ([math]::round((($_.'total-size' -split 'GB')/1024),2))
}

You should see an error that [string] doesn’t have a method named ‘op_Division’. If you run this by itself

$results | ForEach-Object {
    $_.'total-size' -split 'GB'
}

You should see it comes back with 2 lines per object, one with the number you’re after and the other a blank line. Of course you could select it with [0] but I think -replace is a bit more appropriate here.

$results | ForEach-Object {
    ([math]::round((($_.'total-size' -replace 'GB')/1024),2))
}

Now that is more like it. To put it all together without the extra building up of objects, it can look like this.

$OutTbl = $results | ForEach-Object {

    $usableTB    = ([math]::round((($_.'total-size' -replace 'GB')/1024),2)) 
    $allocatedTB = ([math]::round((($_.'total-avail' -replace 'GB')/1024),2))

    [PSCustomObject]@{
        PoolName    = $_.name
        RawTB       = ([math]::round(($_.'total-size-numeric'/1073741824),2))
        UsableTB    = $usableTB
        AllocatedTB = $allocatedTB
        FreetB      = $usableTB - $allocatedTB
        PCTFull     = "{0:n2}" -f ($allocatedTB / $usableTB)
    }
}

And the output stored in $OutTbl should be

image

Also any advanced function or cmdlet supports -OutVariable. This is a nice feature when you want to both store output to a variable as well as see it on the screen. Simply change the script above to

$results | ForEach-Object {

    $usableTB    = ([math]::round((($_.'total-size' -replace 'GB')/1024),2)) 
    $allocatedTB = ([math]::round((($_.'total-avail' -replace 'GB')/1024),2))

    [PSCustomObject]@{
        PoolName    = $_.name
        RawTB       = ([math]::round(($_.'total-size-numeric'/1073741824),2))
        UsableTB    = $usableTB
        AllocatedTB = $allocatedTB
        FreetB      = $usableTB - $allocatedTB
        PCTFull     = "{0:n2}" -f ($allocatedTB / $usableTB)
    }
} -OutVariable OutTbl
2 Likes

Hello.

I like your solution. It’s much cleaner. I need to extract metrics for 3 separate arrays. Found out one of the HPE MSA arrays (thanks HPE!) reports sizes in TB. I now have the following:

$results | ForEach-Object {
    If($_.'total-size' -match 'TB') {
        $rawTB  = [math]::round((([float](([string]($_.'total-size'  -replace 'TB')))*1.34)),2)
        $usedTB = [math]::round(( [float](([string]($_.'total-size'  -replace 'TB')))),2)
        $freeTB = [math]::round(( [float](([string]($_.'total-avail' -replace 'TB')))),2)
    }
    Else {
        $rawTB  = [math]::round((([float](([string]($_.'total-size'  -replace 'GB')))*1.34)/1000),2)
        $usedTB = [math]::round(( [float](([string]($_.'total-size'  -replace 'GB'))/1KB)),2)  
        $freeTB = [math]::round(( [float](([string]($_.'total-avail' -replace 'GB'))/1KB)),2) 
    }
   
    $allocTB    = [math]::round(( [float]($usedTB - $freeTB)),2)
    $pctFull    = "{0:n2}" -f (($allocTB / $usedTB)*100)

    [PSCustomObject]@{
        PoolName    = $_.name
        RawTB       = $rawTB
        UsableTB    = $usedTB
        AllocatedTB = $allocTB
        FreetB      = $freeTB
        PCTFull     = $pctFull
    }
} -OutVariable OutTbl

I also modified the PCTFull calculation.

This generates the correct output for each array.

Thank you very much for your suggestions. Learn something every day.

1 Like