【问题标题】:PowerShell recursive object propertiesPowerShell 递归对象属性
【发布时间】:2020-11-18 23:24:58
【问题描述】:

我需要一种方法来提供对象的所有属性(递归地)。 不知道被转移对象有多少子对象。

示例对象:

$Car = [PSCustomObject] @{
    Tire          = [PSCustomObject] @{
        Color = "Black"
        Count = 4
    }

    SteeringWheel = [PSCustomObject]@{
        Color   = "Blue"
        Buttons = 15
    }
}

非常感谢!

【问题讨论】:

标签: powershell object recursion


【解决方案1】:

使用隐藏的psobject成员集枚举属性,然后递归:

function Resolve-Properties 
{
  param([Parameter(ValueFromPipeline)][object]$InputObject)

  process {
    foreach($prop in $InputObject.psobject.Properties){
      [pscustomobject]@{
        Name = $prop.Name
        Value = $prop.Value
      }
      Resolve-Properties $prop.Value
    }
  }
}

输出(带有您的示例对象层次结构):

PS C:\> Resolve-Properties $Car

Name          Value
----          -----
Tire          @{Color=Black; Count=4}
Color         Black
Length        5
Count         4
SteeringWheel @{Color=Blue; Buttons=15}
Color         Blue
Length        4
Buttons       15

请注意,上面显示的函数没有努力防止无限循环的递归引用,所以:

$a = [pscustomobject]@{b = [pscustomobject]@{a = $null}}
$a.b.a = $a
Resolve-Properties $a

会让你的 CPU 旋转

【讨论】:

  • 我非常喜欢这个解决方案,我需要做一些类似的事情,除了我需要在找到匹配的 prop + 值后将更改传递给原始对象。因此,按照该示例,我想将所有颜色属性更改为红色。理想情况下,更新现有对象会很好,但并没有真正符合这种想法,当然可以返回该对象的更新副本。
猜你喜欢
  • 2021-01-01
  • 1970-01-01
  • 2015-12-10
  • 1970-01-01
  • 2019-01-19
  • 2011-05-12
  • 2021-12-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多