【问题标题】:PowerShell Filter from Array based on Email separated by semi-colon, Object value in the array separated by pipePowerShell从数组中过滤基于以分号分隔的电子邮件,数组中的对象值由管道分隔
【发布时间】:2021-04-23 05:24:41
【问题描述】:

我在 PowerShell 脚本中有两个数组

Array1 - 每个对象用分号分隔。数组中的对象值具有用管道分隔的电子邮件和名称。该数组是使用 SharePoint 列表中的 PnP PowerShell 从搜索 API 检索的。

$searchAPIData = @("Bill@myDomain.com|Bill";"Paul@myDomain.com|Paul";"Mike@myDomain.com|mike";"Mark@myDomain.com|Mark";"Sam@myDomain.com|Sam")

Array 2 - 从独立列表中获取数据。每个对象用分号分隔。但是数组中的Object值有Email和User ID。

$existingDataInList = @("Bill@myDomain.com|3";"Paul@myDomain.com|2";"John@myDomain.com|5";"Mark@myDomain.com|4")

背景 - 对于每封电子邮件,我使用 yammer API 来获取用户 ID。因此,如果我过滤特定项目,而不是进行多个 API 调用,则可以减少 API 调用。我根据电子邮件进行比较。如果两个数组中的邮件相同,那么我不需要调用 API/ 或执行任何操作。

如果两个数组中的电子邮件不同,那么我需要将数据更新回 SharePoint 列表,仅针对存在于 Array1 而不是在 Array 2 中的项目。以及相反的情况,即存在于 array2 中的项目而不是数组 1 应该被删除。

在上面的例子中, -- 我需要从 Array1 中过滤/提取 "Mike@myDomain.com|mike""Sam@myDomain.com|Sam"。所以只进行了 2 次 API 调用。

-- 我需要从 Array2 中删除 "John@myDomain.com|5"

我尝试使用 Where 、-NotContains $_-Contains $_ 并没有给我想要的结果。 Where-Object 也一样。

非常感谢任何输入。提前致谢。

【问题讨论】:

    标签: arrays powershell


    【解决方案1】:

    由于要匹配的元素格式不同,请考虑构建哈希表并使用数学部分作为哈希键。像这样,

    $searchAPIData = @("Bill@myDomain.com|Bill";"Paul@myDomain.com|Paul";"Mike@myDomain.com|mike";"Mark@myDomain.com|Mark";"Sam@myDomain.com|Sam")
    $ht1 = @{}
    # Split content into two elements, use 1st as key, 2nd as value
    $searchAPIData | % { $s = $_.split('|'); $ht1.add($s[0], $s[1]) }
    
    $existingDataInList = @("Bill@myDomain.com|3";"Paul@myDomain.com|2";"John@myDomain.com|5";"Mark@myDomain.com|4")
    $ht2 = @{}
    $existingDataInList | % { $s = $_.split('|'); $ht2.add($s[0], $s[1]) }
    

    那么,这有什么好处呢?让我们看看哈希表的内容。

    PS /> $ht1
    
    Name                           Value
    ----                           -----
    Bill@myDomain.com              Bill
    Paul@myDomain.com              Paul
    Mike@myDomain.com              mike
    Mark@myDomain.com              Mark
    Sam@myDomain.com               Sam
    
    PS /> $ht2
    
    Name                           Value
    ----                           -----
    John@myDomain.com              5
    Bill@myDomain.com              3
    Paul@myDomain.com              2
    Mark@myDomain.com              4
    
    PS /> 
    

    请注意,现在电子邮件(或 UPN 很可能)采用相同的格式。其余数据设置在每个哈希表键的值中以供进一步使用。

    现在,让我们比较一下哈希表。获取哈希表的枚举器并使用它根据哈希键在另一个哈希表上查找实体。像这样,

    foreach($e in $ht1.GetEnumerator()) { 
      if(-not $ht2.containskey($e.name)) {
        write-output $("Didn't find {0} {1} from list" -f $e.name, $e.value)
      } 
    }
    Didn't find Mike@myDomain.com mike from list
    Didn't find Sam@myDomain.com Sam from list
    
    foreach($e in $ht2.GetEnumerator()) { 
      if(-not $ht1.containskey($e.name)) {
        write-output $("Didn't find {0} {1} from list" -f $e.name, $e.value)
      } 
    }
    Didn't find John@myDomain.com 5 from list
    

    【讨论】:

    • 感谢您的反馈。这行得通。不过还有一个问题。如果两者都是字符串,而不是数组,则 string1 = "Bill@myDomain.com|Bill;Paul@myDomain.com|Paul;Mike@myDomain.com|mike;Mark@myDomain.com|Mark;Sam@myDomain.com| Sam" string2 = "Bill@myDomain.com|3;Paul@myDomain.com|2;John@myDomain.com|5;Mark@myDomain.com|4" 如何在这里比较?
    • 然后通过-split ';' 将字符串转换为数组。这将为您提供一个与原始问题相同的数组。
    • 是这样想的。再次感谢您的更新:)
    猜你喜欢
    • 2016-09-05
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多