2017-09-27 2 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을 사용하여 속성 이름으로?

$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

을 문제를 재현 싶은 분들을 위해 MCVE

, 여기에 간단한 예입니다 개체의 중첩 된 속성을 가져오고 설정할 수 있도록 SetValueGetValue 메서드를 만들었습니다 (includi ng json 객체) 동적으로 이름을 지정하면 완벽하게 작동합니다!

복잡한 속성을 확인하고 중첩 된 속성 이름을 분할하여 중첩 된 속성을 단계적으로 가져 오는 재귀 적 메서드입니다.

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

예 다음 예에서

이름으로 중첩 된 속성의

GetValue와 SetValue는, 나는 동적으로 SetValue을 사용하고 GetValue 방법을 사용하여 이름 값을 얻을 B.C을 설정

# 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 
관련 문제