正文

VBS 批量Ping的项目实现(vb word批量编辑)深度揭秘

文章摘要

这篇文章主要介绍了如何自动生成Ping测试脚本,用于自动化设备ping测试。文章详细描述了脚本的结构和功能,包括: 1. **脚本结构**: - 检查当前脚本是否由CScript执行,如果不是则使用CScript重新执行脚本。 - 创建日志文件,记录Ping测试的结果。 2. **Ping测试方案**: - 定义Ping测试方案,包括添加目标地址到方案集合。 - 使用Scripting.Dictionary和Scripting.FileSystemObject创建和管理Ping测试方案。 3. **WMI服务调用**: - 连接到WMI服务(winmgmts:\.rootcimv2),并通过Win32_PingStatus查询获取设备ping结果。 - 遍历结果集合,处理每个Ping结果,包括断线计数、错误状态等。 4. **结果处理与通知**: - 根据Ping结果状态(如成功、错误或等待超时)更新断线计数,并触发邮件通知。 - 如果断线计数达到阈值(10次),发送邮件通知设备断线情况。 5. **循环间隔**: - 设置循环间隔(LoopInterval=5000),每隔5秒重复执行Ping测试。 总结而言,这篇文章提供了一个完整的Ping测试自动化脚本,能够通过WMI服务获取设备ping结果,并根据测试结果发送邮件通知断线情况,确保自动化测试流程的有效性和可靠性。

’判断当前VBS脚本是否由CScript执行 If InStr(LCase(WScript.FullName), “cscript.exe”)=0 Then ?’若不是由CScript执行,则使用CScript重新执行当前脚本 ?Set objShell=CreateObject(“Shell.Application”)? ?objShell.ShellExecute “cscript.exe”, “””” & WScript.ScriptFullName & “”””, , , 1 ?WScript.Quit ?’退出当前程序 End If ‘———————————————————————————————- Set ? ?objFSO ? ?=CreateObject(“Scripting.FileSystemObject”) ‘创建日志文件 Set ? ?fileLog ? ?=objFSO.CreateTextFile(“Ping运行结果(” &_ ? ? ? ? ? ? ? ?Year(Now()) & “-” & Month(Now()) & “-” & Day(Now()) & ” ” &_ ? ? ? ? ? ? ? ?Hour(Now()) & “-” & Minute(Now()) & “-” & Second(Now()) & “).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='” & addr & “‘” ?Else ? ?strPingQuery=strPingQuery & “OR Address='” & addr & “‘” ?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 ?=”—-” & Now & “—-” & vbCrlf ?strLog ? ? ?=”” ?’通过WMI调用Ping命令,返回Ping执行结果集合 ?Set colPings=objWMIService.ExecQuery(“SELECT * FROM Win32_PingStatus WHERE ” & strPingQuery) ?’遍历结果集合 ?For Each objPing in colPings ? ? ? ?strLog=strLog & FormatDateTime(Now()) & vbTab &_ ? ? ? ? ? ?objPing.Address & vbTab & objPing.StatusCode & vbTab ? ?strDisplay=strDisplay & “[” & objPing.Address & “] – ” ? ? ? ?Select Case objPing.StatusCode ? ? ?Case 0 ? ? ? ?strDisplay ?=strDisplay & objPing.ProtocolAddress &_ ? ? ? ? ? ? ? ? ?”, Size: ” & objPing.ReplySize &_ ? ? ? ? ? ? ? ? ?”, Time: ” & objPing.ResponseTime &_ ? ? ? ? ? ? ? ? ?”, TTL: ” & objPing.ResponseTimeToLive & vbCrlf ? ? ? ?strLog ? ? ?=strLog & objPing.ProtocolAddress & vbTab & objPing.ReplySize & vbTab &_ ? ? ? ? ? ? ? ? ?objPing.ResponseTime & vbTab & objPing.ResponseTimeToLive ? ? ?Case 11002 ? ? ? ?strDisplay ?=strDisplay & ?”目标网络不可达” & vbCrlf ? ? ? ?strLog ? ? ?=strLog & “目标网络不可达” ? ? ?Case 11003 ? ? ? ?strDisplay ?=strDisplay & ?”目标主机不可达 ” & vbCrlf ? ? ? ?strLog ? ? ?=strLog & “目标主机不可达” ? ? ?Case 11010 ? ? ? ?strDisplay ?=strDisplay & ?”等待超时” & vbCrlf ? ? ? ?strLog ? ? ?=strLog & “等待超时” ? ? ?Case Else ? ? ? ?If IsNull(objPing.StatusCode) Then ? ? ? ? ?strDisplay ?=strDisplay & ?”找不到主机 ” & objPing.Address & vbCrlf ? ? ? ? ?strLog ? ? ?=strLog & “找不到主机 ” & objPing.Address ? ? ? ?Else ? ? ? ? ?strDisplay ?=strDisplay & ?”错误:” & objPing.StatusCode & vbCrlf ? ? ? ? ?strLog ? ? ?=strLog & “错误:” & objPing.StatusCode ? ? ? ?End If ? ?End Select ? ? ? ?strLog=strLog & vbCrlf ? ? ? ?’判断 Ping返回结果是否执行成功? ? ?If objPing.StatusCode <> 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 “设备断线 ” & 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 & 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 & “smtpserver”) ? ? ? ?=”smtp.qq.com” ? ?.Fields(cdoConfigPrefix & “smtpserverport”) ? ?=465 ? ?.Fields(cdoConfigPrefix & “sendusing”) ? ? ? ?=2 ? ? ?.Fields(cdoConfigPrefix & “smtpauthenticate”) ?=1 ? ? ?.Fields(cdoConfigPrefix & “smtpusessl”) ? ? ?=true? ? ?.Fields(cdoConfigPrefix & “sendusername”) ? ?=”XXX” ? ?.Fields(cdoConfigPrefix & “sendpassword”) ? ?=”XXX” ? ?.Fields.Update ?End With ?objCDO.Send ? ?Set objCDOConfig=Nothing ?Set objCDO=Nothing ? End Sub