Это не работает, как вы ожидаете, потому что %
(ForEach-Object
) не вводит новую область.
Вот доказательство: $x
изменяется в той же области, в родительскомэто не изменится:
$x = 'old'
1 | % { $x = 'new' }
$x
Если вам нужны области действия, вы можете использовать конструкцию &{process{...}}
вместо ForEach-Object
1..2 | & {process{
3..4 | & {process{
Get-Variable -Name '_' -Scope 0
Get-Variable -Name '_' -Scope 1 # <===
}}
Get-Variable -Name '_' -Scope 0
}}
Вышеописанное работает как ожидалось.
Примечание: &{process{...}}
(новая область) или .{process{...}}
(та же область) также быстрее, чем %
.