0

There is code at the bottom of this to help make it easy to reproduce what I'm asking in my questions. My questions are:

  1. $parentObject.Children.Children.Andrew."Birthday Info" --- is there a programmatic way to know to need quotes and add quotes?"

  2. $parentObject.Children.Robert.Children.Peter."Favorite Foods" --- I understand it creates a property name conflict if I try to add "Name" with a different value more than once, how can I add "Name" with a different food value multiple times? Should it be an array that I keep adding to and replacing/updating?

  3. $parentObject."01/01/1960". --- why can't I dot source the child properties

  4. $parentObject.Children.Robert. --- why can't I dot source the child properties, the 3rd level seems to be the limit?

$parentObject.01/01/1960; --- fails, returns a "0"

$parentObject."01/01/1960"; --- returns property names "Location" and "Years Together"

$parentObject.{01/01/1960}; --- returns property names "Location" and "Years Together"

$parentObject."01/01/1960". --- does not dot source

$parentObject.{01/01/1960}. --- does not dot source

$parentObject."01/01/1960".Location; --- returns property value "Hawaii"

$parentObject.{01/01/1960}.Location; --- returns property value "Hawaii"

$parentObject."01/01/1960"."Years Together"; --- returns property value "72"

$parentObject.{01/01/1960}.{Years Together}; --- returns property value "72"

$parentObject.anniversary - 01/01/1960; --- fails, performs a math equation

$parentObject."anniversary - 01/01/1960"; --- returns property values "Hawaii" and "62"

$parentObject.{anniversary - 01/01/1960}; --- returns property values "Hawaii" and "62"

$parentObject."anniversary - 01/01/1960". --- does not dot source

$parentObject.{anniversary - 01/01/1960}. --- does not dot source

Full code:

#Region Instantiate

    $foodsObject = New-Object -TypeName psobject;
    $birthDayObject = New-Object -TypeName psobject;
    $numberOfBirthdaysObject = New-Object -TypeName psobject;
    $grandChildObject = New-Object -TypeName psobject;
    $childObject = New-Object -TypeName psobject;
    $parentObject = New-Object -TypeName psobject;
    $anniversaryObject = New-Object -TypeName psobject;

#EndRegion /Instantiate

#Region Peter

    $numberOfBirthdaysObject = New-Object -TypeName psobject;
    $numberOfBirthdaysObject | Add-Member -MemberType NoteProperty -Name "Count" -Value "22";
    $birthDateObject = New-Object -TypeName psobject;
    $birthDateObject | Add-Member -MemberType NoteProperty -Name "Date" -Value "01/01/2000";
    $birthDateObject | Add-Member -MemberType NoteProperty -Name "Birthday Count" -Value $numberOfBirthdaysObject;

    $birthDayObject = New-Object -TypeName psobject;
    $birthDayObject | Add-Member -MemberType NoteProperty -Name "Birthday Info" -Value $birthDateObject;

    $foodsObject = New-Object -TypeName psobject;
    $foodsObject | Add-Member -MemberType NoteProperty -Name "Spaghetti" -Value "Spaghetti";
    $foodsObject | Add-Member -MemberType NoteProperty -Name "Pizza" -Value "Pizza";
    $foodsObject | Add-Member -MemberType NoteProperty -Name "Ice cream" -Value "Ice cream";

    $personalInformationObject = New-Object -TypeName psobject;
    $personalInformationObject | Add-Member -MemberType NoteProperty -Name "Birthday" -Value $birthDayObject;
    $personalInformationObject | Add-Member -MemberType NoteProperty -Name "Favorite Color" -Value "Red";
    $personalInformationObject | Add-Member -MemberType NoteProperty -Name "Favorite Foods" -Value $foodsObject;
    $grandChildObject | Add-Member -MemberType NoteProperty -Name "Peter" -Value $personalInformationObject;

#EndRegion /Peter


