Powershell从CSV编译所有匹配的行

时间:2013-09-17 19:25:27

标签: powershell csv

我有一个CSV文件,其中包含用户列表以及使用这些标头管理的人员:
显示名称,别名,CA5,的ManagedBy

我想在powershell中导入此列表,并能够向每个经理发送一封电子邮件,其中包含他们被列为managedby字段中的经理的帐户列表(DisplayName,Alias,CA5)。我可以创建没有问题的电子邮件,我需要知道如何编译CSV文件的所有行,这些行应该全部转到同一封电子邮件中。使用下面的示例CSV,我最终会收到三封电子邮件(ManagedByA,ManagedbyB和ManagedByC各一封)。发送给ManagedByA的电子邮件将包含三行:

DN1 A1
DN2 A2 DL
DN3 A3

我的CSV看起来像这样:

    DisplayName,Alias,CA5,ManagedBy
    DN1,A1,,ManagedByA
    DN2,A2,DL,ManagedByA
    DN3,A3,,ManagedByA
    DN4,A4,,ManagedByB
    DN5,A5,,ManagedByB
    DN6,A6,DL,ManagedByB
    DN7,A7,,ManagedByB
    DN8,A8,,ManagedByC
    DN9,A9,DL,ManagedByC
    DN10,A10,,ManagedByC

我的代码(来自Mathias R. Jessen):

$Import = Import-CSV "C:\powershell\DL\Reports\DLReportEmail.csv"

### Find unique ManagedBy
$Managers = $Import | Sort-Object -Property ManagedBy -Unique

ForEach ($Manager in $Managers){
   $Employees = $Import | Where-Object {$_.ManagedBy -eq $Manager.ManagedBy}

   $Body = "DearXXXX,  `r`n"
   ForEach($Employee in $Employees){
       $Alias = $Employee.Alias
       $DisplayName = $Employee.DisplayName
       $CA5 = $Employee.CA5
       $Body += "$DisplayName : $Alias : $CA5  `r`n"
       }
   $Body += "`r`n"
   $Body += "Thanks"

1 个答案:

答案 0 :(得分:1)

您可以导入csv,提取每个唯一的管理器名称,然后使用您已经提取的ManagedBy值编译列表的子集:

$Users = Import-Csv C:\filename.csv
$Managers = $Users | Sort-Object -Property ManagedBy -Unique

for($Manager in $Managers)
{
    $Employees = $Users |Where-Object {$_.ManagedBy -eq $Manager.ManagedBy}
    // send your email here with the contents of $Employees
}