我有一个脚本,当文件超过最大设置大小时会发送电子邮件。
我的所有文件都来自XML文件,它总结了路径和最大大小。
我所做的foreach
检查每个尺寸(并查看它是否超过最大尺寸)如下所示:
foreach ($item in $list)
{
if($item.Size -gt $item.TriggerSize -And (Test-Path $item.Path))
{
$body =
"The file " + $item.Name + " is reaching his max size!
<br /><br /> Current size: "+$item.Size.ToString(".00") + " " + $byteSize.Substring(1) +
"<br /> Maximum size: " + $item.MaxSize + " " + $byteSize.Substring(1)
Send-MailMessage -port 587 -From $from -BodyAsHtml -Encoding $enc -To $to -Subject $subject -Body $body -UseSsl -Credential $credentials
}
}
代码运行正常,我收到的电子邮件如下:
文件editix2017.exe达到了他的最大尺寸!
当前尺寸:84.93 Mb
最大尺寸:100 Mb
但问题是,当我使用多个文件时,它会为每个超出其最大限制的文件发送一封电子邮件。
这意味着如果我有2个超过其最大尺寸的文件,它会发送2个单独的电子邮件。
如何在列表中封装每个超出的文件,之后只发送一封电子邮件?
答案 0 :(得分:3)
每次使用$body +=
将文字添加到$body
字符串,然后将Send-MailMessage
移到循环之外,这样它只会在评估每个文件后发送电子邮件:
foreach ($item in $list)
{
if($item.Size -gt $item.TriggerSize -And (Test-Path $item.Path))
{
$body += "The file $($item.Name) is reaching his max size!<br />
Current size: $($item.Size.ToString(".00")) $($byteSize.Substring(1))<br />
Maximum size: $($item.MaxSize) $($byteSize.Substring(1))<br /><br />"
}
}
Send-MailMessage -port 587 -From $from -BodyAsHtml -Encoding $enc -To $to -Subject $subject -Body $body -UseSsl -Credential $credentials
编辑:我已经更新了构造$body
以使用子表达式$()
的方式,因为它们只返回对象的属性,使得字符串构造更加简单。
答案 1 :(得分:3)
这可能会这样做(未经测试)。它将$ body定义为一个空字符串,然后我们在循环中使用有关文件的消息递增,然后我将send-mailmessage移动到循环之外,以便我们在最后执行它,但仅当$ body有内容:
$body = ""
foreach ($item in $list)
{
if($item.Size -gt $item.TriggerSize -And (Test-Path $item.Path))
{
$body +=
"The file " + $item.Name + " is reaching his max size!
<br /><br /> Current size: "+$item.Size.ToString(".00") + " " + $byteSize.Substring(1) +
"<br /> Maximum size: " + $item.MaxSize + " " + $byteSize.Substring(1) + "<br /><br />"
}
}
If ($body) { Send-MailMessage -port 587 -From $from -BodyAsHtml -Encoding $enc -To $to -Subject $subject -Body $body -UseSsl -Credential $credentials }