#Region Andrew

    $numberOfBirthdaysObject = New-Object -TypeName psobject;
    $numberOfBirthdaysObject | Add-Member -MemberType NoteProperty -Name "Count" -Value "20";
    $birthDateObject = New-Object -TypeName psobject;
    $birthDateObject | Add-Member -MemberType NoteProperty -Name "Date" -Value "01/01/2002";
    $birthDateObject | Add-Member -MemberType NoteProperty -Name "Birthday Count" -Value $numberOfBirthdaysObject;

    $birthDayObject = New-Object -TypeName psobject;
    $birthDayObject | Add-Member -MemberType NoteProperty -Name "Birthday Info" -Value $birthDateObject;

    $foodsObject = New-Object -TypeName psobject;
    $foodsObject | Add-Member -MemberType NoteProperty -Name "Big Mac" -Value "Big Mac";
    $foodsObject | Add-Member -MemberType NoteProperty -Name "Soup" -Value "Soup";
    $foodsObject | Add-Member -MemberType NoteProperty -Name "Cheese cake" -Value "Cheese cake";

    $personalInformationObject = New-Object -TypeName psobject;
    $personalInformationObject | Add-Member -MemberType NoteProperty -Name "Birthday" -Value $birthDayObject;
    $personalInformationObject | Add-Member -MemberType NoteProperty -Name "Favorite Color" -Value "Green";
    $personalInformationObject | Add-Member -MemberType NoteProperty -Name "Favorite Foods" -Value $foodsObject;

    $grandChildObject | Add-Member -MemberType NoteProperty -Name "Andrew" -Value $personalInformationObject;

#EndRegion /Andrew

#Region Robert

    $numberOfBirthdaysObject = New-Object -TypeName psobject;
    $numberOfBirthdaysObject | Add-Member -MemberType NoteProperty -Name "Count" -Value "47";
    $birthDateObject = New-Object -TypeName psobject;
    $birthDateObject | Add-Member -MemberType NoteProperty -Name "Date" -Value "01/01/1975";
    $birthDateObject | Add-Member -MemberType NoteProperty -Name "Birthday Count" -Value $numberOfBirthdaysObject;

    $birthDayObject = New-Object -TypeName psobject;
    $birthDayObject | Add-Member -MemberType NoteProperty -Name "Birthday Info" -Value $birthDateObject;

    $foodsObject = New-Object -TypeName psobject;
    $foodsObject | Add-Member -MemberType NoteProperty -Name "Burger King" -Value "Burger King";
    $foodsObject | Add-Member -MemberType NoteProperty -Name "Cheese Pizza" -Value "Cheese Pizza";
    $foodsObject | Add-Member -MemberType NoteProperty -Name "Beer" -Value "Beer";

    $personalInformationObject = New-Object -TypeName psobject;
    $personalInformationObject | Add-Member -MemberType NoteProperty -Name "Birthday" -Value $birthDayObject;
    $personalInformationObject | Add-Member -MemberType NoteProperty -Name "Favorite Color" -Value "Maroon";
    $personalInformationObject | Add-Member -MemberType NoteProperty -Name "Favorite Foods" -Value $foodsObject;
    
    $personalInformationObject | Add-Member -MemberType NoteProperty -Name "Children" -Value $grandChildObject;
    $childObject | Add-Member -MemberType NoteProperty -Name "Robert" -Value $personalInformationObject;

#EndRegion /Robert

$grandChildObject = New-Object psobject;

#Region Lisa

    $numberOfBirthdaysObject = New-Object -TypeName psobject;
    $numberOfBirthdaysObject | Add-Member -MemberType NoteProperty -Name "Count" -Value "25";
    $birthDateObject = New-Object -TypeName psobject;
    $birthDateObject | Add-Member -MemberType NoteProperty -Name "Date" -Value "01/01/1997";
    $birthDateObject | Add-Member -MemberType NoteProperty -Name "Birthday Count" -Value $numberOfBirthdaysObject;

    $birthDayObject = New-Object -TypeName psobject;
    $birthDayObject | Add-Member -MemberType NoteProperty -Name "Birthday Info" -Value $birthDateObject;

    $foodsObject = New-Object -TypeName psobject;
    $foodsObject | Add-Member -MemberType NoteProperty -Name "Burgers" -Value "Burgers";
    $foodsObject | Add-Member -MemberType NoteProperty -Name "Rice" -Value "Rice";
    $foodsObject | Add-Member -MemberType NoteProperty -Name "Cherry snowball" -Value "Cherry snowball";

    $personalInformationObject = New-Object -TypeName psobject;
    $personalInformationObject | Add-Member -MemberType NoteProperty -Name "Birthday" -Value $birthDayObject;
    $personalInformationObject | Add-Member -MemberType NoteProperty -Name "Favorite Color" -Value "Purple";
    $personalInformationObject | Add-Member -MemberType NoteProperty -Name "Favorite Foods" -Value $foodsObject;

    $grandChildObject | Add-Member -MemberType NoteProperty -Name "Lisa" -Value $personalInformationObject;

