IIRC это действительно связано с оболочками PSObject, которые являются ключевым элементом системы расширенного типа в PowerShell 2.0.Когда вы выполняете это:
$x = new-object psobject
$x | add-member noteproperty test 'xtest'
$x.test
Это работает, потому что объект уже является PSOject, поэтому Add-Member может добавить новый NoteProperty непосредственно к PSObject, например:
$y = @{}
$y | add-member noteproperty test 'ytest'
$y.test
Это нене работает, потому что $y
изначально не переносится, поэтому при выполнении Add-Member он создает новый объект, который упаковывает исходную хеш-таблицу.Вы можете увидеть это, используя Get-Member, например:
$y | Get-Member
Вы не увидите свой объект test
.Чтобы заставить это работать в v2, вы должны сделать это:
$y = $y | add-member noteproperty test ytest -passthru
$y.test
ytest
К вашему сведению, это изменение в V3, так как оно основано на DLR, оно изменяет объект напрямую, не создавая новый объект-обертку, например:
# PowerShell V3 only
16# $y = @{}
17# Add-Member -InputObject $y test ytest
18# $y.test
ytest