' 网络监测并自动关机脚本
' 使用方法:
' 1. 将代码保存为 .vbs 文件(如:NetworkMonitorShutdown.vbs)
' 2. 可以设置为开机启动或使用计划任务定时运行
Option Explicit
' ========== 配置部分 ==========
Const CHECK_INTERVAL = 10 ' 检查间隔(秒)
Const MAX_RETRY_COUNT = 3 ' 最大重试次数
Const TARGET_HOST = "8.8.8.8" ' 用于测试网络连通性的目标主机(可以是DNS服务器或网关)
Const PING_TIMEOUT = 3000 ' ping超时时间(毫秒)
Const SHUTDOWN_DELAY = 30 ' 关机倒计时(秒)
' ==============================
Dim objShell, objFSO, objWMIService, objPing
Dim strLogFile, bNetworkAvailable, iRetryCount
Dim strComputer, strCommand
' 初始化
Set objShell = CreateObject("WScript.Shell")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objWMIService = GetObject("winmgmts:\\.\root\cimv2")
' 日志文件路径(与脚本同目录)
strLogFile = Replace(WScript.ScriptFullName, ".vbs", ".log")
' 主循环
Do
bNetworkAvailable = CheckNetworkConnection()
If bNetworkAvailable Then
' 网络正常,重置重试计数
iRetryCount = 0
LogMessage "网络连接正常"
Else
' 网络异常,增加重试计数
iRetryCount = iRetryCount + 1
LogMessage "网络连接失败,重试次数: " & iRetryCount & "/" & MAX_RETRY_COUNT
' 达到最大重试次数后执行关机
If iRetryCount >= MAX_RETRY_COUNT Then
LogMessage "网络连接持续中断,准备关机..."
ExecuteShutdown()
Exit Do
End If
End If
' 等待指定间隔后再次检查
WScript.Sleep CHECK_INTERVAL * 1000
Loop
' ========== 函数定义 ==========
' 检查网络连接函数
Function CheckNetworkConnection()
On Error Resume Next
Dim objExec, strPingResult, bResult
bResult = False
' 方法1: 使用ping命令检查
Set objExec = objShell.Exec("ping -n 1 -w " & PING_TIMEOUT & " " & TARGET_HOST)
Do While objExec.Status = 0
WScript.Sleep 100
Loop
strPingResult = objExec.StdOut.ReadAll
If InStr(strPingResult, "TTL=") > 0 Or InStr(strPingResult, "Reply from") > 0 Then
bResult = True
Else
' 方法2: 备用检查方法 - 使用WMI
Dim colPings, objStatus
Set colPings = objWMIService.ExecQuery("SELECT * FROM Win32_PingStatus WHERE Address = '" & TARGET_HOST & "'")
For Each objStatus In colPings
If Not IsNull(objStatus.StatusCode) Then
If objStatus.StatusCode = 0 Then
bResult = True
Exit For
End If
End If
Next
End If
CheckNetworkConnection = bResult
On Error GoTo 0
End Function
' 执行关机函数
Sub ExecuteShutdown()
Dim strMessage, strChoice
' 显示警告消息(可选)
strMessage = "网络连接已丢失超过" & (MAX_RETRY_COUNT * CHECK_INTERVAL) & "秒。" & vbCrLf & _
"计算机将在 " & SHUTDOWN_DELAY & " 秒后关闭。" & vbCrLf & _
"要取消关机,请按取消按钮并在" & SHUTDOWN_DELAY & "秒内运行:shutdown /a"
strChoice = MsgBox(strMessage, vbOKCancel + vbExclamation, "网络监测 - 自动关机")
If strChoice = vbCancel Then
LogMessage "用户取消了关机操作"
Exit Sub
End If
' 记录关机事件
LogMessage "正在执行关机命令..."
' 执行关机命令
' 使用 /f 强制关闭正在运行的应用程序
' 使用 /t 设置延迟时间
' 使用 /c 添加注释
strCommand = "shutdown /s /f /t " & SHUTDOWN_DELAY & " /c ""网络连接丢失,系统自动关机"""
objShell.Run strCommand, 0, False
' 等待关机命令执行
WScript.Sleep 5000
' 检查是否成功执行关机
Dim objExec2
Set objExec2 = objShell.Exec("shutdown /a")
Do While objExec2.Status = 0
WScript.Sleep 100
Loop
LogMessage "关机命令已发送,系统将在 " & SHUTDOWN_DELAY & " 秒后关闭"
End Sub
' 日志记录函数
Sub LogMessage(strMessage)
Dim objLogFile, strTimestamp
strTimestamp = "[" & Now & "] "
' 写入日志文件
Set objLogFile = objFSO.OpenTextFile(strLogFile, 8, True) ' 8 = 追加模式
objLogFile.WriteLine strTimestamp & strMessage
objLogFile.Close
' 在控制台显示(如果以命令行方式运行)
WScript.Echo strTimestamp & strMessage
End Sub
' 清理资源
Set objShell = Nothing
Set objFSO = Nothing
Set objWMIService = Nothing
使用说明:
保存脚本:
- 将上述代码保存为
.vbs 文件,如 NetworkMonitorShutdown.vbs
配置参数(脚本开头的常量部分):
CHECK_INTERVAL: 网络检查间隔(秒)
MAX_RETRY_COUNT: 连续失败多少次后才执行关机
TARGET_HOST: 用于测试网络连通性的目标IP或域名
PING_TIMEOUT: ping超时时间(毫秒)
SHUTDOWN_DELAY: 关机前等待时间(秒)
运行方式:
- 直接双击运行(会显示控制台窗口)
- 使用
wscript.exe 静默运行:wscript.exe NetworkMonitorShutdown.vbs
- 添加到计划任务实现开机自启动
停止脚本:
- 在任务管理器中结束
wscript.exe 或 cscript.exe 进程
取消关机:
- 在执行关机前会弹出确认对话框,可以取消
- 关机倒计时期间可以运行
shutdown /a 取消关机
注意事项:
权限要求:需要管理员权限才能执行关机操作
目标主机选择:建议使用可靠的服务器地址(如 8.8.8.8 是Google的DNS服务器)
日志文件:脚本会在相同目录下生成日志文件,记录网络状态和操作历史
测试建议:首次使用时,建议先将
MAX_RETRY_COUNT 设小一些进行测试
这个脚本会在检测到网络连续断开超过设定时间后,自动执行关机操作,并提供取消机会和详细日志记录。