Arrays 在ForEach循环中按名称调用组对象

Arrays 在ForEach循环中按名称调用组对象,arrays,csv,powershell,foreach,group-by,Arrays,Csv,Powershell,Foreach,Group By,我已将CSV文件导入数组,并按电子邮件地址对其进行分组。我希望能够在另一个ForEach循环中按名称调用该组,这样我就可以向每个电子邮件地址发送一封电子邮件,其中包含与之关联的$ServerID和$DateTime表。组对象是开始这项工作的最佳方式吗 在CSV文件中,一个电子邮件地址可以与多个服务器关联,但一个服务器仅与一个电子邮件地址关联。文件中的值将不断更新,因此几乎所有对象都需要动态变量 $csv = import-csv "C:Example.csv" $array = @() Fo

我已将CSV文件导入数组,并按电子邮件地址对其进行分组。我希望能够在另一个ForEach循环中按名称调用该组,这样我就可以向每个电子邮件地址发送一封电子邮件,其中包含与之关联的$ServerID和$DateTime表。组对象是开始这项工作的最佳方式吗

在CSV文件中,一个电子邮件地址可以与多个服务器关联,但一个服务器仅与一个电子邮件地址关联。文件中的值将不断更新,因此几乎所有对象都需要动态变量

$csv = import-csv "C:Example.csv"

$array = @()

ForEach ($server in $csv) {

        $object = New-Object PSObject -Property @{"Email"= $server.Email; "ServerID" = $server.ServerID; "DateTime" = $server.DateTime}

        $array += $object}

$array | Group-Object Email


Count      Name                                 Group

2       A@gmail.com     {@{PG_Email=A@gmail.com; ServerID=333; Lease_End=10/10/15}, @{PG_Email=A@gmail.com; ServerID=111; Lease_End=12/12/15}}                                                               
1       B@gmail.com     {@{PG_Email=B@gmail.com; ServerID=222; Lease_End=09/09/15}}    

是的,您应该使用
组对象
。我不知道你说的“点名”是什么意思。如果要根据名称选择一个组,则必须保存
组对象
的结果,并搜索您的组,如:

$groups = $array | Group-Object Email
$selectedmail = "B@gmail.com"
$groups | Where-Object { $_.Name -eq $selectedmail }
也可以将组保存在哈希表中:

#Create hashtable
$ht = @{}
#Fill hashtable with groups (email as key/ID)
$array | Group-Object Email | ForEach-Object { $ht[$_.Name] = $_.Group }

$selectedmail = "B@gmail.com"
#Get objects for selected mail
$ht[$selectedmail]
如果你要给每个人发邮件,我会简化为:

Import-Csv "C:\Example.csv" |
Group-Object Email |
ForEach-Object {
    $to = $_.Name

    #Get table of ServerID + Lease_End as string to send as mailbody
    $mailbody = $_.Group | Format-Table -Property ServerID, Lease_End -AutoSize | Out-String

    #You could also create a HTML-table with:
    $htmlbody = $_.Group | Select-Object -Property ServerID, Lease_End | ConvertTo-HTML -Property Name, Length

    #Send mail
    #Send-MailMessage -To $to -Subject "Lease-status" -Body $mailbody -From "mysupersecret@mail.com"
}

弗罗德,谢谢你的详细答复。是的,我所说的“按名称调用组”是指按照您的猜测进行保存和搜索。只要$selectedemail是动态的,您的第一个解决方案就应该工作得很好。我是否会从CSV中创建一个单独的不同电子邮件地址数组以进行循环?相信我,我希望这封邮件可以发送给每个人,但不幸的是,它要求每个人单独发送电子邮件。感谢您的耐心-我几周前刚开始使用Powershell。我不确定如果您不打算发送给所有人,为什么需要循环数组(循环通常意味着您没有特定的数组或不知道要发送给谁)。无论如何。您不需要创建另一个数组。您可以使用
$groups.Name
$ht.keys
,具体取决于列出所有电子邮件所使用的解决方案。变量总是动态的(在代码中更改它,用函数参数替换它等等),这就是为什么我使用变量,使代码取决于变量而不是一个特定的地址。:-)有道理。谢谢你,弗罗德!没问题。当你决定时,记得标记正确答案,这样问题就可以“关闭”