zaphod88
Goto Top

Problem mit verschachtelten ForEachs in Powershell

Hallo zusammen,

ich stehe gerade absolut auf dem Schlauch und komme nicht weiter.
Folgendes Problem: Ich hole per API eine Liste und ergänze sie um die Property "IDArray". Dort können eine oder mehrere IDs im Array stehen.
Im weiteren Verlauf des Skripts wird es aber nötig, aus den Objekten, in denen in der Property IDArray mehrere Werte stehen, wieder einzelne zu machen. Ich tue also folgendes:

$finalarray = @()
$finalarray += $apiarray | where { ($_.IDArray | measure).Count -eq 1 }
$apiarray | where { ($_.IDArray | measure).Count -gt 1 } | % {
      $array = $_.IDArray #30,40
      foreach ($id in $array) {
        $item = $_
        $singleid = @()
        $singleid += [array]$id
        Add-Member -MemberType NoteProperty -InputObject $item -Name IDArray -Value $singleid -Force
        #item
        $finalarray += $item
     }
}
Wenn ich mir nun direkt nach dem Add-Member die einzelnen "$items" ausgeben lassen, passt alles. Die einzelnen IDs sind jeweils als einzelnes Objekt angelegt. Dem $finalarray werden aber zwei Objekte hinzugefügt, die jeweils die letzte ID aus dem $array (also 40) haben.

Habt ihr da eine Idee?

EDIT: Ich habe im foreach-Loop folgendes eingefügt:

 
$index = [array]::indexOf($array,$id)
Add-Member -MemberType NoteProperty -InputObject $item -Name IDArray -Value $index -Force

Dabei sind die Indexe der einzelnen $item korrekt, aber bei den Objekten des $finalarray alle dieselben (nämlich 1, weil 2 Objekte im IDArray). Bloß wie ich das jetzt lösen kann - da komme ich nicht weiter.

Content-Key: 72572246222

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

Printed on: April 27, 2024 at 15:04 o'clock

Member: zaphod88
Solution zaphod88 Mar 14, 2024 at 15:34:39 (UTC)
Goto Top
Okay, jetzt hab ich es doch hinbekommen. Die Lösung war, im foreach-Loop jeweils neue Objekte anzulegen:
$apiarray | where { ($_.IDArray | measure).Count -gt 1 } | % {
      $template = $_
      $array = $_.IDArray #30,40
      foreach ($id in $array) {
        $item = New-Object PSObject
        $template.PSObject.Properties | % {
          $item | Add-Member -MemberType $_.MemberType -Value $_.Value -Name $_.Name
        }
        $singleid = @()
        $singleid += [array]$id
        Add-Member -MemberType NoteProperty -InputObject $item -Name IDArray -Value $singleid -Force
        #item
        $finalarray += $item
     }
}
Mitglied: 12168552861
12168552861 Mar 14, 2024 updated at 15:40:36 (UTC)
Goto Top
Du kannst Objekte klonen (mit psobject.Copy()) dann brauchst du die nicht aufwendig manuell wieder zusammen stöpseln ...
https://tio.run/##K8gvTy0qzkjNyfn/XyUtMy8xJ7GoKLFSwVbBQUOTSyWxIBPGN9TTM1 ...
Gruß pp