2017-12-22 48 views
1

非常に初心者の質問。 PowershellでJSONから特定の値を取得しようとしています。具体的には、サービスを一覧にしたいと思います。TEST00000FAKEのみ。PowershellでJSONから値を取得

私は以下のスクリプトを実行すると、私はこれを取得:

TEST00000             FAKE   
---------             ----   
@{Enabled=True; Processed=2; Sent=3; Failed=4; Downloaded=5} @{Enabled=True} 

はどのようにして唯一のサービスのリストを得ることができますか?

もっと重要なことに、キー/値がのサービスだけを一覧表示するにはEnabled = Trueその中に存在しますか?これは関係なく、あなたのJSON内のサービス名の、あなたが動的に名を取得できるようにする必要があり

$JSON = '{ 
    "Envs": { 
    "DEV": { 
     "Services": { 
     "TEST00000": { 
      "Enabled": true, 
      "Processed": 2, 
      "Sent": 3, 
      "Failed": 4, 
      "Downloaded": 5 
     }, 
     "FAKE": { 
      "Enabled": true 
     } 
     } 
    } 
    }, 
    "Component": { 
    "Digger": { 
     "Envs": { 
     "DEV": { 
      "DownloadE": 4 
     } 
     } 
    } 
    } 
}' 

$jsonobj = ConvertFrom-Json -inputObject $JSON 

$jsonobj.Envs.DEV.Services 

答えて

3

Servicesプロパティの名前を取得します。 user2734259のようにGet-Memberを使用するか、オブジェクトに関する有用な情報を格納するpsobjectプロパティを使用できます。

$ServiceNames = $jsonobj.Envs.DEV.Services.psobject.properties.name 

あなたはサブ財産上のそれらとフィルターを超えることができますループEnabled

$jsonobj.Envs.DEV.Services.psobject.properties.name | ForEach-Object { 
    $_ | Where-Object {$jsonobj.Envs.DEV.Services.$_.Enabled -eq $True} 
} 
+0

この返事をありがとう、これは面白いです、私はこの情報を探すのに多くの時間を費やしました、どうやってこれを学びましたか?このことについて、私はどこでもっと読んでいますか? (またはPSのヘルプコンテンツを使用する技術を学んでいるのですか?) – ToastMan

+1

@ToastMan私は個人的にDon Jones Month of Lunchesの書籍を使い始めました。隠された 'psobject'プロパティについて知っているので、私は誰かの答えから拾い上げました(誰が覚えていないか)。 – BenH

+0

最後の部分はうまくいかないようです:$ _ |とにかく(-eq 'false'で)サービスをリストアップします。 – ToastMan

1

:ここ

はコードである

$JSON = '{ 
    "Envs": { 
    "DEV": { 
     "Services": { 
     "TEST00000": { 
      "Enabled": true, 
      "Processed": 2, 
      "Sent": 3, 
      "Failed": 4, 
      "Downloaded": 5 
     }, 
     "FAKE": { 
      "Enabled": true 
     } 
     } 
    } 
    }, 
    "Component": { 
    "Digger": { 
     "Envs": { 
     "DEV": { 
      "DownloadE": 4 
     } 
     } 
    } 
    } 
}' 

$jsonobj = ConvertFrom-Json -inputObject $JSON 
$enabledServices = $NULL 
$disabledServices = $NULL 

# Since the service names are arbitrary 
# create an object that contains only 
# objects whose MemberType is NoteProperty 

$strServiceNames = @($($jsonobj.Envs.DEV.Services | Get-Member | Where { $_.MemberType -eq "NoteProperty" } | Select Name).Name) 
$pscoServiceNames = [PSCustomObject]@{Names=$strServiceNames} 
foreach($serviceName in $pscoserviceNames.Names) 
{ 
    # dynamically access the service name 
    # from $jsonobj.Envs.DEV.Services 

    $serviceStatus = $jsonobj.Envs.DEV.Services.$serviceName.Enabled 

    # parse results based on value of .Enabled 

    if($serviceStatus.ToString() -eq "True") 
    { 
     $enabledServices = [Array]$enabledServices + [PSCustomObject]@{Name = $serviceName;Enabled = $serviceStatus} 
    } 
    else 
    { 
     $disabledServices = [Array]$disabledServices + [PSCustomObject]@{Name = $serviceName;Enabled = $serviceStatus} 
    } 
} 

# Show the results 

Write-Output "`nEnabled Services`n" 
$enabledServices | Format-List 
Write-Output "`nDisabled Services`n" 
$disabledServices | Format-List 

何かが不明である場合は私に知らせて、私はより詳細に説明することができます これがあなたを助けることを願っています。 Happy '砲撃!

+0

名前を持っていたら、これは超面白かった、返事をどうもありがとうございます! - – ToastMan

+0

<($ serviceStatus -eq "偽")の場合は、私にまったく同じ結果得られます。 対応サービスを 名:FAKE が有効:真 名:TEST00000 が有効:真 – ToastMan

+0

@toastmanとき、私、私は再訪します私がコードを書いたマシンに戻って、必要ならば修正し、完全性のために私の答えを編集してください。それはタイプの問題かもしれないと思うが、チェックするだろう。その後、幸せな休日 – trebleCode

関連する問題