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'。请验证该属性存在并且可以设置。”
我创建了SetValue
和GetValue
方法,让您可以按名称动态获取和设置对象(包括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)
归档时间: |
|
查看次数: |
1657 次 |
最近记录: |