h41msh1c0r
Goto Top

Powershell ausfüllen von Werten in verschachtelten Hashtables

Moin,

Powershell Hashtable Key False

Ich stolper von einem Punkt zum nächsten und habe von Gestern zu Heute versucht den nächsten Punkt selber zu erschließen, aber ich werd nicht schlau.

Alldata in leer, Ausgabe als JSON der besseren Lesbarkeit
{
    "ad_test":  {  
                    "Count":  "",  
                    "Status":  {  
                                   "Active":  "",  
                                   "Cancelled":  ""  
                               },
                    "Ordered":  {  
                                    "2020":  "",  
                                    "2024":  "",  
                                    "2025":  "",  
                                    "2021":  "",  
                                    "2022":  "",  
                                    "2023":  ""  
                                },
                    "Modified":  {  
                                     "2020":  "",  
                                     "2024":  "",  
                                     "2025":  "",  
                                     "2021":  "",  
                                     "2022":  "",  
                                     "2023":  ""  
                                 },
                    "Cancelled":  {  
                                      "2020":  "",  
                                      "2024":  "",  
                                      "2025":  "",  
                                      "2021":  "",  
                                      "2022":  "",  
                                      "2023":  ""  
                                  }
                }
}

Wenn ich dort nun Werte eintrage:

[int]$alldata."ad_test".Count += 1  

[int]$alldata."ad_test".Status.Active  += 2  
[int]$alldata."ad_test".Status.Cancelled  += 3  

[int]$alldata."ad_test".Ordered."2020" += 3  
[int]$alldata."ad_test".Ordered."2023" += 6  
[int]$alldata."ad_test".Ordered."2025" += 7  

[int]$alldata."ad_test".Modified."2020" += 1  
[int]$alldata."ad_test".Cancelled."2023" += 2  

Werden die auch eingetragen und gerechnet.

Problem:

{
    "ad_test":  {  
                    "Count":  1,  
                    "Status":  {  
                                   "Cancelled":  3,  
                                   "Active":  2  
                               },
                    "Ordered":  {  
                                    "2020":  4,  
                                    "2024":  "",  
                                    "2025":  7,  
                                    "2021":  "",  
                                    "2022":  "",  
                                    "2023":  8  
                                },
                    "Modified":  {  
                                     "2020":  4,  
                                     "2024":  "",  
                                     "2025":  7,  
                                     "2021":  "",  
                                     "2022":  "",  
                                     "2023":  8  
                                 },
                    "Cancelled":  {  
                                      "2020":  4,  
                                      "2024":  "",  
                                      "2025":  7,  
                                      "2021":  "",  
                                      "2022":  "",  
                                      "2023":  8  
                                  }
                }
}

Warum addiert er die Zahlen für 2020, 2023 und 2025 bei allen und nicht nur bei Ordered, Modified oder Cancelled?

VG

Content-ID: 668015

Url: https://administrator.de/contentid/668015

Printed on: October 15, 2024 at 06:10 o'clock

Kraemer
Kraemer Sep 10, 2024 at 08:34:51 (UTC)
Goto Top
Moin,

ich weiß zwar nicht wer er ist, aber du unterschlägst Code.

Warum addiert er die Zahlen für 2020, 2023 und 2025 bei allen und nicht nur bei Ordered, Modified oder Cancelled?

Dein Beispiel funktioniert wie erwartet: https://tio.run/##nVVPS8MwHL3nU/wIuznL2joFYbAx8SCIB72JSFgiK2SJpNk8zH72mi ...
H41mSh1C0R
H41mSh1C0R Sep 10, 2024 at 08:49:29 (UTC)
Goto Top
Zitat von @Kraemer:

Moin,

ich weiß zwar nicht wer er ist, aber du unterschlägst Code.

Warum addiert er die Zahlen für 2020, 2023 und 2025 bei allen und nicht nur bei Ordered, Modified oder Cancelled?

Dein Beispiel funktioniert wie erwartet: https://tio.run/##nVVPS8MwHL3nU/wIuznL2joFYbAx8SCIB72JSFgiK2SJpNk8zH72mi ...

Danke für die fixe Antwort und ein hmmmm:

Ich mache eigentlich genau da weiter wo ich im letzten Thread aufgehört habe

Hole mir die Offerings, picke die serviceNamen raus und erstelle damit dann $alldata.
$ServiceOfferingsListe = $SubscriptionDetails | Select -Property serviceName -Unique

$years           = @{"2020"='';"2021"='';"2022"='';"2023"='';"2024"='';"2025"=''}    
$Status          = @{Active='';Cancelled=''}     
$alldata         = @{}

foreach ($ServiceOffering in $ServiceOfferingsListe){
    $alldata.($ServiceOffering.ServiceName) = [ordered]@{
        Count=''    
        Status=$Status
        Ordered=$years
        Modified=$years
        Cancelled=$years
    }
}

In der ServiceOfferingListe ist das "ad_test" dabei.
Das $alldata wird auch so generiert wie ich das möchte.

Danach hab ich den Testblock zum Füllen bevor ich das in Schleifen packen wollte.

[int]$alldata."ad_test".Count += 1  

[int]$alldata."ad_test".Status.Active  += 2  
[int]$alldata."ad_test".Status.Cancelled  += 3  

[int]$alldata."ad_test".Ordered."2020" += 3  
[int]$alldata."ad_test".Ordered."2023" += 6  
[int]$alldata."ad_test".Ordered."2025" += 7  

