PowerShell中Select-String匹配成功时如何正确退出Do-Until循环
问题根因
- 匹配到Idle模式的代码分支中,你写的
#{break}被注释且额外包裹了多余的大括号,没有实际执行退出逻辑 $TimeNow变量仅在未匹配到Idle的else分支中赋值,一旦触发Idle匹配分支,$TimeNow不会更新,Until终止条件永远无法满足,导致循环持续运行- 超时告警邮件发送后也没有添加退出逻辑,发完邮件脚本仍然会继续循环
修正后的完整脚本
$File = "AutoDE45oService_AP.$(get-date -Format yyMMdd).log" # 初始化循环时间参数 $TimeStart = Get-Date $TimeEnd = $timeStart.addminutes(60) Do { # 每次循环先更新当前时间 $TimeNow = Get-Date # 检测日志末尾是否匹配Idle完成标识 if (Get-Content $File -Tail 1 | Select-string -Pattern "Idle" -Quiet) { $Subject = "Test - MHC AutoDE AP completed at $(Get-Date)" $Body = "IDLE FOUND" Send-MailMessage -smtpserver "$SMTPServer" -from "$EmailFrom" -to "$EmailTo" -subject "$Subject" -bodyAsHtml "$Body" -credential $anonCredentials # 发送完成邮件后直接退出循环,若需直接结束整个脚本可替换为exit break } else { if ($TimeNow -ge $TimeEnd) { $runtime = 'Duration: {0:mm} min {0:ss} sec' -f ($TimeNow-$TimeStart) $Subject = "Test - MHC AutoDE AP incomplete after $runtime at $(Get-Date)" $Body = "PROBLEM TO REPORT" Send-MailMessage -smtpserver "$SMTPServer" -from "$EmailFrom" -to "$EmailTo" -subject "$Subject" -bodyAsHtml "$Body" -credential $anonCredentials # 发送超时告警邮件后直接退出循环 break } } Start-Sleep -Seconds 10 } Until ($TimeNow -ge $TimeEnd)
关键改动说明
- 移除了break语句的注释和多余大括号,匹配到Idle发送邮件后直接跳出Do-Until循环,若需要直接结束整个脚本可以把break替换为
exit - 把
$TimeNow = Get-Date移到循环最开始,每次循环都会更新时间,避免变量未赋值导致终止条件失效 - 超时告警逻辑发送邮件后也添加了break语句,两种邮件触发场景都可以正常退出循环
内容的提问来源于stack exchange,提问作者Configueroa
相关产品推荐
相关产品推荐

