如何在PowerShell脚本属性中引用父级

时间:2017-01-03 17:49:27

标签: 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 }

然而,我找不到与$ this相当的$ parent。

有没有办法实现这种行为,以便结果:

$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?

1 个答案:

答案 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是不必要的。如果只是在$parent命令中将$O替换为Add-Member,则代码可以正常工作。他们是否有任何理由需要引用相对于孩子的父母而不是简单地用绝对术语指定父母?除非您计划将孩子重新分配给新的父母,否则您不应该使用这种方法遇到任何问题。