[int]$alldata."ad_test".Modified."2020" += 1  
[int]$alldata."ad_test".Cancelled."2023" += 2  

$keys = @($alldata.Keys)

# damit ich nicht immer alls 1xxx Blöcke ausgeben muss hier mal zusammengestutzt auf "ad_test" 
$keys | ForEach-Object {
    if ($_ -notmatch 'ad_test') {  
        $alldata.Remove($_)
    }
} 

$alldata | ConvertTo-Json -Depth 6 

Wenn ich neben ad_test auch noch einen weiteren service nehme schaut's dann so aus:

"SO_V01.00":  {  
                                    "Count":  "",  
                                    "Status":  {  
                                                   "Cancelled":  3,  
                                                   "Active":  2  
                                               },
                                    "Ordered":  {  
                                                    "2020":  4,  
                                                    "2024":  "",  
                                                    "2025":  7,  
                                                    "2021":  "",  
                                                    "2022":  "",  
                                                    "2023":  8  
                                                },
                                    "Modified":  {  
                                                     "2020":  4,  
                                                     "2024":  "",  
                                                     "2025":  7,  
                                                     "2021":  "",  
                                                     "2022":  "",  
                                                     "2023":  8  
                                                 },
                                    "Cancelled":  {  
                                                      "2020":  4,  
                                                      "2024":  "",  
                                                      "2025":  7,  
                                                      "2021":  "",  
                                                      "2022":  "",  
                                                      "2023":  8  
                                                  }
                                },
    "ad_test":  {  
             "Count":  "1",  
             "Status":  {  
                            "Cancelled":  3,  
                            "Active":  2  
                        },
             "Ordered":  {  
                             "2020":  4,  
                             "2024":  "",  
                             "2025":  7,  
                             "2021":  "",  
                             "2022":  "",  
                             "2023":  8  
                         },
             "Modified":  {  
                              "2020":  4,  
                              "2024":  "",  
                              "2025":  7,  
                              "2021":  "",  
                              "2022":  "",  
                              "2023":  8  
                          },
             "Cancelled":  {  
                               "2020":  4,  
                               "2024":  "",  
                               "2025":  7,  
                               "2021":  "",  
                               "2022":  "",  
                               "2023":  8  
                           }
         }

Das kuriose ist:
[int]$alldata."ad_test".Count += 1  

trägt/addiert er wirklich nur bei "ad_test".
Alles eine Ebene weiter drunter trägt er überall ein wo er die Jahreszahl findet.
14260433693
Solution 14260433693 Sep 10, 2024 updated at 09:04:19 (UTC)
Goto Top
Du verwendest überall die gleichen Objekt Referenzen von $years und $status, also die gleichen Objekte, füllst du dann eines davon, füllst du alle weil es Referenzen sind, erstelle neue Kopien von den Objekten dann sind sie individuell
https://tio.run/##jZJdS8MwFIbv8ytCKUxRy9Y6vZDCZHeC7qLejSFZkrFITUqSTqT2t9 ...

$years           = [ordered]@{"2020"='';"2021"='';"2022"='';"2023"='';"2024"='';"2025"=''}    
$SubscriptionSet = "ad_test","Subscription2","Subscription3"    
$Status          = [ordered]@{"Active"='';"Cancelled"=''}     
$alldata         = @{}

foreach ($subscription in $SubscriptionSet){
    $alldata.$subscription = [ordered]@{
        Count=''    
        Status=[pscustomobject]$Status
        Ordered=[pscustomobject]$years
        Modified=[pscustomobject]$years
        Cancelled=[pscustomobject]$years
    }
}


[int]$alldata.ad_test.Count += 1  
[int]$alldata.ad_test.Status.Active  += 2  
[int]$alldata.ad_test.Status.Cancelled  += 3  
[int]$alldata.ad_test.Ordered.2020 += 3  
[int]$alldata.ad_test.Ordered.2023 += 6  
[int]$alldata.ad_test.Ordered.2025 += 7  
[int]$alldata.ad_test.Modified.2020 += 1  
[int]$alldata.ad_test.Cancelled.2023 += 2  

$alldata | ConvertTo-JSON

Das vorherige Beispiel im anderen Beitrag war ja nur für die reine Umwandlung in JSON, fürs individuelle Füllen müssen das natürlich auch individuelle Objekte sein sonst duplizieren sich die Werte durch die Verwendung der Referenzen 😉
H41mSh1C0R
H41mSh1C0R Sep 10, 2024 updated at 09:05:11 (UTC)
Goto Top
Herzlichen Dank!

Dann baue ich jetzt mal Schleifen die mir die ganzen Werte ins alldata klöppeln. =)
14260433693
14260433693 Sep 10, 2024 updated at 10:39:18 (UTC)
Goto Top
Du kannst dafür auch z.B. eine Klasse als Template bauen von der du dann nur Instanzen erzeugen musst, Parameter wie Jahre etc. kannst du dann an den Constructor oder benutzerdefinierte Funktionen übergeben um das Objekt mit spezifischen Eigenschaften zu erzeugen:
class myobject {
    $count = 0
    $status = @{
        Active = 0
        Cancelled = 0
    }
    $Ordered = @{}
    $Modified = @{}
    $Cancelled = @{}

    myobject([string[]]$years){
        foreach ($year in $years){
            $this.Ordered.$year = 0
            $this.Modified.$year = 0
            $this.Cancelled.$year = 0
        }
    }
}


$data = [myobject]::new((2020..2025))
$data | Convertto-JSON