2017-04-25 13 views
1

オブジェクトのプロパティを反復処理し、値がTrueのものだけを出力するPowerShellスクリプトを作成しようとしています。オブジェクトのプロパティを反復処理する方法

マイ開始データはこれです:

 
UserId         : 00546000000m3vCAAQ 
UserPermissionsOfflineUser    : True 
UserPermissionsMobileUser    : False 
UserPermissionsSupportUser    : True 
UserPermissionsWebUser     : False 

私は、出力はユーザーIDと次のような該当するライセンスのみで構成されたい:

 
UserId         : 00546000000m3vCAAQ 
UserPermissionsOfflineUser    : True 
UserPermissionsSupportUser    : True 

私は2が必要だと思います1つは各ユーザーを反復処理し、もう1つはループを繰り返してユーザーのプロパティを反復処理し、すべてのfalse値を解析します。

foreach ($_ in $resultset) 
{ 
    $_ | 
    Select-Object -Property @{ N = 'UserId'; E = { $_.Id } } 

    #This is where I am getting stuck on the second loop. 
    #$_.psobject.properties | % { $_.Value }  
} 

答えて

2

使用Where-ObjectUserIDプロパティと一緒にそれらを選択するために、Select-Objectを使用し、その後、$trueの値を持つプロパティを見つけるために:

$resultSet |ForEach-Object { 
    $trueProperties = $_.psobject.Properties |Where-Object {$_.Value -eq $true} |Select -ExpandProperty Name 
    $_ |Select -Property @('Id';$trueProperties) 
} 

は選択のように自分の価値に基づいてプロパティを選び出すことに注意してください後でExport-*またはFormat-*コマンドレットを使用して痛みを引き起こす可能性があります。

|Select-Object -ExpandProperty Nameの部分は、この場合、$truePropertiesには2つの文字列 "UserPermissionsOfflineUser"と "UserPermissionsSupportUser"が含まれています。

表現@('Id';$trueProperties)は単に「ID」の文字列に文字列を連結し、その最後のSelect-Objectステートメントが言うように、基本的に同じである:

$_ |Select Id,UserPermissionsOfflineUser,UserPermissionsSupportUser 
+0

感謝を。私は構文エラーを修正しました。私はValueの代わりに$ _。valueを使用します。私は正しい出力を得ていますが、UserIdは空です。 – PKonstant

+0

@PKonstantは 'UserId'プロパティの実際の名前ですか?それとも 'Id'ですか?それは質問から明らかではない –

+0

それは 'Id'です。私はそれを変更し、それは働いた!ありがとうございました。私はあなたのスクリプトの一部を '| -ExpandProperty Name 'と' $ _ | Select -Property @( 'Id'; $ trueProperties) 'を選択します。私はPowerShellを初めて使用しており、何の文が何を出力するかを知りたいと思いますか? – PKonstant

関連する問題