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
Catégories : Tutos

0 commentaire

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *