2017-09-27 13 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.'は、その1つのユースケースを満たすだけなので、あなたが望むものではありません。再帰関数が必要です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のメソッドを作成しました(includi 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メソッドと値の代入は、I動的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 
関連する問題