如何根据PowerShell中对象的两个属性选择唯一对象?

时间:2015-07-10 14:46:06

标签: powershell object properties unique

我有一个具有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

5 个答案:

答案 0 :(得分:9)

非常类似于Mathias'回答,但将输出中的所有列:

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

答案 1 :(得分:3)

您可以使用Select-Object创建自定义媒体资源。所以你已经非常接近了。试试这个:

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

它基本上将两个字段组合成一个字符串,并对其进行排序。我打电话给#34; Index"但它可以被称为任何东西。

答案 2 :(得分:1)

我通常使用哈希表,并为这类任务的键加入属性值:

$CSVDataUnique = @{}

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

答案 3 :(得分:1)

您可以使用Group-Object按多个属性进行分组:

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

答案 4 :(得分:0)

另一种选择是使用Get-Unique。 当我想基于一个独特的属性选择对象而没有一些广泛的foreach循环时,这对我的情况很有帮助。

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

该对象需要排序,因为Get-Unique比较彼此相邻的字符串。此外,该比较区分大小写。