如何编写PowerShell脚本监控文件夹新增文件并定时发送提醒邮件
PowerShell 文件夹监控邮件通知脚本补全优化方案
完整可运行代码
# 配置参数 $SMTPServer = "EMAIL SERVER (ip)" $SMTPPort = "111" $Username = "SENDER@EMAIL.COM" $Password = "你的发件邮箱授权码/密码" # 如需身份验证请填写 $path = "C:\ROOT\BUSINESS\" $scanIntervalMinutes = 15 # 扫描间隔,和计划任务执行周期保持一致 $to = "test1@gmail.com" $cc = "test2@gmail.com" $subject = "[$(Get-Date -Format 'yyyy/MM/dd HH:mm')] 业务文件夹新增文件提醒" # 扫描指定路径下所有子文件夹的新增文件(只统计文件,排除文件夹) $newFiles = Get-ChildItem -Path $path -Recurse -File | Where-Object { $_.LastWriteTime -ge [datetime]::Now.AddMinutes(-$scanIntervalMinutes) } if ($newFiles.Count -gt 0) { # 拼接邮件正文内容 $mailBody = "过去15分钟内共检测到 $($newFiles.Count) 个新增文件,清单如下:`r`n`r`n" foreach ($file in $newFiles) { $mailBody += "$($file.Name) uploaded to $($file.DirectoryName)`r`n" } # 初始化邮件对象 $message = New-Object System.Net.Mail.MailMessage $message.Subject = $subject $message.To.Add($to) $message.CC.Add($cc) $message.From = $Username $message.Body = $mailBody # 初始化SMTP客户端 $smtp = New-Object System.Net.Mail.SmtpClient($SMTPServer, $SMTPPort) $smtp.EnableSSL = $true # 如需SMTP身份验证请取消下行注释,并填写上方的$Password变量 # $smtp.Credentials = New-Object System.Net.NetworkCredential($Username, $Password) # 发送邮件 $smtp.Send($message) Write-Host "[$(Get-Date -Format 'yyyy/MM/dd HH:mm:ss')] 邮件发送成功,共上报 $($newFiles.Count) 个新增文件" } else { Write-Host "[$(Get-Date -Format 'yyyy/MM/dd HH:mm:ss')] 过去15分钟内未检测到新增文件,无需发送邮件" }
核心优化/补全点
- 修复原代码语法错误:为
SMTPServer变量补全$前缀,修正变量引用规范 - 新增子文件夹扫描能力:
Get-ChildItem添加-Recurse参数实现全路径遍历,添加-File参数只统计文件、排除文件夹干扰 - 补全邮件正文生成逻辑:按照要求的格式拼接每一个新增文件的名称和对应存储路径,同时在开头新增总数统计便于快速查看
- 优化邮件标题:添加时间戳便于识别每一次通知的扫描时段
- 新增无新增文件时的逻辑分支:避免空邮件发送,同时输出执行日志便于排查计划任务执行情况
- 新增身份验证配置提示:如果你的SMTP服务器需要身份验证,直接填写密码变量、取消注释凭据行即可使用
计划任务配置注意事项
- 计划任务的执行周期设置为15分钟,和脚本内的
$scanIntervalMinutes参数保持一致,避免漏统计或重复统计 - 计划任务的执行用户需要拥有
C:\ROOT\BUSINESS路径的读取权限,以及网络访问SMTP服务器的权限 - 可以配置计划任务的"操作"参数为
powershell.exe -ExecutionPolicy Bypass -File "你的脚本保存的完整路径.ps1",避免执行策略限制导致脚本运行失败
内容的提问来源于stack exchange,提问作者PshellUser
相关产品推荐
相关产品推荐

