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

时间:2016-03-11 20:20:23

标签: arrays csv powershell foreach group-by

我已将CSV文件导入数组并按电子邮件地址对其进行分组。我希望能够在另一个ForEach循环中按名称调用该组,以便我可以向每个电子邮件地址发送一封电子邮件,其中包含$ ServerID和$ DateTime的表格。 Group-Object是开始这个​​的最佳方式吗?

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

1 个答案:

答案 0 :(得分:0)

是的,您应该使用Group-Object。我不确定你的意思"按名称呼叫小组"。如果您想根据名称选择一个组,则必须保存Group-Object的结果并搜索您的论坛,如:

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