我已将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}}
答案 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"
}