開伈玫瑰 發表於 2022-4-25 10:28:36

VBS 批量Ping的项目实现

<p>本文用vb编写的 ping程序实现,具体如下:</p>
<div class="jb51code"><pre class="brush:vb;">'判断当前VBS脚本是否由CScript执行
If InStr(LCase(WScript.FullName), "cscript.exe") = 0 Then
    '若不是由CScript执行,则使用CScript重新执行当前脚本
    Set objShell = CreateObject("Shell.Application") 
    objShell.ShellExecute "cscript.exe", """" &amp; WScript.ScriptFullName &amp; """", , , 1
    WScript.Quit    '退出当前程序
End If

'----------------------------------------------------------------------------------------------

Set        objFSO        = CreateObject("Scripting.FileSystemObject")
'创建日志文件
Set        fileLog        = objFSO.CreateTextFile("Ping运行结果(" &amp;_
                                Year(Now()) &amp; "-" &amp; Month(Now()) &amp; "-" &amp; Day(Now()) &amp; " " &amp;_
                                Hour(Now()) &amp; "-" &amp; Minute(Now()) &amp; "-" &amp; Second(Now()) &amp; ").txt", True)

'----------------------------------------------------------------------------------------------

'Ping 方案类
Class PingScheme
    Public        Address                        '目标地址
    Public        DisconnectionCount    '断线计数
End Class

Dim        dicPingScheme                    '配置方案集合
Set        dicPingScheme    = CreateObject("Scripting.Dictionary")

Dim        strPingQuery                        'Ping查询条件语句
    strPingQuery                = Null

'添加Ping方案到方案集合
Public Sub AddPingScheme ( addr )
    
    Set newPingScheme = New PingScheme
        newPingScheme.Address = addr
        newPingScheme.DisconnectionCount = 0
    
    dicPingScheme.Add addr, newPingScheme
    '合成Ping查询条件语句
    If IsNull( strPingQuery ) Then
        strPingQuery = "Address='" &amp; addr &amp; "'"
    Else
        strPingQuery = strPingQuery &amp; "OR Address='" &amp; addr &amp; "'"
    End If
    
End Sub

'----------------------------------------------------------------------------------------------

AddPingScheme ( "8.8.8.8" )

AddPingScheme ( "8.8.4.4" )

AddPingScheme ( "192.168.1.8" )


'----------------------------------------------------------------------------------------------


Dim        bEmailFlag                            '发送邮件标志
    bEmailFlag                    = False


Const    LoopInterval        = 5000    '循环间隔

Dim        strDisplay            '显示缓存字符串
Dim        strLog                    '日志文件缓存字符串

'连接WMI服务
Set        objWMIService = GetObject("winmgmts:\\.\root\cimv2")

