2017-01-03 24 views
1

給定一個嵌套的PowerShell自定義對象是這樣的:如何引用父在PowerShell腳本屬性

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

)} 

我想一個腳本屬性添加到每個引用值「ParentValue「ChildArray」對象「在封閉的對象中。從概念上說,我想要做以下事情:

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

但是,沒有$的父母相當於$,我可以找到。

有沒有辦法來實現這一行爲,以便結果:

$O.ChildValueArray | Format-Table -AutoSize 

是:

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

我可以!這是我完全的腦凍結。問題的原始形式讓我在父母之前定義了孩子 - 這意味着如果沒有在孩子上使用添加成員來引用父母,我就不能這樣做。應該有一個「杜!」徽章 - 你得到它的問題一個錯誤的問題!感謝您指出了這一點! – 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 

更新

其實在進一步測試後我可以看到For-Each是不必要的。如果您只需在Add-Member命令中將$parent替換爲$O,則代碼可以正常工作。他們是否有任何理由需要引用父親相對於孩子而不是簡單地用絕對術語來指定父母?除非您計劃將孩子重新分配給新的家長,否則不應使用此方法解決任何問題。