6つのプロパティを持つオブジェクトの配列があります。これは次のようになります。
$csvData
CURRENT DATE AND TIME : 07/10/2015 08:17:17 CST
USER NAME : userName
COMPUTER NAME : computerName
IP ADDRESS : 192.168.1.1
LOGON SERVER : logonServer
LOGON/OFF : logon
ユーザー名とコンピューター名が重複しないオブジェクトの配列を作成したいと思います。 PowerShellで一意のユーザー名/コンピューター名の組み合わせのみを取得するにはどうすればよいですか?最終的には、すべての重複を削除し、重複の数を追跡するプロパティ「Count」を追加したいと思います。
私が試してみました:
$csvDataUnique = $csvData | Select-Object 'User Name','Computer Name' -Unique
$csvDataUnique = $csvData | sort -Property 'User Name' | Get-Unique
Mathiasの回答と非常に似ていますが、出力にすべての列が含まれます。
$csvDataUnique = $csvData |
Group-Object 'User Name','Computer Name' |
%{ $_.Group | Select 'User Name','Computer Name' -First 1} |
Sort 'User Name','Computer Name'
Select-Object
を使用してカスタムプロパティを作成できます。だからあなたはすでにかなり近かった。これを試して:
Select-Object @{Label = "Index"; Expression = {"$($_.'User Name') $($_.'Computer Name')"} } -Unique
基本的に、2つのフィールドを1つの文字列に結合し、その上で一意に並べ替えます。フィールドを「インデックス」と呼びましたが、何とでも呼ぶことができます。
私は通常、ハッシュテーブルを使用し、その種のタスクのキーのプロパティ値を結合します。
$CSVDataUnique = @{}
$csvData | foreach {
$CSVDataUnique["$_.'User Name'\$_.'Computer Name'"]++
}
Group-Object
を使用して、複数のプロパティでグループ化できます。
$Uniqs = $csvData | Group -Property "USER NAME","COMPUTER NAME" -NoElement | Select -Expand Name
別のオプションは、Get-Unique
を使用することです。大規模なforeachループを使用せずに、一意のプロパティに基づいてオブジェクトを選択したい場合は、非常に役立ちました。
$csvData | Sort-Object 'User Name', 'Computer Name' | Get-Unique -AsString
Get-Unique
は互いに隣接する文字列を比較するため、オブジェクトを並べ替える必要があります。さらに、比較では大文字と小文字が区別されます。