【问题标题】:pscustomobject: delete unique, keep duplicatespscustomobject:删除唯一的,保留重复的
【发布时间】:2022-11-03 00:40:02
【问题描述】:

我编写了一个脚本,用于提取 WS2012 AD 中的所有重复电子邮件。

该脚本在pscustomobject 中包含所有具有重复电子邮件的用户

现在我想要实现的是删除第一个唯一的电子邮件条目并保留所有重复的电子邮件条目,这样我就可以为重复的电子邮件条目构建虚拟电子邮件,只留下第一个唯一的电子邮件条目,这样 AD 中的每个用户都可以拥有一个唯一的电子邮件即使它是一个虚拟电子邮件。

这是导出到 CSV 的 pscustomobject 的示例:

Name     Telephone    Email     Department

Max Smith 12345 max@gmail.com Billing
Max Jones 6789 max@gmail.com Facility
James Adams 52585 james@outlook.com Import
James Jones 46844 james@outlook.com Service
James Bones 68315 james@outlook.com Management

我需要从上面构建的是:

Name     Telephone    Email     Department

Max Jones 6789 max@gmail.com Facility
James Jones 46844 james@outlook.com Service
James Bones 68315 james@outlook.com Management

第一个电子邮件条目消失了,所有重复的邮件仍然存在。

虚拟电子邮件将是 phoneNumber@company.com,例如 James Jones 的 46844@microsoft.com

在没有第一封唯一电子邮件且仅包含重复邮件的情况下,我一直无法构建pscustomobject

我希望 Stack Overflow 的向导可以帮助我。

感谢你并致以真诚的问候。

【问题讨论】:

    标签: powershell powershell-5.0 pscustomobject


    【解决方案1】:

    为了只“保留重复”,您需要跟踪您之前已经看到的电子邮件地址。

    为此,我建议使用 HashSet<string> - 一个集合只包含不同的值,并且是非常快首先确定给定值是否已经是集合的成员-非常适合此用例。

    在下文中,我假设$data 包含pscustomobjects 的数组,如问题中所述

    $alreadySeen = [System.Collections.Generic.HashSet[string]]::new()
    
    $duplicatesOnly = $data |Where-Object { -not $alreadySeen.Add($_.Email) }
    
    $duplicatesOnly |Export-Csv path	ooutput.csv
    

    第一次向集合添加唯一值时,Add() 将返回 $true,但随后尝试添加相同值将返回 $false - 这意味着我们的 Where-Object 过滤器将仅过滤具有 @987654329 的对象@ 列之前已经至少出现过一次。

    如果电子邮件没有统一大小写,请在创建哈希集时提供不区分大小写的字符串比较器:

    $alreadySeen = [System.Collections.Generic.HashSet[string]]::new([System.StringComparer]::InvariantCultureIgnoreCase)
    

    【讨论】:

    • 谢谢你的回答。我试过你的方法。它确实有效,但区分大小写。 Max.Jones@gmail.commax.jones@gmail.com 等重复项不会被识别为重复项。你有解决方法吗?
    • @Zombievirus 是的,这很容易解决,我已经更新了答案:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-28
    • 1970-01-01
    • 2016-09-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多