PowerShell的条件与循环是远程巡检脚本实现自动化的核心,通过foreach遍历主机列表并调用Invoke-Command执行远程检查,结合try/catch处理连接异常,再用if/elseif对返回结果做阈值判断实现智能响应。
powershell 的条件与循环不是语法练习,而是远程巡检脚本真正“动起来”的关键。它们让脚本能批量处理多台机器、对每台机器的每一项指标做独立判断、按结果自动分类响应——而不是手动一台台敲命令。
用 foreach 遍历目标计算机列表
远程巡检的第一步是把要检查的机器列出来,然后逐台执行检查逻辑。这不是靠复制粘贴,而是用 foreach 自动完成:
- 把主机名或IP存进数组:
$Computers = "SRV-DB01", "SRV-WEB02", "192.168.10.5" - 用 foreach 调用远程命令(如
Invoke-Command):foreach ($comp in $Computers) { Invoke-Command -ComputerName $comp -ScriptBlock { Get-Service WinRM } } - 支持跳过不可达主机:在
Invoke-Command外加try/catch,捕获连接失败不中断整个流程
用 if/elseif 判断每台机的巡检结果
单台机器返回的数据必须被“读懂”,不能只看是否成功执行,而要看值是否异常。条件语句就是做这个判断的:
在 Windows 11 上"直接发声"的 TTS(从 WSL2/TUI 调用 powershell.exe + System.Speech)。适用于用户说"说出来/读出来/语音播报/用TTS",或反馈"没声音/tts 生成的 mp3 是空的/播不出来",以及需要中文语音但 OpenClaw 内置 tts 不可用时。
- 磁盘空间检查示例:
if ($disk.FreeSpace / $disk.Size -lt 0.15) { $status = "Critical" }(剩余 - CPU 负载连续超阈值才告警:
先用Get-Counter采样多次,再用if统计超限次数是否 ≥3 - 服务状态判断不止看
Status -eq 'Running',还要结合StartMode -eq 'Auto',避免手动启的服务漏检
用 while 或 do-until 等待远程操作完成
某些巡检动作需要等待远程响应就绪,比如等服务启动、等日志写入、等某个进程出现。这时用 while 更稳妥:
- 等待服务变为运行中(最多等 60 秒):
$timeout = 0; while ((Get-Service -Name Spooler).Status -ne 'Running' -and $timeout -lt 60) { Start-Sleep -Seconds 2; $timeout += 2 } - 配合
break提前退出:一旦状态达标立即跳出循环,不硬等满时长 - 实际巡检中更常用
do-until,因为它保证至少执行一次,适合“先查再等”场景
用 switch 简化多状态分类输出
当一项检查可能返回多种状态(如服务:Running / Stopped / Starting / Paused),用多个 if 易出错且难维护。switch 更清晰安全:
- 对服务状态统一映射:
switch ($svc.Status) { 'Running' { 'OK' }; 'Stopped' { 'Warning' }; 'StartPending','StopPending' { 'Info' }; default { 'Unknown' } } - 可配合
-Wildcard匹配日志事件来源(如"*SQL*"、"*Exchange*"),快速归类关键组件告警 - 结果直接用于生成 HTML 报告中的颜色标记(OK=green,Warning=yellow,Critical=red)

















