2016-11-29 16 views
2

コマンドレットConvertFrom-Jsonを使用してJSONファイルからデータを収集しています。それはこれまでのところ動作します。 JSONにはハッシュテーブルの配列が含まれています。ハッシュテーブルの配列にハッシュテーブルが含まれているか確認してください

[ 
    { 
     "userSamAccountName": "jodoe", 
     "QuotaGroup": "AD-Group-Contoso-1" 
    }, 
    { 
     "userSamAccountName": "jodoe", 
     "QuotaGroup": "AD-Group-Contoso-2" 
    }, 
    { 
     "userSamAccountName": "frmark", 
     "QuotaGroup": "AD-Group-Contoso-1" 
    }, 
    { 
     "userSamAccountName": "frmark", 
     "QuotaGroup": "AD-Group-Contoso-2" 
    } 
] 

ここで、重複するデータを含む別のハッシュテーブル配列があります。

[ 
    { 
     "userSamAccountName": "jodoe", 
     "QuotaGroup": "AD-Group-Contoso-1" 
    }, 
    { 
     "userSamAccountName": "jodoe", 
     "QuotaGroup": "AD-Group-Contoso-2" 
    }, 
    { 
     "userSamAccountName": "niwellenstein", 
     "QuotaGroup": "AD-Group-Contoso-1" 
    }, 
    { 
     "userSamAccountName": "niwellenstein", 
     "QuotaGroup": "AD-Group-Contoso-2" 
    } 
] 

私はそれらを重複することなく組み合わせたいと思っています。

select -Unique.Contains()のようないくつかのコマンドレットを試しましたが、機能しないように動作しません。

背景:私はさまざまなADグループを持っています。このグループでは、ユーザーは1つのグループのメンバーのみが許可されます。たとえば、jodoeはAD-Group-Contoso-1またはAD-Group-Contoso-2のメンバーになることができます。そして私はそれらを報告する必要があります。 レポートファイルは、管理者に報告するスケジュールされたタスクによって処理されます。最初のスクリプトは20分ごとに実行され、最初のスクリプトからレポートファイルを処理するreport-scheduled-taskが1日に1回実行されるため、レポートファイルに重複を入れたくありません。ここで

は、私がこれまで試したどのように私のコードです:

# Group users in list to check if user is in 2 or more Groups # 
$reportDuplicates = $adUserlist | 
        group -Property userSamAccountName | 
        ? { $_.Count -gt 1 } 
# only select the group of the duplicates # 
# $reportDuplicates.Group corresponds to the Json File # 
$reportDuplicates = $reportDuplicates.Group 

$reportPath = "C:\\temp\\reports\\" 
$reportDuplicatesPath = $reportPath + "reportADDuplicates.json" 

# Check if file already exists # 
if (Test-Path $reportDuplicatesPath) { 
    # load existing reports # 
    $existingDuplicatesReport = Get-Content $reportDuplicatesPath | 
           ConvertFrom-Json 
    $reportDuplicates.ForEach({ 
     if ($existingDuplicatesReport.Contains($_)) { 
      $existingDuplicatesReport.Add($_) 
     } 
    }) 
    # convert to JSON and save in file # 
    $existingDuplicatesReport | ConvertTo-Json | Out-File $reportDuplicatesPath 
} else { 
    # convert to JSON and save in file # 
    $reportDuplicates | ConvertTo-Json | Out-File $reportDuplicatesPath 
} 

しかし、それは、私はハッシュテーブルの配列は、ハッシュテーブルが含まれている場合、私は確認することができないという、気持ちを持って動作しないのだろうか?

すべてを配列にプッシュしてselect -Uniqueを実行すると、ハッシュテーブルの配列の最初のエントリのみが取得されます。

+0

のHashtableが参照型であり、 '(入って)'まったく同じ*アイデンティティ*のオブジェクトではなく、オブジェクトを探します。 *類似の*コンテンツ。コレクションを繰り返し処理し、比較を手作業で行う必要があります –

答えて

4

たあなたは一意性を確立したい、ネストされたハッシュテーブルのキーにSelect-Object教える:

$arr1 = $json1 | ConvertFrom-Json 
$arr2 = $json2 | ConvertFrom-Json 

$arr1 + $arr2 | Select-Object -Unique 'userSamAccountName', 'QuotaGroup' 
+0

素晴らしいです。どうもありがとう。 Eldo.Ob –

関連する問題