首页 > 解决方案 > Get-ADUser 帐户名称,其电子邮件地址与 csv 文件中指示的任何电子邮件匹配

问题描述

我有一个逗号分隔的 csv 文件,如下所示(第一行是标题):

category;email.1;email.2;email.3;email.4;email.5;email.6
category1;sample@gmail.com;;;;;
category2;;;sample2@gmail.com;;;
category3;;sample3@gmail.com;;sample44@hotmail.com;;sample55@gmail.com

等等...

现在我导入它:

$emails = Import-CSV -Encoding Default -Delimiter ";" "c:\temp\myFile.csv"

最后,对于 csv 中的每一行,我想获取其电子邮件地址与 email.1 到 email.6 中的任何一个匹配的 AD 用户帐户名

所以我尝试使用 foreach 循环,但我不知道必须在其中放入什么才能得到我想要的。

$emails | foreach {
    $userAccountName = Get-ADUser -filter {something}
    # do some stuff with $userAccountName
}

注意:我想要一个通用解决方案,考虑到将来按类别分类的电子邮件可能超过 6 封。还要考虑到该类别的某些电子邮件可能为空。

标签: powershellactive-directory

解决方案


导入后,您可以枚举与模式匹配的标头

$emails = Import-CSV -Encoding Default -Delimiter ";" "c:\temp\myFile.csv"
$EmailHeaders = ($Emails[0].psobject.Properties|Where-Object Name -like 'email.*').Name

自动取款机返回:

> $EmailHeaders
email.1
email.2
email.3
email.4
email.5
email.6

嵌套 foreachs 以迭代每行填充的电子邮件。
Get-ADUser 注释掉以进行测试

foreach($Row in $Emails){
  foreach($EmailHeader in $EmailHeaders){
    if($Email=$Row.$EmailHeader){
      [PSCustomObject]@{
        Category      = $Row.Category
        Email_x       = $EmailHeader
        Email         = $Email
        SamAccountName= $Null #(Get-ADUser -Filter {EmailAddress -eq "$Email"} -Properties SamAccountName).SamAccountName
      }
    }
  }
}
Category  Email_x Email                SamAccountName
--------  ------- -----                --------------
category1 email.1 sample@gmail.com
category2 email.3 sample2@gmail.com
category3 email.2 sample3@gmail.com
category3 email.4 sample44@hotmail.com
category3 email.6 sample55@gmail.com


推荐阅读