2017-01-03 3 views
1

Учитывая вложенный PowerShell пользовательский объект, как это:Как ссылаться родителя в PowerShell собственности сценария

$O = [PSCustomObject]@{ 
ParentValue = 100 
ChildValueArray = @(
    [PSCustomObject]@{ Name = 'First'; Value = 1 }, 
    [PSCustomObject]@{ Name = 'Second'; Value = 2 } 

)} 

Я хотел бы добавить свойство сценария для каждого из объектов в «ChildArray», который ссылается на значение «ParentValue "в окружающем объекте. Концептуально я хотел бы сделать следующее:

$O.ChildValueArray | Add-Member -MemberType ScriptProperty -Name Diff -Value { $this.Value + $parent.ParentValue } 

Однако нет $ родителя эквивалентно $ это, что я могу найти.

Есть ли способ, чтобы добиться такого поведения, так что результат:

$O.ChildValueArray | Format-Table -AutoSize 

Is:

Name Value Diff 
---- ----- ---- 
First  1 101 
Second  2 102 

Вместо текущего значения:

Name Value Diff 
---- ----- ---- 
First  1 1 
Second  2 2 

Я подозреваю, что это не представляется возможным по следующим причинам:

How to reference parent in inline creation of objects?

+0

Почему вы не можете просто использовать '$ O.ParentValue'? –

+0

Я могу! Это была полная заморозка мозга с моей стороны. Первоначальная формулировка проблемы заключалась в том, что я определял ребенка перед родителем, а это означало, что я не мог без него использовать Add-Member для дочернего элемента для ссылки на родителя. Должен быть «Дух!» Значок - вы получаете его за задание непростого вопроса! Спасибо за указание на это! – user1383092

+0

Добро пожаловать. ;) –

ответ

2

Это, кажется, работает хорошо для меня:

$parent = [PSCustomObject]@{ 
ParentValue = 100 
ChildValueArray = @(
    [PSCustomObject]@{ Name = 'First'; Value = 1; }, 
    [PSCustomObject]@{ Name = 'Second'; Value = 2; } 
)} 

$parent.ChildValueArray ` 
| % { 
    Add-Member ` 
     -InputObject $_ ` 
     -MemberType ScriptProperty ` 
     -Name Diff ` 
     -Value { $this.Value + $parent.ParentValue } } 

Тестирование он дает поведение я бы ожидать:

$parent.ChildValueArray | ft * 

$parent.ParentValue = 200 
$parent.ChildValueArray | ft * 

$parent.ChildValueArray[0].Value = 100 
$parent.ChildValueArray | ft * 

Выход:

Name Value Diff 
---- ----- ---- 
First  1 101 
Second  2 102 

Name Value Diff 
---- ----- ---- 
First  1 201 
Second  2 202 

Name Value Diff 
---- ----- ---- 
First 100 300 
Second  2 202 

Update

На самом деле, после дальнейших испытаний я вижу, что For-Each не является необходимым. Ваш код работает нормально, если вы просто замените $parent на $O в команде Add-Member. Есть ли у них причина, по которой вам нужно ссылаться на родителя относительно ребенка, а не просто указывать родителя в абсолютных выражениях? Если вы не планируете переназначить ребенка новому родителю, вы не должны столкнуться с какими-либо проблемами, используя этот подход.

Смежные вопросы