首页 > 解决方案 > Powershell:在一个属性上获取唯一性,同时对两个属性进行排序

问题描述

我正在使用以下两个语句生成一个列表:

$Directmembers = $memberdata | where-object {($_.huntpilot_number -eq $e.'Hunt Pilot number') -and ($_.directoryuri -like '*@*.*')} | select-object huntpilot_number, directoryuri, @{n="Origin";e={"DirectMember"}}

$Pickupmembers = $pickupdata | where-object {($_.huntpilot_number -eq $e.'Hunt Pilot number') -and ($_.directoryuri -like '*@*.*')} | select-object huntpilot_number, directoryuri, @{n="Origin";e={"PickupMember"}}

$members += $Directmembers
$members += $Pickupmembers

最后一部分只选择我感兴趣的两列,并添加一个新属性 Origin。(然后将它们组合在 $members 中)

现在,我想获取directoryuri此列表中的每个唯一值;但如果 Origin 是 DirectMember,我希望保留它,其余的被删除。

($members | Sort-Object directoryuri -Unique)

这将返回唯一条目,但不Origin考虑。

当我在 中添加 Origin 参数时Sort-Object,它们返回 2 个条目:因为它们不再彼此唯一。

我如何在 Select-Unique 时优先考虑 Origin DirectMember?

标签: powershell

解决方案


$members | 
    # Group by directoryuri
    Group-Object directoryuri | 
    ForEach-Object {
        # For each group check if an item exists with Origin = 'DirectMember' and output it
        if ($match = $_.group | Where-Object Origin -EQ 'DirectMember') {
            $match | Select-Object -First 1
        }
        # else output the other
        else {
            $_.group | Select-Object -First 1
        }
    }

推荐阅读