将成员别名属性添加到 PowerShell 中的子属性



>我有一个对象,它有一个对象数组作为属性。

PS C:> $Object
GroupType        : Object
StateRevCounter  : 3846
SchemaTag        : Computer
PropGroupList    : {DSM.MdsPropGroup, DSM.MdsPropGroup, DSM.MdsPropGroup, DSM.MdsPropGroup...}

PS C:> $Object.PropGroupList
Tag                       PropertyList
---                       ------------
BasicInventory            {DSM.MdsTypedPropertyOfString, DSM.MdsTypedPropertyOfString, DSM.MdsTypedPr... 
ClientInfo                {DSM.MdsTypedPropertyOfNullableOfDateTime, DSM.MdsTypedPropertyOfNullableOf... 
Computer                  {DSM.MdsTypedPropertyOfString, DSM.MdsTypedPropertyOfNullableOfDateTime, DS...
CustomPatchManagement     {DSM.MdsTypedPropertyOfNullableOfBoolean, DSM.MdsTypedPropertyOfString}        
HardwareBasedRemoteMgmt   {DSM.MdsTypedPropertyOfString, DSM.MdsTypedPropertyOfNullableOfBoolean, DSM...

PS C:> $Object.PropGroupList.PropertyList
TypedValue                                  Tag                                        Type
----------                                  ---                                        ----
7.4.1.4461                                  ClientVersion                            String
Client                                      ComputerRole                             Option
169                                         CPUArchitecture                     CatalogLink
2262                                        CPUType                             CatalogLink
DSMCLIENT00.Computers.ideri.dev             DirectoryContext                         String
DSMClient00.ideri.dev                       FullQualifiedName                        String
InfrastructureRole                       Option
000C29E1B2FD                                InitialMACAddress                        String
227                                         InstalledOS                         CatalogLink
315                                         InstalledOSCulture                  CatalogLink
1458                                        InstalledOSFlavor                   CatalogLink
Windows 10 Enterprise 1511                  InstalledOSFriendlyName                  String
DSM.MdsVersion                              InstalledOSVersion                      Version
4193                                        InstalledRAM                              Int32
66057                                       LastBootServer                            Int32
.....

现在,我想为$Object创建别名属性,以直接在$Object的输出中显示$Object.PropGroupList.PropertyList的值,并在更改别名属性时在正确的位置更新值。

期望输出:

PS C:> $Object
BasicInventory_ClientVersion   : 7.4.1.4461
BasicInventory_ComputerRole    : Client
BasicInventory_CPUArchitecture : 169
...
GroupType                      : Object
StateRevCounter                : 3846
SchemaTag                      : Computer
PropGroupList                  : {DSM.MdsPropGroup, DSM.MdsPropGroup, DSM.MdsPropGroup, DSM.MdsPropGroup...}

因此,如果我随后将BasicInventory_ClientVersion更新为例如 10.4.2.3333,则 sub 属性(数组(中的相应值也会更新,反之亦然。

这甚至可能与Add-Member -MemberType AliasProperty有关吗?或者我只能为对象根目录中的属性添加别名属性?

问候 塞博

您可以使用Add-Member添加成员类型ScriptProperty。但是,构建对象是一个相当手动的过程。下面是使用两个属性的示例,ClientVersionComputerRole

$object | Add-Member -MemberType ScriptProperty -Name "BasicInventory_ClientVersion" -Value {
(($this.propgrouplist | Where Tag -eq 'BasicInventory').propertylist | where Tag -eq 'ClientVersion').TypedValue
}
$object | Add-Member -MemberType ScriptProperty -Name "BasicInventory_ComputerRole" -Value {
(($this.propgrouplist | Where Tag -eq 'BasicInventory').propertylist | where Tag -eq 'ComputerRole').TypedValue
}

现在,您可以更新源属性,并将其反映在脚本属性中。

# Properties Before Change
$object | fl
GroupType                    : Object
PropGroupList                : @{Tag=BasicInventory; PropertyList=System.Object[]}
BasicInventory_ClientVersion : 7.4.1.4461
BasicInventory_ComputerRole  : Client
# Properties After Change
($Object.PropGroupList.PropertyList | Where Tag -eq 'ClientVersion').TypedValue = '20.3.4'
$object | fl
GroupType                    : Object
PropGroupList                : @{Tag=BasicInventory; PropertyList=System.Object[]}
BasicInventory_ClientVersion : 20.3.4
BasicInventory_ComputerRole  : Client

尝试使用变量进行动态处理时要小心。当根据调用作用域中定义的变量调用对象时,将计算 scriptproperty 值中使用的任何变量。例如,如果分配了要{$tag}的值,则需要在检索$object之前在某处定义$tag

正如@AdminOfThings所建议的,我最终使用了ScriptProperty。谢谢。 我最终构建了一个函数来添加具有正确链接到数组的属性。

如您所见,我必须先将脚本块组合为字符串,以便首先解析变量的值。如果我直接将其写入脚本块中,则不会解析变量$prop.Tag,因为它未在脚本块中设置。

function ExpandObjectMdsPropGroupList ($ObjectList)
{
foreach($obj in $ObjectList)
{
$PropGroupList = $obj.Propgrouplist
foreach($propGrp in $PropGroupList)
{
foreach($prop in $propGrp.PropertyList)
{
# compose the getter
$GetterScriptBlockAsString = "(`$this.propGroupList.PropertyList | Where-Object{`$_.Tag -eq `"$($prop.Tag)`"}).TypedValue"
$GetterScriptBlock = [scriptblock]::Create($GetterScriptBlockAsString)
# compose the setter
[string]$typeOfPropTypedValue = $null
try{
# get the type of TypedValue
$typeOfPropTypedValue = $prop.TypedValue.GetType()
}catch{
# If TypedValue is null we have to get the type from get-member
$memberType = ($prop | Get-Member -Name TypedValue).Definition
$typeOfPropTypedValue = ($memberType.Remove($memberType.IndexOf(' ')))
}
if($typeOfPropTypedValue){
$typeOfPropTypedValue = "[$typeOfPropTypedValue]"
}
$SetterScriptBlockAsString = "param($typeOfPropTypedValue`$val);(`$this.propGroupList.PropertyList | Where-Object{`$_.Tag -eq `"$($prop.Tag)`"}).TypedValue = `$val"
$SetterScriptBlock = [scriptblock]::Create($SetterScriptBlockAsString)
# Add the member to the object
$obj | Add-Member -MemberType ScriptProperty -Name "$($propGrp.Tag)_$($prop.Tag)" -Value $GetterScriptBlock -SecondValue $SetterScriptBlock
}
}
}
$ObjectList
}

现在我可以在任何对象上使用这个函数,将 PropGroupList 作为属性,它添加了脚本属性,而不会在列表中添加 PropGroups 是什么。

多亏了吸盘手和二传手,我可以更新任何一侧的值。

问候 塞博

最新更新