Powershell:如何处理分组对象的值?

时间:2019-02-07 01:22:02

标签: powershell email foreach

我有一个具有两列的excel列表,如下所示:

Excelfile

+--------+------------+
| File   | Email      |
+--------+------------+
| 0001   | A@mail.com |
| 0004   | B@mail.com |
| 0005   | C@mail.com |
| 0008   | B@mail.com |
+--------+------------+

我想使用PowerShell脚本向每个用户发送电子邮件,并附加与特定用户相关的所有文件。例如,userA将仅获得一个文件(c:\ temp \ 0001.pdf),而userB将获得两个附加至其电子邮件的文件(c:\ temp \ 0004.pdf和c:\ temp \ 0008.pdf),依此类推上。

我可以使用Powershell模块ImportExcel读取我的excel文件,然后按电子邮件地址对内容进行分组。而且我还可以使用其他Powershell脚本发送一封电子邮件。但是我是Powershell的新手,所以我不知道如何链接这两个代码段。任何帮助将不胜感激。

代码第1部分

$exceldata = (Import-Excel -Path "C:\Users\Administrator\Desktop\testdata.xlsx")
$groupeddata = ($exceldata | Group-Object -Property Email)

我得到的结果集如下

+-------+------------+------------------------------------------------------------------+
| Count | Name       | Group                                                            |
+-------+------------+------------------------------------------------------------------+
| 1     | A@mail.com | {@{File=0001; Email=A@mail.com}}                                 |
| 2     | B@mail.com | {@{File=0004; Email=B@mail.com}, @{File=0008; Email=B@mail.com}} |
| 1     | C@mail.com | {@{File=0005; Email=C@mail.com}}                                 |
+-------+------------+------------------------------------------------------------------+

代码第2部分

Send-MailMessage -To "B@mail.com" -From "DB Admin <dbadmin@xyx.com>" -SMTPServer smtp1.xyz.com -Subject "Monthly report" -Body "Please check attached files" -Attachments "c:\temp\0004.pdf", "c:\temp\0008.pdf"

也可以。

但是如何链接这两个代码段?因为我是Powershell脚本的初学者,所以任何帮助将不胜感激。

1 个答案:

答案 0 :(得分:0)

考虑使用类似的方法使代码正常工作。我嘲笑了您的一些数据,但是您可以看到$group就像您的$groupeddata

关键在于查看调试器中的数据结构,并弄清楚如何访问所需的成员。在每一个上使用foreach,让您对组中的每个条目进行操作。

$data = @'
File, Email
0001, A@email.com,
0004, B@email.com,
0005, C@email.com,
0008, B@email.com,
'@

$xls = $data | ConvertFrom-Csv

$group = $xls | Group -Property Email

foreach ($entry in $group)
{
    $email = $entry.Name
    $files = ($entry.Group.File | % {'c:\temp\'+$_+'.pdf'}) -join ', '

    # debugging...look at this in debugger ISE or VSCode
    "$email and $files"

    # uncomment to actually run the command...
    #Send-MailMessage -To $email -From "DB Admin <dbadmin@xyx.com>" -SMTPServer smtp1.xyz.com -Subject "Monthly report" -Body "Please check attached files" -Attachments $files
}