【问题标题】:Comparing multiple email address using powershell match使用PowerShell匹配比较多个电子邮件地址
【发布时间】:2020-05-15 04:59:00
【问题描述】:

我有一个包含 2000 个电子邮件地址的 CSV 文件。我正在使用 PowerShell 检查用户是否在 AD 中处于活动状态。另一位开发人员为我编写了一个 PowerShell 脚本来执行此操作,但他只使用主域来匹配电子邮件格式,他没有添加它可能具有的子域。我们的一些电子邮件地址在 @ 符号后有一个由 3 部分组成的电子邮件地址。

比如他的代码:

foreach ($user in $users) {
    Write-Host $user.email
    if ($user.email -match "\@mycompany\.com$") {
        $status = "NOT FOUND"
        # loop through possible AD domains until there is a hit
        foreach ($domain in "na","au","eu","as") {
            if ($status -eq "NOT FOUND") {
                Write-Host "  $($domain)" -NoNewline
                $status = Get-UserFromEmail -EMail $user.email -ADDomain $domain
                Write-Host $status
            }
            else {
                break
            }
        }
        Write-Host
        Add-Content -Path $outcsv -Value "$($user.email),$($user.type),`"$($status)`""
    }
    else {
        Add-Content -Path $outcsv -Value "$($user.email),$($user.type),NOT MYCOMPANY"
    }

我需要做的是获取匹配以检查它是由两部分还是三部分组成的电子邮件地址。 @consultant.mycompany.com 或 @mycompany.com。

对于这个 PowerShell 新手的任何见解将不胜感激。

【问题讨论】:

  • 这真的需要在 PoSh v2 上工作吗?
  • 我不知道,我是 powershell 的新手。该代码适用于单域电子邮件,但我不知道是否可以添加某种“或”语句来添加子域。
  • 如果您不需要 PoSh v2,请删除该标签。许多人会忽略您的问题,因为我们大多数人不再拥有任何带有 psv2 的系统 ...
  • 谢谢,已删除。
  • 不客气!很高兴能帮上一点忙。 [grin] 我发布了一个答案,似乎涵盖了你在做什么的基本想法。看看这个想法是否符合您的需求......

标签: powershell


【解决方案1】:

这是测试多个电子邮件域的成员资格的一种方法。所有域都在同一个example.com 中,但它们很容易在testing.comwizbang.org 中。

这演示了这个想法,我想你可以根据需要将它插入到你的脚本中。 [咧嘴一笑]

它的作用......

  • 构建要测试的电子邮件地址列表
    你会从你的源代码中得到它......只要确保它们是纯字符串,而不是对象属性中的字符串。
  • 建立域列表
  • 使用内置的正则表达式转义方法在需要时转义点等内容
  • 在每个转义字符串的末尾添加一个$,以将模式锚定到电子邮件地址的end
  • 使用转义字符串构建该列表的正则表达式 OR
  • 遍历电子邮件地址列表并获取与域列表项之一匹配的地址
  • 将匹配项保存到 $Var
  • 在屏幕上显示 $Var 的内容

代码...

$EmailList = @(
    'ABravo@example.com'
    'BCharlie@more.example.com'
    'CDelta@example.com'
    'DEcho@zigzag.papers.com'
    'EFoxtrot@even.more.example.com'
    )

$DomainList = @(
    '@example.com'
    '@more.example.com'
    '@even.more.example.com'
    )
$Regex_DL = $DomainList.ForEach({
    [regex]::Escape($_) + '$'
    }) -join '|'

$ValidEmailAddressList = $EmailList -match $Regex_DL

$ValidEmailAddressList

输出...

ABravo@example.com
BCharlie@more.example.com
CDelta@example.com
EFoxtrot@even.more.example.com

【讨论】:

  • 非常好 - 不要忘记在最后的 $Regex_DL 中匹配 $(字符串结尾)!
  • @MathiasR.Jessen - 噢噢!感谢您的提醒……我完全忘记了在 TLD 之后可能还有更多。 [blush] 关闭以修复它...
  • @MathiasR.Jessen - 我刚刚在转义字符串的末尾做了一个+ '$'。你的更漂亮,寿。 [咧嘴]
【解决方案2】:

您始终可以使用-or 运算符在if 条件内链接多个表达式:

if ($user.email -match "\@mycompany\.com$" -or $user.email -match '@consultant\.mycompany\.com$'){
  # ...
}

或者,您可以构建一个匹配两者的正则表达式模式:

if($user.email -match '@(?:consultant\.)?mycompany\.com$'){
  # ...
}

如果您不确定如何在正则表达式中转义文字字符串,请使用[regex]::Escape()

PS C:\> [regex]::Escape('@consultant.mycompany.com')
@consultant\.mycompany\.com

【讨论】:

  • 谢谢大家的帮助。我昨晚运行了我的脚本,它产生了奇迹。我使用了 Mathias 建议的正则表达式模式匹配。我检查谁在我们公司的点击率上升了 %30,因为它得到了顾问。
猜你喜欢
  • 2013-04-18
  • 1970-01-01
  • 1970-01-01
  • 2016-03-20
  • 2012-08-29
  • 1970-01-01
  • 1970-01-01
  • 2014-12-26
  • 2014-07-12
相关资源
最近更新 更多