web-dev-qa-db-ja.com

PowerShellのオブジェクトの2つのプロパティに基づいて一意のオブジェクトを選択するにはどうすればよいですか?

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
9
ericalle

Mathiasの回答と非常に似ていますが、出力にすべての列が含まれます。

$csvDataUnique = $csvData | 
  Group-Object 'User Name','Computer Name' | 
  %{ $_.Group | Select 'User Name','Computer Name' -First 1} | 
  Sort 'User Name','Computer Name' 
11
R. McGee

Select-Objectを使用してカスタムプロパティを作成できます。だからあなたはすでにかなり近かった。これを試して:

Select-Object @{Label = "Index"; Expression = {"$($_.'User Name') $($_.'Computer Name')"} } -Unique

基本的に、2つのフィールドを1つの文字列に結合し、その上で一意に並べ替えます。フィールドを「インデックス」と呼びましたが、何とでも呼ぶことができます。

3

私は通常、ハッシュテーブルを使用し、その種のタスクのキーのプロパティ値を結合します。

$CSVDataUnique = @{}

$csvData | foreach {
 $CSVDataUnique["$_.'User Name'\$_.'Computer Name'"]++
}
1
mjolinor

Group-Objectを使用して、複数のプロパティでグループ化できます。

$Uniqs = $csvData | Group -Property "USER NAME","COMPUTER NAME" -NoElement | Select -Expand Name
1

別のオプションは、Get-Uniqueを使用することです。大規模なforeachループを使用せずに、一意のプロパティに基づいてオブジェクトを選択したい場合は、非常に役立ちました。

$csvData | Sort-Object 'User Name', 'Computer Name' | Get-Unique -AsString

Get-Uniqueは互いに隣接する文字列を比較するため、オブジェクトを並べ替える必要があります。さらに、比較では大文字と小文字が区別されます。

0
Alex_P