如何向PsObject添加子对象?嵌套PsObject的正确方式探讨
给PsObject添加可通过点表示法访问的子对象
问题根源
你之前把子PsObject作为父对象属性的写法,之所以操作麻烦还没法用点表示法访问子属性,是因为没有让PowerShell正确识别子对象的结构化属性。比如这类写法就会出问题:
# 原写法示例 $parent = New-Object PSObject $child = New-Object PSObject $child | Add-Member -MemberType NoteProperty -Name "ChildProp" -Value "TestValue" $parent | Add-Member -MemberType NoteProperty -Name "Child" -Value $child # 这时想访问子属性会很麻烦,甚至直接用 $parent.Child.ChildProp 可能达不到预期
正确实现方式
要让子对象的属性能直接通过点表示法访问,只需要保证子对象是结构化的PSObject,然后直接添加为父对象的属性即可。下面是两种简洁的实现方法:
方法1:分步创建添加
# 创建父对象 $parent = [PSCustomObject]@{ ParentProp = "父对象属性值" } # 创建子对象 $child = [PSCustomObject]@{ ChildProp1 = "子对象属性1" ChildProp2 = "子对象属性2" } # 把对象作为父对象的属性添加进去 $parent | Add-Member -MemberType NoteProperty -Name "Child" -Value $child # 现在直接用点表示法访问子属性 $parent.Child.ChildProp1
方法2:嵌套创建(更高效)
直接在定义父对象的时候嵌套子对象,一步完成:
$parent = [PSCustomObject]@{ ParentProp = "父对象属性值" Child = [PSCustomObject]@{ ChildProp1 = "子对象属性1" ChildProp2 = "子对象属性2" } } # 直接访问子属性 $parent.Child.ChildProp2
效果验证
用上面的代码创建后,你可以直接通过$parent.Child.ChildProp的形式访问子对象的属性,操作简洁,和你提供的可行方案效果一致。
另外推荐用[PSCustomObject]替代New-Object PSObject,前者语法更简洁,性能也更优,是PowerShell 3.0及以后版本的推荐写法。
内容的提问来源于stack exchange,提问作者Bbb
相关产品推荐
相关产品推荐

