簡體   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