#EndRegion /Lisa

#Region Thomas

    $numberOfBirthdaysObject = New-Object -TypeName psobject;
    $numberOfBirthdaysObject | Add-Member -MemberType NoteProperty -Name "Count" -Value "44";
    $birthDateObject = New-Object -TypeName psobject;
    $birthDateObject | Add-Member -MemberType NoteProperty -Name "Date" -Value "01/01/1978";
    $birthDateObject | Add-Member -MemberType NoteProperty -Name "Birthday Count" -Value $numberOfBirthdaysObject;

    $birthDayObject = New-Object -TypeName psobject;
    $birthDayObject | Add-Member -MemberType NoteProperty -Name "Birthday Info" -Value $birthDateObject;

    $foodsObject = New-Object -TypeName psobject;
    $foodsObject | Add-Member -MemberType NoteProperty -Name "Chicken" -Value "Chicken";
    $foodsObject | Add-Member -MemberType NoteProperty -Name "Pit beef" -Value "Pit beef";
    $foodsObject | Add-Member -MemberType NoteProperty -Name "Coke float" -Value "Coke float";

    $personalInformationObject = New-Object -TypeName psobject;
    $personalInformationObject | Add-Member -MemberType NoteProperty -Name "Birthday" -Value $birthDayObject;
    $personalInformationObject | Add-Member -MemberType NoteProperty -Name "Favorite Color" -Value "Yellow";
    $personalInformationObject | Add-Member -MemberType NoteProperty -Name "Favorite Foods" -Value $foodsObject;

    $personalInformationObject | Add-Member -MemberType NoteProperty -Name "Children" -Value $grandChildObject;
    $childObject | Add-Member -MemberType NoteProperty -Name "Thomas" -Value $personalInformationObject;
        
#EndRegion /Thomas

