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?

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.

 

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

Schreibe einen Kommentar

Du kannst jetzt antworten und Dich später registrieren. Falls Du bereits ein Mitglied bist, logge Dich jetzt ein.

Gast
Auf dieses Thema antworten...

×   Du hast formatierten Text eingefügt.   Formatierung jetzt entfernen

  Only 75 emoji are allowed.

×   Dein Link wurde automatisch eingebettet.   Einbetten rückgängig machen und als Link darstellen

×   Dein vorheriger Inhalt wurde wiederhergestellt.   Editor-Fenster leeren

×   Du kannst Bilder nicht direkt einfügen. Lade Bilder hoch oder lade sie von einer URL.

×
×
  • Neu erstellen...