Set Value of Nested Object Property by Name in PowerShell

前端 未结 2 1335
傲寒
傲寒 2020-12-21 04:59

I want to set value of nested object property using PowerShell. When you are trying to set the value of the first level properties, it\'s quiet simple:

$prop         


        
相关标签:
2条回答
  • 2020-12-21 05:24

    May I propose an upgrade to Reza's solution. With this solution, you can have many level of nested properties.

    function GetValue($object, [string[]]$keys)
    {
        $propertyName = $keys[0]
        if($keys.count.Equals(1)){
            return $object.$propertyName
        }
        else { 
            return GetValue -object $object.$propertyName -key ($keys | Select-Object -Skip 1)
        }
    }
    
    
    function SetValue($object, [string[]]$keys, $value)
    {
        $propertyName = $keys[0]
        if($keys.count.Equals(1)) {
            $object.$propertyName = $value
        }
        else { 
            SetValue -object $object.$propertyName -key ($keys | Select-Object -Skip 1) -value $value
        }
    }
    

    Usage

    $Obj = ConvertFrom-Json '{ "A": "x", "B": {"C": {"D" : "y"}} }'
    SetValue $Obj -key "B.C.D".Split(".") -value "z"
    GetValue $Obj -key "B.C.D".Split(".")
    
    0 讨论(0)
  • 2020-12-21 05:40

    I created SetValue and GetValue methods to let you get and set a nested property of an object (including a json object) dynamically by name and they work perfect!

    They are recursive methods which resolve the complex property and get the nested property step by step by splitting the nested property name.

    GetValue and SetValue of Nested properties by Name

    # 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 }
    }
    

    Example

    In the following example, I set B.C dynamically using SetValue and get its value by name using GetValue method:

    # 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
    
    0 讨论(0)
提交回复
热议问题