16

JSON 構成ファイルを使用するサイト用のスクリプトを作成しています。JSON は次のようになります。

"Groups": {
    "GroupOne": {
        "NamingFilter": {
            "Not":"<SITE>-MJ*",
            "Has":"*WM,*WT"
        }
    },
    "GroupTwo": {
        "NamingFilter": {
            "Has":"<SITE>-MJ*, *WC,*WL"
        }
    },
    "GroupThree": {
        "NamingFilter": {
            "Not":"<SITE>-MJ*",
            "Has":"*WI"
        }
    }
}

オブジェクトを PowerShell が読み取れるものに変換するには、ConvertFrom-Jsonwhich を使用して type に変換しPSCustomObjectます。

を繰り返し処理し、Groups各グループ名を取得してそれらと構成のGroupsオブジェクト内の対応するインデックスを出力する必要があります。あれは、

1. GroupOne
2. GroupTwo
3. GroupThree

私が得た最も遠いものは次のとおりです。

foreach ($group in $configObject.Groups) {
    $group
}

そして、これが行うことは、PowerShell 配列表記のようなものを出力することだけです。

@{GroupOne=; GroupTwo=; GroupThree=;}

PSCustomObjectこれはタイプでも可能ですか?私は主に JavaScript でコーディングしているため、問題を単純化しすぎている (または複雑化しすぎている) のは、比較的簡単なためです。

4

2 に答える 2

12

Converting PsCustomObject To/From Hashtablesのブログ投稿のおかげで、私はちょうどそれを理解したかもしれないと思います。

を使用Get-Member-MemberTypeて各グループを公開し、次のものをプルするだけです。

foreach ($group in $configObject.Groups) {
    $groupName = $($group | Get-Member -MemberType *Property).Name
}

出力:

GroupOne
GroupTwo
GroupThree

私は他の方法にもオープンです。

アップデート

ConvertFrom-Json別の方法を見つけましたが、唯一の欠点は、派手なCmdLetを使用しないことです。代わりに、.NET ライブラリに直接アクセスし、そのデシリアライザーを使用して HashTable に変換します。これにより、PSCustomObject をいじる必要が完全になくなります。IMO ハッシュテーブルは、操作がずっと簡単です。

$JSON = Get-Content -Path path/to.json -Raw
$HT = (New-Object System.Web.Script.Serialization.JavaScriptSerializer).Deserialize($JSON, [System.Collections.Hashtable])
$HT.Groups.GetEnumerator() | ForEach-Object {
    Write-Host "$($_.Key) : $($_.Value)"
}
于 2013-09-13T06:51:43.403 に答える