Jump to content

Powershell foreach-object


Direkt zur Lösung Gelöst von BOfH_666,
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Empfohlene Beiträge

Geschrieben

Hallo zusammen,

ich bin gerade etwas am Verzweifeln, weil ich mich nach ein paar Monaten Powershell Pause, mal wieder ans Werk machen wollte.

 

Vorab als Information ich bin absolut kein Profi in Powershell, aber habe schon einiges damit gemacht.

Ich versuche das Prozedere mal ganz einfach zu schildern.

 

Ich habe ein Array mit Kundendaten, welches ich je nach Produkten auf 2 separate Array aufteile.

Dies habe ich ganz einfach gemacht mit:

array2 = array1 | where-object {$_.produkt -match produkt1}

und

array3 = array1 | where-object {$_.produkt -match produkt1 or $_.produkt -match produkt2} | foreach-object {$_.produkt = 'TEST']

Nun habe ich das array2 mit allen Datensätze, die das Produkt 1 haben und das array3 mit allen Datensätze, die das Produkt1 oder Produkt2 haben.

Alle anderen Datensätze benötige ich für das weiterarbeiten nicht.

 

Jetzt kommt es aber zu dem was mich so sehr wundert. Alle Datensätze im array1 haben nun als Produkt ebenfalls "TEST", obwohl im Befehl nichts derartiges vorkommt.

Also habe ich die Befehle zu Testzwecken aufgeteilt und habe folgendes ausgeführt:

array3 = array1 | where-object {$_.produkt -match produkt1 or $_.produkt -match produkt2}

 

Ausgabe von array2 -> alle Produkte sind produkt1

 

array3 | foreach-object {$_.produkt = 'TEST']

Ausgabe von array3 -> alle Produkte sind "TEST"

Ausgabe von array2 -> alle Produkte sind "TEST"

Aber Wieso?!

 

Ich habe dann daraufhin noch weitere Umwege probiert:

array2 = array1 | where-object {$_.produkt -match produkt1} -> array2 weiterhin nur Produkt1

array3 = array1 | where-object {$_.produkt -match produkt2} -> array3 erstmal nur Produkt2

array2_test = array2 -> eine "Kopie" von array2

array3+=array2_test -> die "Kopie" von array2 zu array3 hinzufügen, damit alle Datensätze für Produkt1 und 2 in array3 gespeichert sind

array3 | foreach-object {$_.produkt = 'TEST'] -> alle Einträge von produkt auf TEST setzen

 

Und was passiert?

die Ausgabe von array2, array2_test und array3 sind für produkt identisch, alle sind jetzt plötzlich auf "TEST" geändert.

 

Irgendwie müssen die variablen aufeinander referenziert sein, aber das habe ich so noch nie erlebt.

 

Wie kann ich dies beheben?

 

 

Liebe Grüße

 

 

 

 

 

 

 

 

 

 

 

  • Beste Lösung
Geschrieben
$Array1 = @'
Nummer,Produkt
1,Produkt1
2,Produkt2
3,Produkt3
4,Produkt1
5,Produkt2
6,Produkt3
7,Produkt1
8,Produkt2
9,Produkt3
'@ | ConvertFrom-Csv

$array2 = $array1 | 
    where-object { $_.produkt -match 'produkt1' } | 
        Select-Object -Property *

$array3 = $array1 | 
    where-object { $_.produkt -match 'produkt1' -or $_.produkt -match 'produkt2' } | 
        Select-Object -Property *
$array3 | 
    foreach-object { $_.produkt = 'TEST' }

$Array1
$array2
$array3

Ergibt das das erwartete Ergebnis?

  • Danke 1
Geschrieben

Das ist ein Objektproblem - jedes Element deiner Arrays ist ein eigenständiges Objekt. Diese Objekte hast Du jetzt in 2 Arrays aufgenommen. Änderst Du das Objekt in Array3, dann ist das natürlich das gleiche Objekt wie in Array2.... Entweder mit "Select" neue Objekte erzeugen (wie oben) oder die Arrays vorher klonen.

 

  • Danke 1
Der letzte Beitrag zu diesem Thema ist mehr als 180 Tage alt. Bitte erstelle einen neuen Beitrag zu Deiner Anfrage!

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden
×
×
  • Neu erstellen...