Mettre à jour une valeur d’un objet traité dans une boucle foreach
Voici une astuce qui peut parfois servir, ça sert à mettre à jour votre objet dans la variable de référence de votre boucle dans l’exemple suivant :
# On cree nos donnees pour l'exemple
$i = 0
$Obj = @()
$Obj += [PSCustomObject]@{
ID = $i++
Column1 = "toto"
Column2 = "Banane"
}
$Obj += [PSCustomObject]@{
ID = $i++
Column1 = "titi"
Column2 = "Kiwi"
}
$Obj += [PSCustomObject]@{
ID = $i++
Column1 = "tutu"
Column2 = "Banane"
}
# Affichage des donnees avant modification
Write "Avant la boucle: "
$Obj
# Traitement des donnees dans une boucle ForEach
foreach ($item in $Obj) {
# Si la Column1 est tutu, on définit la Column2 sur fraise au lieu de banane
if($item.Column1 -eq "tutu") {
# On recherche la ligne par son ID qui est unique
($Obj | Where-Object -FilterScript {$_.ID -eq $item.ID}).Column2 = "Fraise"
}
}
Write "`r`nApres la boucle: "
$Obj
Le résultat affiché:
Avant la boucle:
ID Column1 Column2
-- ------- -------
0 toto Banane
1 titi Kiwi
2 tutu Banane
Apres la boucle:
0 toto Banane
1 titi Kiwi
2 tutu Fraise
Une petite précision utile, cet article à pour but de montrer que cette possibilité existe, mais ce n’est clairement pas la plus efficiente. Il est par exemple préférable de modifier l’itération dans votre boucle plutot que l’objet parent, et de retourner cette dernière dans un Array comme ceci:
$out = @()
# Traitement des donnees dans une boucle ForEach
foreach ($item in $Obj) {
# Si la Column1 est tutu, on définit la Column2 sur fraise au lieu de banane
if($item.Column1 -eq "tutu") {
# On recherche la ligne par son ID qui est unique
$item.Column2 = "Fraise"
}
$out += $item
}
$out
0 commentaire