2

I'm not very good at powershell and I need help. I am trying to combine properties of objects. For two objects, everything is fine. This is looks like.

$obj1 = [PSCustomObject]@{
    'ip' = '10.10.10.11'
    't1' = 'show'
    't2' = 'ab'

}
$obj2 = [PSCustomObject]@{
    'ip' = '10.10.10.11'
    't1' = 'me'
    't2' = 'cd'
} 

foreach ($prop in $obj2 | Get-Member -MemberType NoteProperty | Where-Object {$_.name -ne 'ip'} | select -ExpandProperty name)
{
    $obj1.$prop += $obj2.$prop
}

$obj1 

Result:
ip                         t1                         t2                       
--                         --                         --                       
10.10.10.11                showme                     abcd  

But I can't do this if many objects in an array. How to do it? Example arrays:

Array1:
ip                         t1                         t2                       
--                         --                         --                       
10.10.10.11                show                       ab                       
10.10.10.12                show                       ab   

Array2:
ip                         t1                         t2                       
--                         --                         --                       
10.10.10.11                me                         cd                       
10.10.10.12                me                         cd  

1 Answer 1

1

Basically, all you need is to add an outer loop that iterates over the array elements.

Additionally, you can use the hidden .psobject.Properties member to streamline your solution:

# Sample arrays
$array1 = [pscustomobject]@{ 'ip' = '10.10.10.11'; 't1' = 'show1'; 't2' = 'ab1' },
          [pscustomobject]@{ 'ip' = '10.10.10.12'; 't1' = 'show2'; 't2' = 'ab2' }

$array2 = [pscustomobject]@{ 'ip' = '10.10.10.11'; 't1' = 'me1'; 't2' = 'cd1' },
          [pscustomobject]@{ 'ip' = '10.10.10.12'; 't1' = 'me2'; 't2' = 'cd2' }

# Assuming all objects in the arrays have the same property structure,
# get the list of property names up front.
$mergeProperties = $array1[0].psobject.Properties.Name -ne 'ip'

# Loop over the array elements in pairs and merge their property values.
$i = 0
[array] $mergedArray = 
  foreach ($o1 in $array1) {
    $o2 = $array2[$i++]
    foreach ($p in $mergeProperties) {
        $o1.$p += $o2.$p
    }
    $o1  # output the merged object
  }

Outputting $mergedArray then yields:

ip          t1       t2
--          --       --
10.10.10.11 show1me1 ab1cd1
10.10.10.12 show2me2 ab2cd2

Note:

  • As in your attempt, one of the original objects is modified in place.

  • The assumption is that matching objects in the two arrays are in the same position, respectively (merge the first object from the first array with the first object from the second, ....).

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.