求助:优化基于当前日期扫描特定扩展名文件的PowerShell脚本
嘿,这就帮你把脚本优化好,完全匹配你的需求~
优化后的PowerShell脚本
我调整了逻辑,让脚本能精准检查当日日期的子文件夹,以及里面的指定扩展名文件,只有当两种异常情况出现时才发送告警邮件:
# 定义基础路径和需要扫描的目标文件扩展名 $basePath = "\\Good\Morning\America" $targetExtensions = @(".abc", ".def") # 获取当日日期,格式化为和你子文件夹一致的yyyyMMdd格式 $todayDate = Get-Date -Format "yyyyMMdd" # 安全拼接出当日的目标子文件夹路径(避免手动拼路径出问题) $targetFolder = Join-Path -Path $basePath -ChildPath $todayDate # 初始化告警标记和消息 $needAlert = $false $alertMessage = "" # 第一步:检查当日子文件夹是否存在 if (-not (Test-Path -Path $targetFolder -PathType Container)) { $needAlert = $true $alertMessage = "当日日期的子文件夹不存在:<br><b>$targetFolder</b>" } else { # 第二步:检查文件夹内是否有指定扩展名的文件 $targetFiles = Get-ChildItem -Path $targetFolder -File -Include $targetExtensions -ErrorAction SilentlyContinue if (-not $targetFiles) { $needAlert = $true $alertMessage = "子文件夹存在,但未找到指定扩展名($($targetExtensions -join ', '))的文件:<br><b>$targetFolder</b>" } } # 只要触发了任一异常,就发送告警邮件 if ($needAlert) { # 注意:$cred需要提前定义,比如手动获取:$cred = Get-Credential -Message "输入SMTP服务器凭据" Send-MailMessage -To "car.one@outlook.com","car.two@gmail.com","car.three@yahoo.com" ` -From "Outbound@yahoo.com" ` -SmtpServer Smtp.office365.com ` -Port 587 ` # Office365 SMTP默认端口,加上更稳妥 -Subject "文件检查异常通知" ` -BodyAsHtml ` -Body "<p>$alertMessage</p>" ` -UseSSL ` -Credential $cred }
关键优化点说明
- 路径安全拼接:用
Join-Path代替手动拼接路径,避免因特殊字符或格式错误导致的路径识别问题 - 精准检查逻辑:分两步判断异常,分别给出明确的告警消息,方便你快速定位问题
- 文件筛选更严谨:
Get-ChildItem加上-File参数,确保只扫描文件而不会把文件夹误判进去 - 代码可读性提升:用标记变量
$needAlert统一控制邮件发送逻辑,后续扩展需求也更方便
注意事项
- 确保
$cred变量已正确获取(如果是自动化运行,可以考虑用存储的凭据,避免每次手动输入) - 测试时可以把
$todayDate改成已存在的子文件夹日期(比如"20180114"),验证脚本的判断逻辑是否正确
内容的提问来源于stack exchange,提问作者Almost Awesome
相关产品推荐
相关产品推荐

