Addings Child to PSObject after Creation

52 Views Asked by At

When using Powershell the Add-Member function can be used for manipulation of the object tree.

Following Function should read a CSV with Customers and their corresponding domain names and build a object tree as follows :

Customer1--- some attributes
   |__ Domainname1---some attributes
   |__ Domainname2---some attributes
Customer2--- some Attribute 
   |__ Domainname3---some attributes
Customer3--- some attributes
   |__ Domainname1---some attributes
   |__ Domainname2---some attributes
   |__ Domainname3---some attributes

The CSV File is a unsorted list of customers with their domains and looks like :

Kunde,Domain
"Customer1", "DomainName1"
"Customer2", "DomainName3"
"Customer1", "DomainName2"
"Customer3", "DomainName4"

After adding the domainname3 to the customer2 the domainname3 is seen also on the customer1 object as possible child.

the result tree looks like this in the debugger :

Customer1--- some attributes
   |__ Domainname1---some attributes
   |__ Domainname2---some attributes
   |__ Domainname3---some attributes
Customer2--- some Attribute 
   |__ Domainname1---some attributes
   |__ Domainname2---some attributes
   |__ Domainname3---some attributes

How can I get the planned result ?

The powershell function :

Function ReadCustomerDomains([string]$File )
{
    $CSVData = Import-Csv  $File -Delimiter ","
    $CustomerListObject = New-Object PSObject 
    

    ForEach ($Item in $CSVData)   
    {
        if ( Get-Member -InputObject $CustomerListObject -name $($Item.Kunde) )
        {
        }
        else
        {
            $CustomerListObject | Add-Member -NotePropertyName "$($Item.Kunde)" -NotePropertyValue $Customer_Properties
        }
    }

    ForEach ($Item in $CSVData)   
    {
        $CustomerItem = $CustomerListObject.$($Item.Kunde)
        Add-Member -InputObject $CustomerItem -NotepropertyName "$($Item.Domain)"  -NotePropertyValue $Customer_Domain_Properties
        $CustomerItem =$Null 
    }
    $CustomerList += $CustomerListObject
    return  $CustomerList
}
1

There are 1 best solutions below

2
jdweng On

Try following :

$filename = "c:\temp\test.csv"
$headers = 'Customer', 'Domain'
$csv = Import-Csv -Path $filename -Header $headers
$customers = $csv | Group-Object -Property 'Customer'

$table = [System.Collections.ArrayList]::new()
foreach($customer in $customers)
{
   $newRow = New-Object -TypeName psobject
   $newRow | Add-Member -NotePropertyName Customer -NotePropertyValue $customer.Name

   $domainObj = New-Object -TypeName PSObject
   foreach($domain in $customer.Group)
   {
      $attributes = [System.Collections.Generic.Dictionary[string,object]]::new()
      for($i = 0; $i -lt 4; $i++)
      {
         $attributes.Add('Attribute' + $i, $i)
      }
      $domainObj | Add-Member -NotePropertyName $domain.Domain -NotePropertyValue $attributes
   }
   $newRow | Add-Member -NotePropertyName Domains -NotePropertyValue $domainObj
   $table.Add($newRow) | Out-Null
}
$table | foreach { $_.Customer; $_.Domains | foreach {$_ | Format-List} }