#Region Jason and Pamela

    #Region Jason
        
        $numberOfBirthdaysObject = New-Object -TypeName psobject;
        $numberOfBirthdaysObject | Add-Member -MemberType NoteProperty -Name "Count" -Value "80";
        $birthDateObject = New-Object -TypeName psobject;
        $birthDateObject | Add-Member -MemberType NoteProperty -Name "Date" -Value "01/01/1942";
        $birthDateObject | Add-Member -MemberType NoteProperty -Name "Birthday Count" -Value $numberOfBirthdaysObject;

        $birthDayObject = New-Object -TypeName psobject;
        $birthDayObject | Add-Member -MemberType NoteProperty -Name "Birthday Info" -Value $birthDateObject;

        $foodsObject = New-Object -TypeName psobject;
        $foodsObject | Add-Member -MemberType NoteProperty -Name "Grits" -Value "Grits";
        $foodsObject | Add-Member -MemberType NoteProperty -Name "Burgers" -Value "Burgers";
        $foodsObject | Add-Member -MemberType NoteProperty -Name "Malt drink" -Value "Malt drink";

        $personalInformationObject = New-Object -TypeName psobject;
        $personalInformationObject | Add-Member -MemberType NoteProperty -Name "Birthday" -Value $birthDayObject;
        $personalInformationObject | Add-Member -MemberType NoteProperty -Name "Favorite Color" -Value "Brown";
        $personalInformationObject | Add-Member -MemberType NoteProperty -Name "Favorite Foods" -Value $foodsObject;
        
        $parentObject | Add-Member -MemberType NoteProperty -Name "Jason" -Value $personalInformationObject;
        
    #EndRegion /Jason
    
    #Region Pamela
    
        $numberOfBirthdaysObject = New-Object -TypeName psobject;
        $numberOfBirthdaysObject | Add-Member -MemberType NoteProperty -Name "Count" -Value "78";
        $birthDateObject = New-Object -TypeName psobject;
        $birthDateObject | Add-Member -MemberType NoteProperty -Name "Date" -Value "01/01/1944";
        $birthDateObject | Add-Member -MemberType NoteProperty -Name "Birthday Count" -Value $numberOfBirthdaysObject;

        $birthDayObject = New-Object -TypeName psobject;
        $birthDayObject | Add-Member -MemberType NoteProperty -Name "Birthday Info" -Value $birthDateObject;

        $foodsObject = New-Object -TypeName psobject;
        $foodsObject | Add-Member -MemberType NoteProperty -Name "Rice" -Value "Rice";
        $foodsObject | Add-Member -MemberType NoteProperty -Name "Cheese" -Value "Cheese";
        $foodsObject | Add-Member -MemberType NoteProperty -Name "Popsicle" -Value "Popsicle";

        $personalInformationObject = New-Object -TypeName psobject;
        $personalInformationObject | Add-Member -MemberType NoteProperty -Name "Birthday" -Value $birthDayObject;
        $personalInformationObject | Add-Member -MemberType NoteProperty -Name "Favorite Color" -Value "Pink";
        $personalInformationObject | Add-Member -MemberType NoteProperty -Name "Favorite Foods" -Value $foodsObject;
        
        $parentObject | Add-Member -MemberType NoteProperty -Name "Pamela" -Value $personalInformationObject;
    
    #EndRegion /Pamela
    
    $anniversaryObject | Add-Member -MemberType NoteProperty -Name "Location" -Value "Hawaii";
    $anniversaryObject | Add-Member -MemberType NoteProperty -Name "Years Together" -Value "62";

    if ($parentObject.Children -eq $null)
    {
        $parentObject | Add-Member -MemberType NoteProperty -Name "Father" -Value "Jason";
        $parentObject | Add-Member -MemberType NoteProperty -Name "Mother" -Value "Pamela";
        $parentObject | Add-Member -MemberType NoteProperty -Name "Children" -Value $childObject;
        $parentObject | Add-Member -MemberType NoteProperty -Name "01/01/1960" -Value $anniversaryObject;
        $parentObject | Add-Member -MemberType NoteProperty -Name "anniversary - 01/01/1960" -Value $anniversaryObject;
    }
    else
    {
        $parentObject | Add-Member -MemberType NoteProperty -Name "Father" -Value "Jason";
        $parentObject | Add-Member -MemberType NoteProperty -Name "Mother" -Value "Pamela";
        $parentObject.Children = $childObject;
        $parentObject | Add-Member -MemberType NoteProperty -Name "01/01/1950" -Value $anniversaryObject;
        $parentObject | Add-Member -MemberType NoteProperty -Name "anniversary - 01/01/1950" -Value $anniversaryObject;
    }

#EndRegion Jason and Pamela

1 Answer 1

1

I think your elemental object should be a single person with the desired properties, including refences to child objects. Then define a marriage which references the individual people and stores the date & location.

  • Best to just avoid spaces in property names
  • Use tab completion to explore what's available through dot notation
  • FavFoods is created as an array by splitting a string that uses an arbitrary separator (+)
  • ScriptProperties are used to keep time-dependent values current

Play with the objects generated by this code:

@'
Name,Birthday,FavColor,FavFoods
Jason,01/01/1942,Brown,Grits+Burgers+Malt Drink
Pamela,01/01/1944,Pink,Rice+Cheese+Popsicle
Robert,01/01/1975,Maroon,Burger King+Cheese Pizza+Beer
Thomas,01/01/1978,Yellow,Chicken+Pit Beef+Coke float
Peter,1/1/2000,Red,Spaghetti+Pizza+Ice cream
Andrew,1/1/2002,Green,Big Mac+Soup+Cheesecake
'@ | convertFrom-Csv | ForEach {[PSCustomObject]@{
    'Name'  = $_.Name
    'Birthday' = $_.Birthday
    'FavColor' = $_.FavColor
    'FavFoods' = $_.FavFoods.Split('+')
    'Children' = @{}
} | Add-Member -MemberType ScriptProperty -Name Age -Value { ([DateTime]((Get-Date) - [DateTime]($This.Birthday)).Ticks).Year - 1 } -PassTHru
} | FOrEach { $hash = @{} } {
    $hash.Add($_.Name,$_)
} { $hash } | sv People

