【问题标题】:Compare Two Arrays, Email Results in PowerShell比较两个数组,在 PowerShell 中发送电子邮件结果
【发布时间】:2021-01-14 16:09:24
【问题描述】:

我试图比较两个数组:一个包含用户名列表(动态,有时更多用户名,有时更少),另一个包含文件名列表(也是动态的)。每个文件名都包含用户名和其他文本,例如“用户名报告 [日期].xlsx”。目标是匹配数组 A 和数组 B 之间的元素。

数组 A 只是用户名。 包含在 $Username 中的数组 A 的输出只是: 人A 人B 人C 等等……

Array B 包含文件路径,但我可以将其缩小为像 $ArrayB.Name 这样的文件名(完整路径是 $ArrayB.FullName)。 Array B 的命名格式为“用户名报告[日期].xlsx”。

$LatestFiles.Name(文件名)中包含的数组 B 的输出是: PersonA 报告 1-1-21.xlsx PersonB 报告 1-1-21.xlsx PersonC 报告 1-1-21.xlsx

匹配后,如果数组A中的元素匹配数组B中的元素,则将ArrayB.FullName附加到相应的用户名+“@domain.com”。

很遗憾,我什至无法让匹配正常工作。

我试过了:

foreach ($elem in $UserName) { if ($LatestFiles.Name -contains $elem) { "there is a match" } }

foreach ($elem in $UserName) {
    if($LatestFiles.Name -contains $elem) {
        "There is a match"
    } else {
        "There is no match"
    }
}

还有几个不同的变体,但我无法让它们输出匹配项。感谢您提供任何帮助。

【问题讨论】:

  • $LatestFiles |Where Name -eq $elem$LatestFiles获取相关元素
  • 用它来代替我所拥有的,但不幸的是它没有用。
  • 抱歉,不够清晰,您需要将它放在foreach 循环内(因为它引用$elem
  • 没问题,我已经假设了很多哈哈。如果我用您的建议替换 foreach 循环中的“$LatestFiles.Name -contains $elem”,它不会输出任何内容。同样,如果我用您的建议替换整个“if 语句”,输出也是空白的。如果有关数组的信息不够清楚,我可以添加更多信息。再次感谢。
  • 重新阅读帖子,然后你会想要... |Where Name -like "${elem}*" - 这样它会测试文件名的值$elem

标签: arrays powershell string-comparison


【解决方案1】:

为什么你不能得到匹配的简短回答: -Contains 用于将值与集合匹配,而不是 String。您最好使用-Like 作为比较运算符。或者,至少,您可能会尝试查看文件的名称,而不仅仅是包含用户的名称部分,是否在用户名的集合中。

听起来你不是在简单地比较数组,而是更复杂的事情是你如何处理两个匹配的元素。

$LatestFiles |
    ForEach-Object {
        # first, let's take the formatted file name and make it more usable
        $fileName = $_.BaseName -split ' ' # BaseName over Name so that it strips the extension
        Write-Output @{
            User = $fileName[0]
            Date = $fileName[2]
            File = $_
        }
    } -PipelineVariable FileData |
    # next, only accept valid users
    Where-Object User -In $UserName |
    # note that we don't need the value from $UserName because we already have it in $FileData.User (what we matched)
    ForEach-Object {
        # finally do your thing with it.
        $userWithDomain = "$($FileData.User)@domain.com"
        Write-Output $userWithDomain # or whatever you want
    }

【讨论】:

  • 谢谢。这教会了我很多东西,包括对此非常有用的 -PipelineVariable。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-24
  • 1970-01-01
  • 1970-01-01
  • 2010-09-25
  • 2012-06-15
  • 1970-01-01
相关资源
最近更新 更多