(PowerShell) PSCustomObject をループさせつつキーと値の両方にアクセスする

引き続き PowerShell のお話。今度は PSCustomObject をループさせつつキーと値の両方にアクセスする方法が分からず躓きました。

現象

{
    "common": {
        "config":  {
            "user.name":  "testuser",
            "user.id": 12345,
            "user.email":  "email@example.com"
        }
    }
}

例えばこんな config.json があるとします。

この JSONファイル を読み込んでループさせつつ、キーと値の双方にアクセスしたい。

そこで foreach($confgi in $configData.GetEnumerator()){} としたり、 foreach($confgi in $configData.Keys){} としたりしましたが一向に中身が取得できず四苦八苦。

対処

# JSONファイル 読み込み
[String]$configPath = Join-Path ( Convert-Path . ) 'config.json'
$configData = Get-Content -Path $configPath -Raw -Encoding UTF8 | ConvertFrom-JSON

# ループ
foreach( $key in $configData.common.config.psobject.properties.name )
{
    Write-Host $key ' = ' $configData.common.config.$key
}

最終的に、 $Object.psobject.properties.name という全然異なるアクセス方法だったことが分かりました。今回の場合はキーが階層で入り組んでいるのでさらに . (ピリオド(ドット)) の個数が増えています。

> PowerShell -ExecutionPolicy RemoteSigned .\test.ps1
user.name  =  testuser
user.id  =  12345
user.email  =  email@example.com

やっとキーと値の両方が取得できました……。

参考

この記事を書いた人

アルム=バンド

フロントエンド・バックエンド・サーバエンジニア。LAMPやNodeからWP、Gulpを使ってejs,Scss,JSのコーディングまで一通り。たまにRasPiで遊んだり、趣味で開発したり。