'Jason' , 'Pamela' | ForEach {
    $Parent = $_
    'Robert' , 'THomas' | ForEach {
         $People[$Parent].Children.Add( $_ , $People[$_] )
    }
}

'Peter' , 'Andrew' | ForEach {
    $People.Robert.Children.Add( $_ , $People[$_] )
}

$Marriage = [PSCustomObject]@{
    Spouses = @( $People['Jason'],  $People['Pamela'] )
    Date    = '1/1/1960'
    Location = 'Hawaii'
    Children = $People['Jason'].Children.Keys + $People['Pamela'].Children.Keys | select -Unique | ForEach {$hash = @{} } { $hash.Add($_ , $People[$_] ) } { $hash }
}

$Marriage | Add-Member -MemberType ScriptProperty -Name 'YearsTogether' -Value { ([DateTime]((Get-Date) - [DateTime]($This.Date)).Ticks).Year - 1 }

Samples:

PS C:\> $People.GetEnumerator() | ForEach {  $_.value }


Name     : Jason
Birthday : 01/01/1942
FavColor : Brown
FavFoods : {Grits, Burgers, Malt Drink}
Children : {THomas, Robert}
Age      : 80

Name     : Robert
Birthday : 01/01/1975
FavColor : Maroon
FavFoods : {Burger King, Cheese Pizza, Beer}
Children : {Peter, Andrew}
Age      : 47

Name     : Pamela
Birthday : 01/01/1944
FavColor : Pink
FavFoods : {Rice, Cheese, Popsicle}
Children : {THomas, Robert}
Age      : 78

Name     : Thomas
Birthday : 01/01/1978
FavColor : Yellow
FavFoods : {Chicken, Pit Beef, Coke float}
Children : {}
Age      : 44

Name     : Peter
Birthday : 1/1/2000
FavColor : Red
FavFoods : {Spaghetti, Pizza, Ice cream}
Children : {}
Age      : 22

Name     : Andrew
Birthday : 1/1/2002
FavColor : Green
FavFoods : {Big Mac, Soup, Cheesecake}
Children : {}
Age      : 20



PS C:\>>$Marriage.Children

Name                           Value
----                           -----
THomas                         @{Name=Thomas; Birthday=01/01/1978; FavColor=Yellow; F...
Robert                         @{Name=Robert; Birthday=01/01/1975; FavColor=Maroon; F...


PS C:\>>$Marriage.Children.Robert.Children

Name                           Value
----                           -----
Peter                          @{Name=Peter; Birthday=1/1/2000; FavColor=Red; FavFood...
Andrew                         @{Name=Andrew; Birthday=1/1/2002; FavColor=Green; FavF...


PS C:\>>$Marriage.Children.Robert.Children.Values | select Name, FavFoods

Name   FavFoods
----   --------
Peter  {Spaghetti, Pizza, Ice cream}
Andrew {Big Mac, Soup, Cheesecake}


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

8 Comments

Thanks for this Keith. After $marriange.Children I cannot dot expose the nested objects, so I presume it's either some Powershell nested object limitation or somehow I have to define the properties as public? I found nothing in a web search on defining the nested objects as public or private? I understand that spaces and special characters should be avoided in property names, but if there is a use case for that, is there any way to make that property or object exposable through dot notation? And is there any simplistic way to handle the need for quotes or brackets programmatically?
Children, like $People, is a hashtable, which allows you to use the name as a key, similar to an index into an array. So $marriage.children.keys returns the names of the children and $marriage.children.Robert or $marriage.children['Robert'] return Robert's info. Going deeper: $marriage.children.Robert.Children.Keys returns the names of Robert's children, which again, can be used to access their info: $marriage.children.Robert.Children.Andrew, $marriage.children.Robert.Children.Andrew.FavFoods, etc. I will add to my answer later this evening.
Did you copy, paste, and then execute the entire first code block???
Yes I did copy and paste and I was manipulating different values. I knew I could retrieve the values through the method you have listed (keys) or through get-member and filter on properties, I was just curious why the 2 nested object limitation? When I write in c# I do not have that limitation so my curiosity was peaked. I will define a hash table in my code and also have something that replaces special characters and spaces with text such as SPACE or something ... as I don't have control over the input data format. Thank you for the explanation and links.
|

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.