欢迎光临菏泽九九信息网
详情描述
Vbs实现监测断网就关机的实现代码

' 网络监测并自动关机脚本
' 使用方法:
' 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.execscript.exe 进程

取消关机

  • 在执行关机前会弹出确认对话框,可以取消
  • 关机倒计时期间可以运行 shutdown /a 取消关机

注意事项:

权限要求:需要管理员权限才能执行关机操作 目标主机选择:建议使用可靠的服务器地址(如 8.8.8.8 是Google的DNS服务器) 日志文件:脚本会在相同目录下生成日志文件,记录网络状态和操作历史 测试建议:首次使用时,建议先将 MAX_RETRY_COUNT 设小一些进行测试

这个脚本会在检测到网络连续断开超过设定时间后,自动执行关机操作,并提供取消机会和详细日志记录。

相关推荐
2026年中央和地方对基层就业学费补偿的政策标准有何新的调整?
2026年中央和地方对基层就业学费补偿的政策标准有何新的调整?
台风或飓风的威力究竟是如何形成的,它的结构中有哪些不为人知的气象学知识?
台风或飓风的威力究竟是如何形成的,它的结构中有哪些不为人知的气象学知识?
从山野到网络,2026年生态科普达人如何用新媒体守护自然?
从山野到网络,2026年生态科普达人如何用新媒体守护自然?
不同文化中脸颊、眉心等脸部名称的象征意义,涨知识的内容
不同文化中脸颊、眉心等脸部名称的象征意义,涨知识的内容
为什么网上总有人争论该不该调整老年公交卡免费制度,双方真正在意的点是什么?
为什么网上总有人争论该不该调整老年公交卡免费制度,双方真正在意的点是什么?
在准备清理旧信报箱前,需要检查其中是否还可能有重要遗留物品?
在准备清理旧信报箱前,需要检查其中是否还可能有重要遗留物品?
在强光下看不清屏幕,自动亮度调节失灵时有哪些应急的解决小技巧?
在强光下看不清屏幕,自动亮度调节失灵时有哪些应急的解决小技巧?
关于邻居家庭成员的健康状况(如传染病),在什么情况下属于应知情范围?
关于邻居家庭成员的健康状况(如传染病),在什么情况下属于应知情范围?
只想花半小时做一次居家防灾排查,优先检查哪几处最容易出事的隐患点?
只想花半小时做一次居家防灾排查,优先检查哪几处最容易出事的隐患点?
2026年结婚,彩礼数额怎么协商才能既符合规定又不伤感情?
2026年结婚,彩礼数额怎么协商才能既符合规定又不伤感情?
公摊面积是不是越小越好,过小的公摊会对日常生活产生什么影响?
公摊面积是不是越小越好,过小的公摊会对日常生活产生什么影响?
2026年城乡居民基础养老金最低标准提到163元,这次调整你家老人每月能多领多少?
2026年城乡居民基础养老金最低标准提到163元,这次调整你家老人每月能多领多少?
如何查询自己提交过的公共服务评价记录以及后续的处理状态和结果?
如何查询自己提交过的公共服务评价记录以及后续的处理状态和结果?
泡完脚后立即睡觉好,还是间隔一段时间更好?最佳时间安排是怎样的?
泡完脚后立即睡觉好,还是间隔一段时间更好?最佳时间安排是怎样的?
老旧小区顶楼住户阳台堆杂物,大风天可能变成哪种常见的坠物风险链条?
老旧小区顶楼住户阳台堆杂物,大风天可能变成哪种常见的坠物风险链条?
手机拍月全食总是过曝发白,有哪些简单参数或步骤能把红月亮拍出来?
手机拍月全食总是过曝发白,有哪些简单参数或步骤能把红月亮拍出来?