在PowerShell中按名称设置嵌套对象属性的值
问题描述:
我想使用PowerShell设置嵌套对象属性的值。当你试图设置的第一级物业的价值,它的宁静简单:在PowerShell中按名称设置嵌套对象属性的值
$propertyName = "someProperty"
$obj.$propertyName = "someValue" # ← It works
对于嵌套的属性,这是行不通的:
$propertyName = "someProperty.someNestedProperty"
$obj.$propertyName = "someValue" # ← It doesn't work and raises an error.
如何设置嵌套的对象属性的值通过使用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
运行该命令,您将收到一个错误:
"The property 'B.C' cannot be found on this object. Verify that the property exists and can be set."
答
我创建了SetValue
和GetValue
方法让您获取和设置对象的嵌套属性(包括ng一个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 }
}
例
在以下示例中,我设置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
它无法知道你正在询问嵌套属性。我试图找到我认为这是一个愚蠢的目标。您需要构建逻辑来支持单个字符串中的嵌套属性。这将工作,但不是你想要'$ json。$ propertyName。$ nestedPropertyName.',因为它只能满足那个用例。需要递归函数iirc – Matt
我想这就是我在想的https://stackoverflow.com/questions/45174708/powershell-turn-period-delimited-string-into-object-properties/45175340#45175340 – Matt
@Matt感谢您的评论。我知道'$ json。$ propertyName。$ nestedPropertyName'。但它不是基于属性名称,并且不满足在运行时按名称解析属性的要求。关于链接的文章,它是* Get *,而我正在寻找* Set *。 –