Can't get array to output the way I want..

This topic contains 3 replies, has 3 voices, and was last updated by  Llamathrust 1 year, 7 months ago.

  • Author
  • #50519


    Hello all, I'm pretty new to powershell and losing my mind with this issue and I'm sure it's something simple.

    I'm trying to match a list of users against 4 different systems. There's 5 .csv files with just the name in Last First:

    Doe Jane

    $Users = Import-CSV -Path "users.csv"
    $System1 = Import-CSV -Path "system1.csv"
    $System2 = Import-CSV -Path "system2.csv"
    $System3 = Import-CSV -Path "system3.csv"
    $System4 = Import-CSV -Path "system4.csv"

    $S1Results = Compare-Object -ReferenceObject $Users.Name -DifferenceObject $S1.Name -ExcludeDifferent -IncludeEqual
    $S2Results = Compare-Object -ReferenceObject $Users.Name -DifferenceObject $S2.Name -ExcludeDifferent -IncludeEqual
    $S3Results = Compare-Object -ReferenceObject $Users.Name -DifferenceObject $S3.Name -ExcludeDifferent -IncludeEqual
    $S4Results = Compare-Object -ReferenceObject $Users.Name -DifferenceObject $S4.Name -ExcludeDifferent -IncludeEqual

    $Results = @()
    $Results = New-Object PSObject -Property @{
    System1 = $S1Results.InputObject
    System2 = $S2Results.InputObject
    System3 = $S3Results.InputObject
    System4 = $S4Results.InputObject

    I would like this to be exported to a CSV, so it will look like this in Excel:

    System1 System2 System3
    Person 1 Person 1 Person 5
    Person 2 Person 3
    Person 3

    But instead, it's outputting them as

    {Person1, Person 2, Person 3}

    What am I doing wrong?

  • #50543

    Daniel Krebs

    Unfortunately, it is not as easy as you think because you need to massage the data into the right format for an easy convert to CSV.

    Check out my attempt to create a working solution:

    • #50810


      Thanks for the very thorough response. I'll begin by saying I'm very new to powershell, so I'm sure this is just user error. I made a couple adjustments to what you built and it's almost working as intended. I have it pulling from .csv files and the output is correct, but it's not displaying all the users. For example,

      System1 System2 System3 System4
      ------- ------- ------- -------
      User01  User08  User03  User03 
      User02  User09  User04  User04 
              User10  User05  User05 
                      User06  User06 

      Is the output, but there's actually 8 users that should have been displayed under System3 and 6 under System4. Here's the script:

      $Users = Import-CSV -Path "H:\_Scripts\Daily Termed\Test\Users.csv"
      $System1 = Import-CSV -Path "H:\_Scripts\Daily Termed\Test\System1.csv"
      $System2 = Import-CSV -Path "H:\_Scripts\Daily Termed\Test\System2.csv"
      $System3 = Import-CSV -Path "H:\_Scripts\Daily Termed\Test\System3.csv"
      $System4 = Import-CSV -Path "H:\_Scripts\Daily Termed\Test\System4.csv"
      $SystemData = @{
          'System1' = $System1.Name
          'System2' = $System2.Name
          'System3' = $System3.Name
          'System4' = $System4.Name
      # Determine highest number of users across all systems
      $maxSystemUsers = 0
      foreach ($array in $systemData) {
          if ($array.Count -gt $maxSystemUsers) {
              $maxSystemUsers = $array.Count
      # Get a sorted array of all system names
      $systemNames = $systemData.Keys | Sort-Object
      # Enumerate system users
      $systemResults = for ($i = 0; $i -lt $maxSystemUsers ; $i++) {
          $tempRowDict = New-Object -TypeName System.Collections.Specialized.OrderedDictionary
          foreach ($systemName in $systemNames) {
              $value = $systemData[$systemName]
              if ($i -lt $value.Count) {
                  $tempRowDict[$systemName] = $value[$i]
          New-Object -TypeName PSObject -Property $tempRowDict
      # Output
      $systemResults #| ConvertTo-Csv -NoTypeInformation
      • This reply was modified 1 year, 7 months ago by  Llamathrust.
  • #50655

    Dan Potter

    All we do is get the largest length of array and substitute the index of each item.

    $array1 = (1..10)
    $array2 = (11..25)
    0..((($array1, $array2 | Measure-Object -Maximum -Property Count).Maximum)-1) | Select @{n="one";e={$array1[$_]}}, @{n="two";e={$array2[$_]}}

You must be logged in to reply to this topic.