我有一个具有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
答案 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
比较彼此相邻的字符串。此外,该比较区分大小写。