Do 
    
    strDisplay    = "----" &amp; Now &amp; "----" &amp; vbCrlf
    strLog            = ""
    '通过WMI调用Ping命令,返回Ping执行结果集合
    Set colPings = objWMIService.ExecQuery("SELECT * FROM Win32_PingStatus WHERE " &amp; strPingQuery)
    '遍历结果集合
    For Each objPing in colPings
        
        strLog = strLog &amp; FormatDateTime(Now()) &amp; vbTab &amp;_
                        objPing.Address &amp; vbTab &amp; objPing.StatusCode &amp; vbTab
        strDisplay = strDisplay &amp; "[" &amp; objPing.Address &amp; "] - "
        
        Select Case objPing.StatusCode
            Case 0
                strDisplay    = strDisplay &amp; objPing.ProtocolAddress &amp;_
                                    ", Size: " &amp; objPing.ReplySize &amp;_
                                    ", Time: " &amp; objPing.ResponseTime &amp;_
                                    ", TTL: " &amp; objPing.ResponseTimeToLive &amp; vbCrlf
                strLog            = strLog &amp; objPing.ProtocolAddress &amp; vbTab &amp; objPing.ReplySize &amp; vbTab &amp;_
                                    objPing.ResponseTime &amp; vbTab &amp; objPing.ResponseTimeToLive
            Case 11002
                strDisplay    = strDisplay &amp;  "目标网络不可达" &amp; vbCrlf
                strLog            = strLog &amp; "目标网络不可达"
            Case 11003
                strDisplay    = strDisplay &amp;  "目标主机不可达 " &amp; vbCrlf
                strLog            = strLog &amp; "目标主机不可达"
            Case 11010
                strDisplay    = strDisplay &amp;  "等待超时" &amp; vbCrlf
                strLog            = strLog &amp; "等待超时"
            Case Else
                If IsNull(objPing.StatusCode) Then
                    strDisplay    = strDisplay &amp;  "找不到主机 " &amp; objPing.Address &amp; vbCrlf
                    strLog            = strLog &amp; "找不到主机 " &amp; objPing.Address
                Else
                    strDisplay    = strDisplay &amp;  "错误:" &amp; objPing.StatusCode &amp; vbCrlf
                    strLog            = strLog &amp; "错误:" &amp; objPing.StatusCode
                End If
        End Select
        
        strLog = strLog &amp; vbCrlf
        
        '判断 Ping返回结果是否执行成功 
        If objPing.StatusCode &lt;&gt; 0 Then
            '若不成功 将相应的 DisconnectionCount 加 1
            dicPingScheme(objPing.Address).DisconnectionCount = dicPingScheme(objPing.Address).DisconnectionCount + 1
            'DisconnectionCount = 10 时 置位 发送邮件标志
            If dicPingScheme(objPing.Address).DisconnectionCount = 10 Then
                bEmailFlag = True
            End If
        Else
            '若成功 将相应的 DisconnectionCount 清零
            dicPingScheme(objPing.Address).DisconnectionCount = 0
        End If
        
    Next
    
    '输出显示
    PrintLine strDisplay
    '保存日志
    fileLog.WriteLine strLog
    
    '如果 发送邮件标志 被置位 清除标志 并 发送邮件
    If bEmailFlag = True Then
        bEmailFlag = False        '清除 标志
        SendEmail "设备断线 " &amp; Now, strDisplay
    End If
    
    '挂起指定时间,暂停
    WScript.Sleep(LoopInterval)
    
Loop

'---------------------------------------------------------------------------------------

'标准输出
Public Sub Print ( tmp )
    WScript.StdOut.Write tmp
End Sub

'标准输出以换行符结尾
Public Sub PrintLine ( tmp )
    WScript.StdOut.Write tmp &amp; vbCrlf
End Sub

'---------------------------------------------------------------------------------------
'发送邮件
Public Sub SendEmail(title, textbody)

    Set objCDO            = CreateObject("CDO.Message")

    objCDO.Subject        = title
    objCDO.From            = "XXX@qq.com"
    objCDO.To                = "XXX@qq.com"
    objCDO.TextBody    = textbody

    cdoConfigPrefix        = "http://schemas.microsoft.com/cdo/configuration/"

    Set objCDOConfig    = objCDO.Configuration
    With objCDOConfig
        .Fields(cdoConfigPrefix &amp; "smtpserver")                = "smtp.qq.com"
        .Fields(cdoConfigPrefix &amp; "smtpserverport")        = 465
        .Fields(cdoConfigPrefix &amp; "sendusing")                = 2  
        .Fields(cdoConfigPrefix &amp; "smtpauthenticate")    = 1  
        .Fields(cdoConfigPrefix &amp; "smtpusessl")            = true 
        .Fields(cdoConfigPrefix &amp; "sendusername")        = "XXX"
        .Fields(cdoConfigPrefix &amp; "sendpassword")        = "XXX"
        .Fields.Update
    End With

    objCDO.Send
    
    Set objCDOConfig = Nothing
    Set objCDO = Nothing
    
End Sub</pre></div>
頁: [1]
查看完整版本: VBS 批量Ping的项目实现