Jump to content
Sign in to follow this  
Ipfan

Powershell foreach-object

Recommended Posts

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

 

 

 

 

 

 

 

 

 

 

 

Share this post


Link to post
Share on other sites
$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?

  • Thanks 1

Share this post


Link to post
Share on other sites

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.

 

  • Thanks 1

Share this post


Link to post
Share on other sites

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

Sign in to follow this  

Werbepartner:



×
×
  • Create New...