Adding Objects to ArrayList for CSV Output

Welcome Forums General PowerShell Q&A Adding Objects to ArrayList for CSV Output

This topic contains 5 replies, has 3 voices, and was last updated by

 
Participant
2 months, 1 week ago.

  • Author
    Posts
  • #164917

    Participant
    Topics: 1
    Replies: 1
    Points: 14
    Rank: Member

    Hi,

    My first time posting. I'm still fairly green at Powershell, and I was wondering if anyone could help.

    GOAL: To obtain similar type of output, as below, for the purpose of saving to a CSV file.  First row is the header, and the next rows are the actual data for each column header. I might have over 20 clusters, and each cluster might have various hosts.  Basically, I can grab the EVC Mode and the Cluster Names in the first loop; but I will have to perform an inner loop on the Cluster Names to grab the actual CPU values for each host within that cluster.

    Cluster Name CPU's EVC Mode
    Company-Dev-01 Intel(R) Xeon(R) Gold 6148 Ivy Bridge
    Company-Dev-02 Intel abc (Haswell)

    Intel efg (Broadwell)

     

    Haswell

     

    PROBLEM:  In my code, everything works as expected, except the output. It looks like the way I want, but not the values I want.  The objects being added to my $report array list are repetitive host values, before being wiped out at the beginning of the next inner loop's iteration and replaced by a new round of repetitive host values.  For a cluster containing 7 different hosts (host1-host7), I'll receive repetitive values being written into the array, but only for the last host in that cluster.

    Cluster Name      EVC Mode        Host Name                 CPU's                                    
    ------------      --------        ---------                 -----                                    
    Company-Dev-SLS  intel-westmere    host7.mycompany.com      Intel(R) Xeon(R) CPU E5-2695 v2 @ 2.40GHz
    Company-Dev-SLS  intel-westmere    host7.mycompany.com      Intel(R) Xeon(R) CPU E5-2695 v2 @ 2.40GHz
    Company-Dev-SLS  intel-westmere    host7.mycompany.com      Intel(R) Xeon(R) CPU E5-2695 v2 @ 2.40GHz
    Company-Dev-SLS  intel-westmere    host7.mycompany.com      Intel(R) Xeon(R) CPU E5-2695 v2 @ 2.40GHz
    Company-Dev-SLS  intel-westmere    host7.mycompany.com      Intel(R) Xeon(R) CPU E5-2695 v2 @ 2.40GHz
    Company-Dev-SLS  intel-westmere    host7.mycompany.com      Intel(R) Xeon(R) CPU E5-2695 v2 @ 2.40GHz
    Company-Dev-SLS  intel-westmere    host7.mycompany.com      Intel(R) Xeon(R) CPU E5-2695 v2 @ 2.40GHz

     

    Below, is my code.  The problems are in lines 19-24.  Perhaps I'm not understanding the philosophy being using add-member?  Any help would be appreciated. Thank you!

    $clusterNames = get-cluster | Select-Object -Property Name
    $report = New-Object System.Collections.ArrayList
    $row = New-Object PSObject
    [int]$count = 0
    
    foreach ($cluster in $clusterNames)
    {
    
      $EVCmode = get-cluster $cluster.Name | Select-Object -Property Name, EVCMode
    
      $clusterHosts = get-VMHost -Location $cluster.Name | Select-Object -property Name
    
    
      foreach ($vHost in $clusterHosts)
      {
    
        $CPU = get-vmhost -Name $vHost.Name | Sort Name | Get-View | Select-Object -property Name, @{N=“CPU“;E={$_.Hardware.CpuPkg[0].Description}}
    
        $row | Add-Member -MemberType NoteProperty -Name "Cluster Name" -Value $EVCmode.Name -Force
        $row | Add-Member -MemberType NoteProperty -Name "EVC Mode" -Value $EVCmode.EVCMode -Force
        $row | Add-Member -MemberType NoteProperty -Name "Host Name" -Value $CPU.Name -Force
        $row | Add-Member -MemberType NoteProperty -Name "CPU's" -Value $CPU.CPU -Force
        $report.Insert($count,$row)
        $count++
      }
    }
    
    $report | Export-Csv -Path "C:\users\someuser\Desktop\EVCMode.csv" -Delimiter ',' -NoTypeInformation 
    
    
    
    
  • #165289
    Naw

    Participant
    Topics: 4
    Replies: 42
    Points: 74
    Rank: Member

    This would be my way of doing it. you will need PowerShell verion 5 for [PSCustomObject] and [Ordered] Type.

    $clusterNames = get-cluster | Select-Object -Property Name
    $report = @()
    $count = 0
    
    foreach ($cluster in $clusterNames){
      $EVCmode = get-cluster $cluster.Name | Select-Object -Property Name, EVCMode
      $clusterHosts = get-VMHost -Location $cluster.Name | Select-Object -property Name
    
      foreach ($vHost in $clusterHosts){
        $count++
        $CPU = get-vmhost -Name $vHost.Name | Sort Name | Get-View | Select-Object -property Name, @{N=“CPU“;E={$_.Hardware.CpuPkg[0].Description}}
        $report += [PSCustomObject][Ordered]@{
            ClusterName = $EVCmode.Name
            EVCMode     = $EVCmode.EVCMode
            HostName    = $CPU.Name
            CPU         = $CPU.CPU
            Count       = $Count
        }    
      }
    }
    $report | Export-Csv -Path "C:\users\someuser\Desktop\EVCMode.csv" -NoTypeInformation
    
  • #165358

    Participant
    Topics: 4
    Replies: 10
    Points: 75
    Rank: Member

    I have been struggling with the exact same issue.

    $ConfigFiles = @()
    $ConfigFiles = [PSCustomObject][Ordered]@{
    ConfigItems = "configuration.xml"
    ConfigDestinations = "$env:systemdrive\ProgramData"
    }

    When I do a get member it returns  TypeName: System.Management.Automation.PSCustomObject

    When I go to add using the example of Naw's post I run:

     $ConfigFiles += [pscustomobject][Ordered] @{ConfigItems = "PostureCFG.xml"
    ConfigDestinations = "$env:systemdrive\ProgramData\C"}

    When I run this I get the following error:

    Method invocation failed because [System.Management.Automation.PSObject] does not contain a method named
    'op_Addition'.
    At line:8 char:2
    + $ConfigFiles += [pscustomobject][Ordered] @{ConfigItems = "ISEPostur ...
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidOperation: (op_Addition:String) [], RuntimeException
    + FullyQualifiedErrorId : MethodNotFound

     

    PSVersionTable gets me:
    Name Value
    —- —–
    PSVersion 5.1.17134.765
    PSEdition Desktop
    PSCompatibleVersions {1.0, 2.0, 3.0, 4.0...}
    BuildVersion 10.0.17134.765
    CLRVersion 4.0.30319.42000
    WSManStackVersion 3.0
    PSRemotingProtocolVersion 2.3
    SerializationVersion 1.1.0.1

  • #165496
    Naw

    Participant
    Topics: 4
    Replies: 42
    Points: 74
    Rank: Member

    Hi Shawn

    I came across similar issue myself. My understanding is like this:
    $ConfigFiles = @() #This is an empty array
    $ConfigFiles = [PSCustomObject][Ordered]@{} #As soon as you assign this $ConfigFiles is no longer an array but becomes PowerShell Object.
    The Array has the 'addition' function which is '+=' but the ps object hasn't got the addition function like the one from the array type. So it throws that error.

    Perhaps try remove-variable -Name ConfigFiles before you run the addition below.
    $ConfigFiles = @()
    $ConfigFiles += [PSCustomObject][Ordered]@{}

    Hope this helps.

  • #165502
    Naw

    Participant
    Topics: 4
    Replies: 42
    Points: 74
    Rank: Member
  • #166089

    Participant
    Topics: 1
    Replies: 1
    Points: 14
    Rank: Member

    This would be my way of doing it. you will need PowerShell verion 5 for [PSCustomObject] and [Ordered] Type.

    $report += [PSCustomObject][Ordered]@{
    ClusterName = $EVCmode.Name
    EVCMode = $EVCmode.EVCMode
    HostName = $CPU.Name
    CPU = $CPU.CPU
    Count = $Count

    XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

    Naw, thank you very much! This worked like a charm, buddy!   Problem solved.

     

You must be logged in to reply to this topic.