anfaengerit
Goto Top

PowerShell - .Json file auslesen mit dynamischen Variablen

Guten Morgen,

Ich habe ein Script erstellt womit man Daten aus einer Json file auslesen und ausgeben kann, soweit funktioniert das auch aber ich habe bisher nicht herausfinden können wie man die Daten auslesen kann, wenn diese sich in der Json file ändern ohne das Skript selbst zu ändern.

Hier das Skript:
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Drawing")  
[void] [System.Reflection.Assembly]::LoadWithPartialName("System.Windows.Forms")  

$objForm = New-Object System.Windows.Forms.Form

$objForm.StartPosition = "CenterScreen"  

$objForm.Size = New-Object System.Drawing.Size(640,480)
$objForm.MaximizeBox = $False

$objForm.Text = "Customer Selection"  

$TabForm = New-Object System.Windows.Forms.TabControl
$TabForm.Location = "20,60"  
$TabForm.Size = "585,250"  
$objForm.Controls.Add($TabForm)

$Tab1 = New-Object System.Windows.Forms.TabPage
$Tab1.Databindings.DefaultDataSourceUpdateMode = 0
$Tab1.UseVisualStyleBackColor = $True
$Tab1.Name = "Customer1"  
$Tab1.Text = "Customer1"  
$TabForm.Controls.Add($Tab1)

$objLabel = New-Object System.Windows.Forms.Label
$objLabel.Location = New-Object System.Drawing.Size(200,20)
$objLabel.Size = New-Object System.Drawing.Size(1000,30)
$objLabel.Text = "Please select your customer:"  
$objLabel.Font = New-Object System.Drawing.Font("Comic Sans MS",12,[System.Drawing.FontStyle]::Bold)  
$objForm.Controls.Add($objLabel)

$objListBox = New-Object System.Windows.Forms.ListBox

$objListBox.Location = New-Object System.Drawing.Size(20,20)
$objListBox.Size = New-Object System.Drawing.Size(530)
$objListBox.Height = 190
$objListBox.Font = New-Object System.Drawing.Font("Comic Sans MS",12,[System.Drawing.FontStyle]::BOLD)  
$Tab1.Controls.Add($objListBox)
$objForm.TopMost = $true

$array = Get-Content -Path "$env:USERPROFILE\Desktop\Customer List\Json\test-server.json" | ConvertFrom-Json  

foreach ($item in $array.Customer1)
{  
   foreach ($Server1 in $item.Server1)
   {
      [void] $objListBox.Items.Add($Server1.Name) 
   }   
   foreach ($Server2 in $item.Server2)
   {
      [void] $objListBox.Items.Add($Server2.Name)
   }
}
$objListBox.Add_SelectedIndexChanged({ })
$objForm.Add_Shown({$objForm.Activate()}) 
[void] $objForm.ShowDialog()


Die Daten lese ich mithilfe von Foreach aus, allerdings klappt das bei mir nur wenn ich Diese direkt deklariere.

Hier sind die daten aus der Json file:
{
  "customer1": {  
    "Domain":  "Test.Domain1.com",  
     "Server1": {  
       "Name": "Test-ServerA1",  
       "Address": "1.2.3.4.5.6"  
      },
     "Server2": {  
       "Name": "Test-ServerB1",  
       "Address": "6.5.4.3.2.1"  
      }
  },

  "customer2": {  
    "Domain": "Test.Domain2.com",  
     "Server1": {  
       "Name": "Test-ServerA2",  
       "Address": "10.2.21.12.1234"  
      },
     "Server2": {  
       "Name": "Test-ServerB2",  
       "Address": "51.65.42.1246"  
      },
     "Server3": {  
       "Name": "Test-ServerC2",  
       "Address": "1.142.532.1231"  
      }
   }
}

Ich hoffe das Ihr mir dabei helfen könnt und freue mich auf eure Antworten face-smile

Content-ID: 5452313198

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

Ausgedruckt am: 22.11.2024 um 01:11 Uhr

TK1987
TK1987 18.01.2023 um 12:16:16 Uhr
Goto Top
Moin,

$array = Get-Content -Path "$env:USERPROFILE\Desktop\Customer List\Json\test-server.json" | ConvertFrom-Json  

Foreach ($Customer in ($array | Get-Member -Name "Customer*" -MemberType NoteProperty).Name) {  
  $array.$Customer
}

Gruß Thomas
AnfaengerIT
AnfaengerIT 18.01.2023 um 13:05:56 Uhr
Goto Top
Moin,

erstmal danke für die Hilfe, soweit funktioniert es auch alle daten auszulesen, allerdings weiß ich jetzt nicht genau, wie ich deinen Code so umformen könnte, dass mir z.b. nur der Name des Servers eines Kunden angezeigt wird. Könntest du mir das evtl. nochmal zeigen?

Vielen Dank im Voraus

LG
TK1987
Lösung TK1987 18.01.2023 aktualisiert um 13:18:08 Uhr
Goto Top
Zitat von @AnfaengerIT:
allerdings weiß ich jetzt nicht genau, wie ich deinen Code so umformen könnte, dass mir z.b. nur der Name des Servers eines Kunden angezeigt wird.
Dafür musst du einfach weiter verschachteln (wie du es ja oben auch schon selbst getan hast), bis du bei der gewünschten Eigenschaft angelangt bist:
Foreach ($Customer in ($array | gm "Customer*" -m NoteProperty).Name) {  
  Foreach ($Server in ($array.$Customer | gm "Server*" -m NoteProperty).Name) {  
    $array.$Customer.$Server.Name
  }
}

BTW: "Array" ist hier natürlich eigentlich der falsche Name für die Variable, da sie kein Array, sondern ein mehrdimensionales Objekt ist.

tio.run

Gruß Thomas
AnfaengerIT
AnfaengerIT 18.01.2023 um 13:50:00 Uhr
Goto Top
ahhhhh Okay, da stand ich wohl etwas auf´m schlauch, jedenfalls danke ich dir für die Code Bsp. und die Erklärung wegen dem "Array".
Außerdem Danke für die "PowerShell Seite", wusste gar nicht, das es sowas Online gibt.

LG