Se ho un array PowerShell:
$arr = @("a", "b", "c")
ed ho la necessità di modificare tutti i valori, la cosa che viene naturale pensare è un ciclo di questo tipo
$arr | % { $_ = $_ + " - aggiungo una stringa"; write-host $_ }
pur venendo stampato il nuovo valore (write-host), l'array non viene modificato in quanto $_ rappresenta il valore locale dell'iterazione ma non un riferimento alla posizione dell'array.

Un possibile approccio per raggiungere lo scopo è questo:
(0..($arr.length-1)) | % {$arr[$_] = $arr[$_] +  " - aggiungo una stringa"; }

$arr
In questo caso l'array vivene modificato.
Questo perchè costruisco una sequenza di numeri (0..($arr.length-1)) lunga quanto gli elementi dell'array e che poi uso per accedere all'array $arr[$_] ($_ rappresenta solo l'indice).

Lo stesso scopo lo raggiungo anche con il classico ciclo for:
for($i = 0; $i -lt $arr.length; $i++) {$arr[$i] = $arr[$i] +  " - aggiungo una stringa"; }

$arr