Exporting HashTable/OrderedDictionary to CSV : (Key: Row1; Value: Row2)
Desired Output:
| col1 col2 col3 col4 ......
+--------------------------------------------
1|LDClass LDName LDNoSDClass ......
2|{LD} {LD1} {5}{5}......
Name Value
---- -----
LDClass {LD}
LDName {LD1}
LDNo{5}
SDClass {5}
I've collected a set of properties to a Variable ($hash), after parsing an XML file.
==================================
$hash | gm
TypeName: System.Collections.Specialized.OrderedDictionary
$hash.GetType()
IsPublic IsSerial Name BaseType -------- -------- ---- -------- True True OrderedDictionary System.Object
==================================
Here goes my Code:
==================================================================
# Import XML file and cast it to a Variable
$XML = [xml] (Get-Content Test.xml)
$LDArray = $xml.selectnodes("//device") | Where {$_.class -eq "logicalDrive"}
$SDCntrlArray = $xml.selectnodes("//device") | Where {$_.class -eq "storageController"}
$HDArrays = $xml.selectnodes("//device") | where {$_.class -eq "HardDrive"}
# ==============================================================================================================================================
$SvrInfoArray = @()
# Fetch Server Information
$SvrInfo= New-Object -TypeName PSObject
$SvrInfo | Add-Member -MemberType NoteProperty -Name SrvSerialNo -value ($xml.diagOutput.category[-1].structure.Property | where {$_.name -eq "serialNumber"} | select value | sort -Unique | select -ExpandProperty Value)
$SvrInfo | Add-Member -MemberType NoteProperty -Name SrvModel -value ($xml.diagOutput.category[-1].structure.Property | where {$_.name -eq "productName"} | select -ExpandProperty Value)
$SvrInfo | Add-Member -MemberType NoteProperty -Name RptTimeStamp -value ($xml.ChildNodes | where {$_.Type -eq "idResult"} | Select -ExpandProperty timeStampCaption)
$SvrInfo | Add-Member -MemberType NoteProperty -Name InsgtDiagVer -value ($xml.ChildNodes | where {$_.Type -eq "idResult"} | Select -ExpandProperty buildVersion)
$SvrInfoArray += $SvrInfo
# Define a hash table to hold properties of all Logical Drives
$SrvHash = [ordered]@{
SrvSerialNo=@($SvrInfoArray."SrvSerialNo")
SrvModel=@($SvrInfoArray."SrvModel")
RptTimeStamp = @($SvrInfoArray."RptTimeStamp")
InsgtDiagVer = @($SvrInfoArray."InsgtDiagVer")
}
#$SrvHash
$Hash += $SrvHash
# ==============================================================================================================================================
$LDInfoArray = @()
If ($LDArray.count -gt 0)
{$i = 0
While ($i -lt $LDArray.count)
{
# Fetch Properties of each Logical Drive
$LDInfo1 = New-Object -TypeName PSObject
$LDInfo1 | Add-Member -MemberType NoteProperty -Name LDClass -value $LDArray[$i].class
$LDInfo1 | Add-Member -MemberType NoteProperty -Name LDName -value $LDArray[$i].Name
$LDInfo1 | Add-Member -MemberType NoteProperty -Name LDCaption -value $LDArray[$i].Caption
$LDInfo1 | Add-Member -MemberType NoteProperty -Name LDDescription -value $LDArray[$i].Description
$LDInfo1 | Add-Member -MemberType NoteProperty -Name LDNoOfHDonCntrlr -value ($LDArray[$i].Property | Where {$_.Name -like "numberOfHardDrivesOnControlle*"} | Select -ExpandProperty Value)
$LDInfo1 | Add-Member -MemberType NoteProperty -Name LDNoOfHDinLD -value ($LDArray[$i].Property | Where {$_.Name -like "numberOfHardDrivesInLogicalDriv*"} | Select -ExpandProperty Value)
$LDInfoArray += $LDInfo1
$i= $i+1
}
}
Else {
$LDInfo1 = New-Object -TypeName PSObject
$LDInfo1 | Add-Member -MemberType NoteProperty -Name LDClass -value $LDArray.class
$LDInfo1 | Add-Member -MemberType NoteProperty -Name LDName -value $LDArray.Name
$LDInfo1 | Add-Member -MemberType NoteProperty -Name LDCaption -value $LDArray.Caption
$LDInfo1 | Add-Member -MemberType NoteProperty -Name LDDescription -value $LDArray.Description
$LDInfo1 | Add-Member -MemberType NoteProperty -Name LDNoOfHDonCntrlr -value ($LDArray.Property | Where {$_.Name -like "numberOfHardDrivesOnControlle*"} | Select -ExpandProperty Value)
$LDInfo1 | Add-Member -MemberType NoteProperty -Name LDNoOfHDinLD -value ($LDArray.Property | Where {$_.Name -like "numberOfHardDrivesInLogicalDriv*"} | Select -ExpandProperty Value)
$LDInfoArray += $LDInfo1
}
# Define a hash table to hold properties of all Logical Drives
$LDHash = [ordered]@{
LDClass=@($LDInfoArray."LDClass")
LDName=@($LDInfoArray."LDName")
LDCaption = @($LDInfoArray."LDCaption")
LDDescription = @($LDInfoArray."LDDescription")
LDNoOfHDonCntrlr = @($LDInfoArray."LDNoOfHDonCntrlr")
LDNoOfHDinLD = @($LDInfoArray."LDNoOfHDinLD")
}
# $LDHash
$Hash += $LDHash
# ==============================================================================================================================================
$SDInfoArray = @()
If ($SDCntrlArray.count -gt 0)
{$i = 0
While ($i -lt $SDCntrlArray.count)
{
# Fetch Properties of each Storage Controller
$SDInfo1 = New-Object -TypeName PSObject
$SDInfo1 | Add-Member -MemberType NoteProperty -Name SDClass -value $SDCntrlArray[$i].class
$SDInfo1 | Add-Member -MemberType NoteProperty -Name SDName -value $SDCntrlArray[$i].Name
$SDInfo1 | Add-Member -MemberType NoteProperty -Name SDCaption -value $SDCntrlArray[$i].Caption
$SDInfo1 | Add-Member -MemberType NoteProperty -Name SDDescription -value $SDCntrlArray[$i].Description
$SDInfo1 | Add-Member -MemberType NoteProperty -Name SDNoOfCntdDrv -value ($SDCntrlArray[$i].Property | Where {$_.Name -like "numberOfConnectedDrive*"} | Select -ExpandProperty Value)
$SDInfo1 | Add-Member -MemberType NoteProperty -Name SDNoOfUnasgnDrv -value ($SDCntrlArray[$i].Property | Where {$_.Name -like "numberOfUnassignedDrive*"} | Select -ExpandProperty Value)
$SDInfo1 | Add-Member -MemberType NoteProperty -Name SDNoOfLoglDrv -value ($SDCntrlArray[$i].Property | Where {$_.Name -like "numberOfLogicalDrive*"} | Select -ExpandProperty Value)
$SDInfo1 | Add-Member -MemberType NoteProperty -Name SDSerialNo -value ($SDCntrlArray[$i].Property | Where {$_.Name -eq "serialNumber"} | Select -ExpandProperty Value)
$SDInfoArray += $SDInfo1
$i= $i+1
}
}
Else {
$SDInfo1 = New-Object -TypeName PSObject
$SDInfo1 | Add-Member -MemberType NoteProperty -Name SDClass -value $SDCntrlArray.class
$SDInfo1 | Add-Member -MemberType NoteProperty -Name SDName -value $SDCntrlArray.Name
$SDInfo1 | Add-Member -MemberType NoteProperty -Name SDCaption -value $SDCntrlArray.Caption
$SDInfo1 | Add-Member -MemberType NoteProperty -Name SDDescription -value $SDCntrlArray.Description
$SDInfo1 | Add-Member -MemberType NoteProperty -Name SDNoOfCntdDrv -value ($SDCntrlArray.Property | Where {$_.Name -like "numberOfConnectedDrive"} | Select -ExpandProperty Value)
$SDInfo1 | Add-Member -MemberType NoteProperty -Name SDNoOfUnasgnDrv -value ($SDCntrlArray.Property | Where {$_.Name -like "numberOfUnassignedDrive*"} | Select -ExpandProperty Value)
$SDInfo1 | Add-Member -MemberType NoteProperty -Name SDNoOfLoglDrv -value ($SDCntrlArray.Property | Where {$_.Name -like "numberOfLogicalDrive*"} | Select -ExpandProperty Value)
$SDInfo1 | Add-Member -MemberType NoteProperty -Name SDSerialNo -value ($SDCntrlArray.Property | Where {$_.Name -eq "serialNumber"} | Select -ExpandProperty Value)
$SDInfoArray += $SDInfo1
}
# Define a hash table to hold properties of all Storage Controller
$SDHash = [ordered]@{
SDClass=@($SDInfoArray."SDClass")
SDName=@($SDInfoArray."SDName")
SDCaption = @($SDInfoArray."SDCaption")
SDDescription = @($SDInfoArray."SDDescription")
SDNoOfCntdDrv = @($SDInfoArray."SDNoOfCntdDrv")
SDNoOfUnasgnDrv = @($SDInfoArray."SDNoOfUnasgnDrv")
SDNoOfLoglDrv = @($SDInfoArray."SDNoOfLoglDrv")
SDSerialNo = @($SDInfoArray."SDSerialNo")
}
# $SDHash
$Hash += $SDHash
# ==============================================================================================================================================
$HDInfoArray = @()
If ($HDArrays.count -gt 0)
{$i = 0
While ($i -lt $HDArrays.count)
{
# Fetch Properties of each Hard Disk
$HDInfo1 = New-Object -TypeName PSObject
$HDInfo1 | Add-Member -MemberType NoteProperty -Name HDClass -value $HDArrays[$i].class
$HDInfo1 | Add-Member -MemberType NoteProperty -Name HDName -value $HDArrays[$i].Name
$HDInfo1 | Add-Member -MemberType NoteProperty -Name HDCaption -value $HDArrays[$i].Caption
$HDInfo1 | Add-Member -MemberType NoteProperty -Name HDDescription -value $HDArrays[$i].Description
$HDInfo1 | Add-Member -MemberType NoteProperty -Name HDPosition -value (($HDArrays[$i].structure | Where {$_.Name -eq "drivePosition"} | Select -ExpandProperty Property | Select -ExpandProperty value) -join '-')
$HDInfo1 | Add-Member -MemberType NoteProperty -Name HDSerialNo -value ($HDArrays[$i].Property | Where {$_.Name -eq "serialNumber"} | Select -ExpandProperty Value)
$HDInfo1 | Add-Member -MemberType NoteProperty -Name HDStorCntrlrParent -value ($HDArrays[$i].Property | Where {$_.Name -like "storageControllerParent*"} | Select -ExpandProperty Value)
$HDInfo1 | Add-Member -MemberType NoteProperty -Name HDLogicalDrvParent -value ($HDArrays[$i].Property | Where {$_.Name -like "logicalDriveParent*"} | Select -ExpandProperty Value)
$HDInfo1 | Add-Member -MemberType NoteProperty -Name HDStatus -value ($HDArrays[$i].structure | Where {$_.Name -eq "monitorAndPerformance"} | Select -ExpandProperty Property | Where {$_.name -eq "drivePresentAndOperational"} | Select -ExpandProperty Value)
$HDInfo1 | Add-Member -MemberType NoteProperty -Name HDPredFailure -value ($HDArrays[$i].structure | Where {$_.Name -eq "monitorAndPerformance"} | Select -ExpandProperty Property | Where {$_.name -eq "predictiveFailureErrors"} | Select -ExpandProperty Value)
$HDInfoArray += $HDInfo1
$i= $i+1
}
}
Else {
$HDInfo1 = New-Object -TypeName PSObject
$HDInfo1 | Add-Member -MemberType NoteProperty -Name HDClass -value $HDArrays.class
$HDInfo1 | Add-Member -MemberType NoteProperty -Name HDName -value $HDArrays.Name
$HDInfo1 | Add-Member -MemberType NoteProperty -Name HDCaption -value $HDArrays.Caption
$HDInfo1 | Add-Member -MemberType NoteProperty -Name HDDescription -value $HDArrays.Description
$HDInfo1 | Add-Member -MemberType NoteProperty -Name HDPosition -value (($HDArrays.structure | Where {$_.Name -eq "drivePosition"} | Select -ExpandProperty Property | Select -ExpandProperty value) -join '-')
$HDInfo1 | Add-Member -MemberType NoteProperty -Name HDSerialNo -value ($HDArrays.Property | Where {$_.Name -eq "serialNumber"} | Select -ExpandProperty Value)
$HDInfo1 | Add-Member -MemberType NoteProperty -Name HDStorCntrlrParent -value ($HDArrays.Property | Where {$_.Name -like "storageControllerParent*"} | Select -ExpandProperty Value)
$HDInfo1 | Add-Member -MemberType NoteProperty -Name HDLogicalDrvParent -value ($HDArrays.Property | Where {$_.Name -like "logicalDriveParent*"} | Select -ExpandProperty Value)
$HDInfo1 | Add-Member -MemberType NoteProperty -Name HDStatus -value ($HDArrays.structure | Where {$_.Name -eq "monitorAndPerformance"} | Select -ExpandProperty Property | Where {$_.name -eq "drivePresentAndOperational"} | Select -ExpandProperty Value)
$HDInfo1 | Add-Member -MemberType NoteProperty -Name HDPredFailure -value ($HDArrays.structure | Where {$_.Name -eq "monitorAndPerformance"} | Select -ExpandProperty Property | Where {$_.name -eq "predictiveFailureErrors"} | Select -ExpandProperty Value)
$HDInfoArray += $HDInfo1
}
# Define a hash table to hold properties of all Storage Controller
$HDHash = [ordered]@{
HDClass=@($HDInfoArray."HDClass")
HDName=@($HDInfoArray."HDName")
HDCaption = @($HDInfoArray."HDCaption")
HDDescription = @($HDInfoArray."HDDescription")
HDPosition = @($HDInfoArray."HDPosition")
HDSerialNo = @($HDInfoArray."HDSerialNo")
HDStorCntrlrParent = @($HDInfoArray."HDStorCntrlrParent")
HDLogicalDrvParent = @($HDInfoArray."HDLogicalDrvParent")
HDStatus = @($HDInfoArray."HDStatus")
HDPredFailure = @($HDInfoArray."HDPredFailure")
}
# $HDHash
$Hash += $HDHash