2017-09-27 83 views
1

我想使用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."

+0

它无法知道你正在询问嵌套属性。我试图找到我认为这是一个愚蠢的目标。您需要构建逻辑来支持单个字符串中的嵌套属性。这将工作,但不是你想要'$ json。$ propertyName。$ nestedPropertyName.',因为它只能满足那个用例。需要递归函数iirc – Matt

+0

我想这就是我在想的https://stackoverflow.com/questions/45174708/powershell-turn-period-delimited-string-into-object-properties/45175340#45175340 – Matt

+0

@Matt感谢您的评论。我知道'$ json。$ propertyName。$ nestedPropertyName'。但它不是基于属性名称,并且不满足在运行时按名称解析属性的要求。关于链接的文章,它是* Get *,而我正在寻找* Set *。 –

回答

0

我创建了SetValueGetValue方法让您获取和设置对象的嵌套属性(包括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 
相关问题