在PowerShell中按名称设置嵌套对象属性的值

Rez*_*aei 3 powershell anonymous-types cmdlet

我想使用PowerShell设置嵌套对象属性的值。当您尝试设置第一级属性的值时,这很简单:

$propertyName = "someProperty"
$obj.$propertyName = "someValue"  # ? It works
Run Code Online (Sandbox Code Playgroud)

对于嵌套属性,它不起作用:

$propertyName = "someProperty.someNestedProperty"
$obj.$propertyName = "someValue"  # ? It doesn't work and raises an error.
Run Code Online (Sandbox Code Playgroud)

如何使用PowerShell通过属性名称设置嵌套对象属性的值?

MCVE

对于那些想重现问题的人,这是一个简单的示例:

$Obj= ConvertFrom-Json '{ "A": "x", "B": {"C": "y"} }'
# Or simply create the object:
# $Obj= @{ A = "x"; B = @{C = "y"} }
$Key = "B.C"
$Value = "Some Value"
$Obj.$Key = $Value
Run Code Online (Sandbox Code Playgroud)

运行命令,您将收到一个错误:

“在此对象上找不到属性'BC'。请验证该属性存在并且可以设置。”

Rez*_*aei 7

我创建了SetValueGetValue方法,让您可以按名称动态获取和设置对象(包括json对象)的嵌套属性,它们可以完美工作!

它们是递归方法,可解析复杂属性并通过拆分嵌套属性名称逐步获取嵌套属性。

嵌套属性的GetValue和SetValue按名称

# Methods
function GetValue($object, $key)
{
    $p1,$p2 = $key.Split(".")
    if($p2) { return GetValue -object $object.$p1 -key $p2 }
    else { return $object.$p1 }
}
function SetValue($object, $key, $Value)
{
    $p1,$p2 = $key.Split(".")
    if($p2) { SetValue -object $object.$p1 -key $p2 -Value $Value }
    else { $object.$p1 = $Value }
}
Run Code Online (Sandbox Code Playgroud)

在以下示例中,我使用方法B.C动态设置SetValue并使用GetValue方法按名称获取其值:

# Example
$Obj = ConvertFrom-Json '{ "A": "x", "B": {"C": "y"} }'
# Or simply create the object:
# $Obj = @{ A = "x"; B = @{C = "y"} }
$Key = "B.C"
$Value = "Changed Dynamically!"
SetValue -object $Obj -key $Key -Value $Value
GetValue -object $Obj -key $Key
Run Code Online (Sandbox Code Playgroud)