2017-07-18 16 views
2

にピリオドで区切られた文字列を回し:PowerShellの:私はこのような何かに見える文字列持つオブジェクトのプロパティ

$string = "property1.property2.property3" 

を私はオブジェクトを持って、我々は$objectを呼ぶことにします。 $object.$stringをしようとするとproperty3property2property1$objectのように解釈されない場合は、私は$object."property1.property2.property3"と思っています。

明らかに、split('.')を使用すると、私は探している必要がありますが、未知の量のプロパティがある場合はどうすればよいのかわかりません。私は静的に行うことはできません:

文字列にいくつのプロパティが存在するかわからないので、これは動作しません。だから私はどのようにそれを一緒にステッチして文字列のn量のプロパティのですか?

+0

[PowerShellでネストされたオブジェクトプロパティの名前を名前で設定する](https://stackoverflow.com/q/46451994/3110834) –

答えて

0

ここではどのようなユースケースですか?説明したように文字列を分割することができます。これにより配列が作成され、nがわかるように配列内の要素の数を数えることができます。

$string = "property1.property2.property3" 
$split = $string.split('.') 
foreach($i in 0..($split.Count -1)){ 
    Write-Host "Element $i is equal to $($split[$i])" 
    $myString += $split[$i] 
} 
+0

文字列を分割すると、どのようにループするのですか私が必要とする財産にそれを一緒に縫うように、それが 'n'の長さであれば? – user3066571

+0

@ user3066571ユーザーの事例ではまだ明確ではありません - あなたは何を意味するのでしょうか?私は1つの変数 '$ myString'に連結されたすべての部分を含む文字列をどのように構築できるかを示す答えを拡張しました。本質的に、あなたは' foreach'ループ内の部品にしたいことをすることができます。 – gms0ulman

+0

@ gms0ulman OPはまだコメントしていないが、私は彼が望んでいたことを知っていると思う。私の答えを見て、それが彼らのために起こっているかもしれないと思うかどうかを見てください。 – Matt

3

これを行う簡単な方法は、Invoke-Expressionを使用することです。文字列を作成し、自分で入力したのと同じ方法で実行します。

​​

あなたは私たちが$stringと同時に展開したことをしたくないので、最初の$をエスケープする必要があります。典型的な警告:Invoke-Expressionを使用すると悪意のあるコードが実行されることに注意してください。

これを避けるには、オブジェクト内の現在の位置を取得し、次のブレッドクラムに渡す再帰関数を作成する必要があります。

Function Get-NestedObject{ 
    param(
     # The object we are going to return a propery from 
     $object, 
     # The property we are going to return    
     $property, 
     # The root object we are starting from. 
     $rootObject 
    ) 
    # If the object passed is null then it means we are on the first pass so 
    # return the $property of the $rootObject. 
    if($object){ 
     return $object.$property 
    } else { 
     return $rootObject.$property 
    } 
} 

# The property breadcrumbs 
$string = '"Directory Mappings"."SSRS Reports"' 
# sp 
$delimetedString = $String.Split(".") 

$nestedObject = $null 

Foreach($breadCrumb in $delimetedString){ 
    $nestedObject = Get-NestedObject $nestedObject $breadcrumb $settings 
} 

$nestedObject 

この機能が強化され、文書化されている可能性がある明確な場所がいくつかありますが、それであなたができることが分かるはずです。

関連する問題