摘要不用装任何第三方工具用 Windows 自带的 PowerShell 写一个网络监控脚本定时 ping 内网业务地址和隧道外网地址延迟超阈值或不通时通过企业微信群机器人 Webhook 或 Server酱推到手机。脚本带三重防骚扰设计 —— 连续几次异常才告警、同一目标冷却时间、恢复后补一条。文末附可直接复制的完整脚本。上期给大家分享了外检现场网络不通怎么排查结尾答应给各位朋友分享网络不通时怎么第一时间接到手机消息其实很简单什么环境也不用安装直接使用电脑系统自带的PowerShell写的脚本就能请一位忠实的网络管理员帮我们一刻不停盯着整个网络当网络发生阻塞时通过脚本发送消息给我们的手机。下面就跟着我一步一步搭建并实现。做过维护的人都知道我们不可能时刻盯着网络是否通畅就算一直开着ping界面我们也还会处理其他问题要么处理数据问题要么是已经离开自己的电脑去给其他医生处理问题总之是没办法一直盯着网络通不通等到各个医生打电话来或是喊的时候那会场面估计就又有些让人尴尬百十号人看着你等你恢复网络……所以我就有了个请帮手的想法外检网络其实只要保证两个地址一直通畅一个是交换业务数据的内网地址一个是和医院建立隧道的外网固定地址。这两个地址都可以使用最简单的ping命令来监测数据延迟大不大使用一段时间对这个网络正常延迟有了了解完全可以写个脚本来帮我们监测。这个帮手是怎么替我盯着的定时探一探 → 连续几次不对劲才报警 → 网络缓过来再补一条脚本和配置文件长这样第一段探测 —— 用系统自带的 .NET Ping不去抠中文输出稳function Ping-Once($ip, $timeoutMs) { $p New-Object System.Net.NetworkInformation.Ping try { $r $p.Send($ip, $timeoutMs) if ($r.Status -eq Success) { return { ok $true; ms [int]$r.RoundtripTime } } return { ok $false; ms $null } } catch { return { ok $false; ms $null } } finally { $p.Dispose() } }第二段只在真出问题时才报警 —— 连续几次异常才发不轰炸、不误报if ($bad) { $st.streak $nowSec [int]((Get-Date) - (Get-Date 1970-01-01 00:00:00)).TotalSeconds if ($st.streak -ge $Times -and (-not $st.alerted) -and ($nowSec - $st.last) -ge ($CooldownMin * 60)) { Send-Msg 网络告警 $t 目标 $t 连续 $($st.streak) 次异常阈值 $($ThresholdMs) ms $st.alerted $true $st.last $nowSec } }第三段每次启动先发一条报平安 —— 确认它在跑、推送通道是通的Send-Msg 监控已启动 网络监控已启动正在盯 $($Targets.Count) 个地址。配置文件地址、阈值、推送密钥都在这里改$Targets (192.168.1.1, 10.0.0.1) # 要盯的地址示例占位换成你自己的 $WecomKey # 企业微信机器人 Webhook留空则不用 $ServerChan # Server酱 SendKey留空则不用 $ThresholdMs 100 # 延迟超过多少毫秒算异常 $Times 3 # 连续几次异常才告警防抖 $IntervalSec 30 # 每隔多少秒探测一次 $CooldownMin 10 # 同一目标最短告警间隔分钟那怎么通知到我手机上监测的帮手有了但怎么通知我这又是一个值得考虑的问题。现在每个人时刻都离不开手机所以最好的办法就是有问题推送提醒到我手机上通知我。现在不是正在上各种AI客服吗我首先考虑的是否有我可以使用的客服。经过尝试我找到了最简单的方法群机器人 Webhook。只用手机上安装一个企业微信app就全解决了。去企微官网注册一个账号个人账号注册完全免费然后建立一个人的群启用这个群的消息推送你就得到一位24小时听候差遣的免费专用助手。到此网络有问题手机收到提示消息整个流程完全实现我们要做的就是收到网络有问题的消息及时处理使网络恢复正常就是了完全不用一直盯着电脑监测网络。有了这样一个完整的功能其实还可以做很多事情包括我现在已经用这一套流程监测数据库阻塞情况监察硬盘空间使用情况等等。完整的脚本我也已经写好由于篇幅原因我另开了一篇需要完整脚本的朋友可以看下面我附的那一份。在使用脚本或是消息推送功能中遇到什么问题也可以及时留言给我我会一一解答。其实上面也只是我的一个抛砖引玉各位朋友肯定还有其他更好的想法我们也可以一起交流探讨期待你的留言。下篇各位朋友想看什么内容呢刚才说到了服务器下篇我分享一些服务器的相关维护经验你是否期待……文中案例均已脱敏不出现系统账号、服务器地址与患者信息完整脚本# 网络监控精简可跑版—— Windows 10/11 自带 PowerShell无需安装任何东西 # 只需改下面这 8 行配置双击运行即可CtrlC 停止 $Targets (192.168.1.1, 10.0.0.1) # 要盯的地址示例占位换成你自己的 $WecomKey # 企业微信机器人 Webhook留空则不用 $ServerChan # Server酱 SendKey留空则不用 $ThresholdMs 100 # 延迟超过多少毫秒算异常 $Times 3 # 连续几次异常才告警防抖 $IntervalSec 30 # 每隔多少秒探测一次 $CooldownMin 10 # 同一目标最短告警间隔分钟 function Ping-Once($ip, $timeoutMs) { $p New-Object System.Net.NetworkInformation.Ping try { $r $p.Send($ip, $timeoutMs) if ($r.Status -eq Success) { return { ok $true; ms [int]$r.RoundtripTime } } return { ok $false; ms $null } } catch { return { ok $false; ms $null } } finally { $p.Dispose() } } function Send-Msg($title, $content) { if ($WecomKey) { $b { msgtype text; text { content $content } } | ConvertTo-Json -Compress try { Invoke-RestMethod -Uri $WecomKey -Method Post -TimeoutSec 10 -ContentType application/json; charsetutf-8 -Body ([Text.Encoding]::UTF8.GetBytes($b)) | Out-Null return } catch {} } if ($ServerChan) { try { Invoke-RestMethod -Uri https://sctapi.ftqq.com/$ServerChan.send -Method Post -Body { title $title; desp $content } -TimeoutSec 10 | Out-Null } catch {} } } $state {} foreach ($t in $Targets) { $state[$t] { streak 0; alerted $false; last 0 } } Send-Msg 监控已启动 网络监控已启动正在盯 $($Targets.Count) 个地址。 while ($true) { foreach ($t in $Targets) { $r Ping-Once $t $ThresholdMs $st $state[$t] $bad (-not $r.ok) -or ($r.ms -gt $ThresholdMs) if ($bad) { $st.streak $nowSec [int]((Get-Date) - (Get-Date 1970-01-01 00:00:00)).TotalSeconds if ($st.streak -ge $Times -and (-not $st.alerted) -and ($nowSec - $st.last) -ge ($CooldownMin * 60)) { Send-Msg 网络告警 $t 目标 $t 连续 $($st.streak) 次异常阈值 $($ThresholdMs) ms $st.alerted $true $st.last $nowSec } } else { if ($st.alerted) { Send-Msg 网络恢复 $t 目标 $t 已恢复正常当前 $($r.ms) ms } $st.streak 0 $st.alerted $false } } Start-Sleep -Seconds $IntervalSec }
