繁体   English   中英

使用 powershell 匹配比较多个 email 地址

[英]Comparing multiple email address using powershell match

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

比如他的代码:

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"
    }

我需要做的是获取匹配以检查它是两部分还是三部分 email 地址。 @consultant.mycompany.com 或 @mycompany.com。

对此 PowerShell 新手的任何见解将不胜感激。

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

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

它能做什么...

  • 构建 email 地址列表进行测试
    你会从你的源代码中得到它......只要确保它们是纯字符串,而不是 object 属性中的字符串。
  • 建立一个域列表
  • 使用内置的正则表达式转义方法在需要时转义点之类的东西
  • 在每个转义字符串的末尾添加一个$以将模式锚定到 email 地址的末尾
  • 使用转义字符串构建该列表的正则表达式 OR
  • 遍历 email 地址列表并获取与域列表项之一匹配的地址列表
  • 将匹配项保存到 $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

output...

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

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

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM