我之前发布过此脚本并提供了一些帮助,但后来将其删除以避免混淆。我几乎使用了一个例外。发送给每个管理器的电子邮件的内容仅包括阵列中最后一个直接报告的数据。我需要重构脚本吗?如果我有一个,我觉得我正在追逐我的尾巴:)
编辑:我添加了推荐的更改,但现在我得到了:
决议:感谢TheMadTechnician。修改+ =并将$ body移动到循环中的正确位置是关键。
我的脚本更新了脚本:
Import-Module -Name ActiveDirectory
$today = (Get-Date).ToString()
# Html
$a = "<style>"
$a = $a + "BODY{background-color:Lavender ;}"
$a = $a + "TABLE{border-width: 1px;border-style: solid;border-color: black;border-collapse: collapse;}"
$a = $a + "TH{border-width: 1px;padding: 5px;border-style: solid;border-color: black;background-color:thistle}"
$a = $a + "TD{border-width: 1px;padding: 5px;border-style: solid;border-color: black;background-color:PaleGoldenrod}"
$a = $a + "</style>"
# Email Variables
$smtp = "192.168.1.1"
$to = "User@Company.com"
$from = "User@company.com"
$subject = "Managers - Direct Report's Group Membership"
$managers = Get-ADUser -Filter * -Properties name, directreports, EmailAddress | where {$_.directreports -ne $Null}
foreach ($i in $managers)
{
$mgrname = $i.Name
$mgremail = $i.EmailAddress
$dreports = $i.directreports
$body = "Report Date $today ."
$body = "`n"
$body = "<H3>The direct reports for $mgrname<H3>"
foreach ($d in $dreports)
{
$user = get-aduser $d -properties *
$mems = $user.memberof -replace '^CN=(.+?),(?:OU|CN)=.+','$1' | %{New-Object PSObject -Property @{'Group Membership'=$_}} | convertTo-html -Head $a -Body "<H2>Group Membership.</H2>"
$dreport = $d -replace '^CN=(.+?),(?:OU|CN)=.+','$1'
$body += "`n"
$body += "<H3>Direct Report: $dreport</H3>"
$body += "`n"
$body += $mems
$body += "`n"
}
Send-MailMessage -SmtpServer $smtp -To $to -From $from -Subject $subject -Body $body -BodyAsHtml
}
答案 0 :(得分:1)
这一行:
$ body =&#34;报告日期$ today。&#34;
重置每个直接报告的$ body变量。所以当你到达Send-MailMessage时,你所拥有的只是最后一次直接报告。
尝试将该行移动到遍历直接报告的foreach循环上方。
答案 1 :(得分:1)
好的,这个问题的解决方法是将大部分电子邮件生成移到ForEach($ d in $ dreports)循环之外。标题部分($ Body =&#39;报告为$ today&#39;以及以下两行)已向上移动,实际发送邮件的行已在循环外移动。我认为更新的代码已经在OP中了,所以我再也不用重新发布它了。
答案 2 :(得分:0)
假设您要将所有报告作为单独的电子邮件发送给所有经理,请在报告Send-MailMessage
循环内移动foreach
来电。
或者,如果您要向每位经理发送一封包含所有报告的电子邮件,请在报告循环之外声明$body
并将循环中的第一个分配更改为“$ body + =&#34;报告日期$今天。&#34;
答案 3 :(得分:0)
foreach ($d in $dreports)
的每次迭代都会重置$body
。改变行
$body = "Report Date $today ."
到
$body += "Report Date $today ."