在PowerShell中将新创建的对象从一个列表添加到另一个列表

时间:2017-04-05 08:50:18

标签: powershell email

我有一个脚本,当文件超过最大设置大小时会发送电子邮件。

我的所有文件都来自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个单独的电子邮件。

如何在列表中封装每个超出的文件,之后只发送一封电子邮件?

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 }