1 (изменено: НеОчень, 2012-05-07 18:31:50)

Тема: VBScript: Сравнение пингов

Ребят, очень нужна ваша помощь...нужен скрипт, который пингует два ip,  вычисляет между ними разницу  во времени ответа, и записывает эту разницу в какой то текстовый документ. Может кто поможет чем сможет

2

Re: VBScript: Сравнение пингов

НеОчень пишет:

Может кто поможет чем сможет

Без проблем. С чем у Вас затруднения в реализации?

3 (изменено: НеОчень, 2012-05-08 13:42:51)

Re: VBScript: Сравнение пингов

вот что я слепил на данный момент :

' Создаем объект Shell 
' Объявляем константы

Const wbemFlagForwardOnly = 32
Const wbemFlagReturnImmediately = 16
Const ForWriting = 2

' Функция для записи информации в файл 
Sub TextOut (Text, File)
  ' Объявляем переменные
  Dim  objFSO, FOut 
  ' Создаем объект FileSystemObject
  Set  objFSO=WScript.CreateObject("Scripting.FileSystemObject")
  ' Открываем выходной файл для записи
  Set  FOut = objFSO.OpenTextFile (File,ForWriting,true)
  ' Записываем текстовую строку в файл
  FOut.WriteLine Text
  ' Закрываем выходной файл
  FOut.Close
End Sub

Set Shell = CreateObject("WScript.Shell") 

' Методом EXEC запускаем ping c одним запросом. 
Set ping = Shell.exec("ping -n 1 www.google.com") 
Set ping2 = Shell.exec("ping -n 1 vk.com") 
' Создаем две переменные - в первой находится исходящий поток ping 
' во второй собсвенно время отклика 
Dim answer: answer = "" 
Dim ping_time: ping_time = "" 

Dim answer2: answer2 = "" 
Dim ping_time2: ping_time2 = ""
' Ждем пока завершится ping (пока ping.Status = 0 утилита ping все еще рабоает) 
Do While true 
If ping.status = 0 Then 
WScript.Sleep 1000 
Else 
' После завершения работы ping считываем все, что она нам выдает 
answer = ping.StdOut.ReadAll 
answer2 = ping2.StdOut.ReadAll 
Exit Do 
End if 
Loop 

' Тут начинается самая гадкая часть - работа со строками 
' К тому же виндовая консоль работает в cp866 а скрипты в cp1251, 
' с русским все очень плохо, а как менять кодировку в VBScript я не знаю 

' В переменной answer содержится одна строка, но на самом деле их там много 
' разделенных символом конца строки 
' Вот мы и разбиваем большую строку на массив маленьких 
answer = Split(answer, vbCrLf) 
answer2 = Split(answer2, vbCrLf) 

' четвертый элемент массива answer(3) как раз нужная нам строка 
' Разбиваем ее по пробелам - из полученного массива выбираем 6 элемент 
' это как раз время=XXXмс 
' Дальше обрезаем время= и мс и получем нужную нам переменную ping_time 

ping_time = Split(answer(3), " ")(5) 
ping_time = Mid(ping_time, 7) 
ping_time = Mid(ping_time, 1, Len(ping_time)-2) 

ping_time2 = Split(answer2(3), " ")(5) 
ping_time2 = Mid(ping_time2, 7) 
ping_time2 = Mid(ping_time2, 1, Len(ping_time2)-2) 
resoult=ping_time2-ping_time



' Выводим результат в текстовый файл
TextOut  resoult, "C:\111.txt"

Но этот скрипт проверяет пингует и вычитает разницу только один раз...Как сделать, чтобы он беспрерывно пинговал, и записывал все результаты в блокнот? Я так понимаю надо цикл, но как это сделать, не могу разобраться ( я вообще только вчера с vbs познакомился)

4

Re: VBScript: Сравнение пингов

Как насчёт такого:

Option Explicit

Dim strAddress

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim objSWbemObject


Set objSWbemLocator    = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(".", "root\cimv2")

Do
    For Each strAddress In Array("www.google.com", "www.vk.com")
        For Each objSWbemObject In objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_PingStatus WHERE Address = '" & strAddress & "'")
            With objSWbemObject
                If Not IsNull(.StatusCode) Then
                    If .StatusCode = 0 Then
                        WScript.Echo .Address & vbTab & "On" & vbTab & "Response time: " & .ResponseTime & " ms"
                    Else
                        WScript.Echo .Address & vbTab & "Off" & vbTab & "Status code: " & .StatusCode
                    End If
                Else
                    WScript.Echo strComputer & vbTab & "Not found"
                End If
            End With
        Next
    Next
    
    WScript.Echo
    
    WScript.Sleep 1000
Loop

Set objSWbemServicesEx = Nothing
Set objSWbemLocator    = Nothing

WScript.Quit 0

Запускать в командной строке:

cscript.exe //nologo "<Путь к скрипту.vbs>"

5

Re: VBScript: Сравнение пингов

Хм, да, ваш намного приятнее выглядит и работает) Спасибо!

6

Re: VBScript: Сравнение пингов

НеОчень, как есть, без Блокнота, устраивает? Прерывать исполнение скрипта как обычно — «Ctrl-C»/«Ctrl-Break».

7

Re: VBScript: Сравнение пингов

та да, так даже лучше, еще в идеале конечно если, например, разница между пингами 100мс, то записать это значение в блокнот. Если не сложно то помогите, а если я вам сильно морочу голову, то сам буду разбираться)

8 (изменено: НеОчень, 2012-05-08 15:36:04)

Re: VBScript: Сравнение пингов

как то сложно мне дается...Разделил на два цикла

Option Explicit

Dim strAddress
Dim strAddress2
Dim res

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim objSWbemObject


Set objSWbemLocator    = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(".", "root\cimv2")

Do
    For Each strAddress In Array("www.google.com")
        For Each objSWbemObject In objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_PingStatus WHERE Address = '" & strAddress & "'")
            With objSWbemObject
                If Not IsNull(.StatusCode) Then
                    If .StatusCode = 0 Then
                        WScript.Echo .Address & vbTab & "On" & vbTab & "Response time: " & .ResponseTime & " ms"
                    Else
                        WScript.Echo .Address & vbTab & "Off" & vbTab & "Status code: " & .StatusCode
                    End If
                Else
                    WScript.Echo strComputer & vbTab & "Not found"
                End If
            End With
        Next
    Next
    
    For Each strAddress2 In Array("www.vk.com")
        For Each objSWbemObject In objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_PingStatus WHERE Address = '" & strAddress2 & "'")
            With objSWbemObject
                If Not IsNull(.StatusCode) Then
                    If .StatusCode = 0 Then
                        WScript.Echo .Address & vbTab & "On" & vbTab & "Response time: " & .ResponseTime & " ms"
                    Else
                        WScript.Echo .Address & vbTab & "Off" & vbTab & "Status code: " & .StatusCode
                    End If
                Else
                    WScript.Echo strComputer & vbTab & "Not found"
                End If
            End With
        Next
    Next
    
    
    
    WScript.Echo
    
    WScript.Sleep 1000
Loop

Set objSWbemServicesEx = Nothing
Set objSWbemLocator    = Nothing

WScript.Quit 0

Как теперь вычислить их разницу?

То что ниже конечно чушь полная, потому что вычитает непонятно что, а не время, и дает 0 )
res=strAddress2-strAddress
WScript.Echo res

9

Re: VBScript: Сравнение пингов

Option Explicit

Dim strAddress

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim objSWbemObject

Dim objDictionary

Set objSWbemLocator    = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(".", "root\cimv2")

Set objDictionary      = WScript.CreateObject("Scripting.Dictionary")

objDictionary.Add "www.google.com", Null
objDictionary.Add "www.vk.com", Null

Do
    For Each strAddress In objDictionary.Keys
        For Each objSWbemObject In objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_PingStatus WHERE Address = '" & strAddress & "'")
            With objSWbemObject
                If Not IsNull(.StatusCode) Then
                    If .StatusCode = 0 Then
                        WScript.Echo .Address & vbTab & "On"  & vbTab & "Response time: " & .ResponseTime & " ms"
                        objDictionary.Item(strAddress) = .ResponseTime
                    Else
                        WScript.Echo .Address & vbTab & "Off" & vbTab & "Status code: " & .StatusCode
                    End If
                Else
                    WScript.Echo strComputer & vbTab & "Not found"
                End If
            End With
        Next
    Next
    
    If Not IsNull(objDictionary.Item("www.google.com")) And Not IsNull(objDictionary.Item("www.vk.com")) Then
        WScript.Echo "--------------------------------------------------"
        WScript.Echo "Difference: " & CStr(objDictionary.Item("www.google.com") - objDictionary.Item("www.vk.com"))
    End If
    
    WScript.Echo
    
    WScript.Sleep 1000
Loop

objDictionary.RemoveAll

Set objDictionary      = Nothing

Set objSWbemServicesEx = Nothing
Set objSWbemLocator    = Nothing

WScript.Quit 0

10

Re: VBScript: Сравнение пингов

ооо, Спасибо!:)

а я вот так сделал

Option Explicit

Dim strAddress
Dim strAddress2
Dim resp1
Dim resp2
Dim rez

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim objSWbemObject


Set objSWbemLocator    = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(".", "root\cimv2")

Do
    For Each strAddress In Array("www.google.com")  
        For Each objSWbemObject In objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_PingStatus WHERE Address = '" & strAddress & "'")
            With objSWbemObject
            resp2=.ResponseTime
            End With
        Next
    Next
    
    For Each strAddress2 In Array("www.vk.com")
        For Each objSWbemObject In objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_PingStatus WHERE Address = '" & strAddress2 & "'")
            With objSWbemObject
            resp1=.ResponseTime 
            End With
        Next
    Next
    
    rez=resp1-resp2
    If rez>32 Then
    WScript.Echo rez 
    End If
    
    
    WScript.Echo
    
    WScript.Sleep 1000
Loop

Set objSWbemServicesEx = Nothing
Set objSWbemLocator    = Nothing

WScript.Quit 0

Получается, что если разница больше 32 то выводит результат. А при запуске cscript "..." >> c:\111.txt и этот
вывод пишется в блокнот. Правда, если пинг меньше 32, то оставляет пустую строку, и того 10 пустых и одно 
значение так то не хорошо

11

Re: VBScript: Сравнение пингов

Ещё один код для новых условий:

Option Explicit

Dim strAddress

Dim objSWbemLocator
Dim objSWbemServicesEx
Dim objSWbemObject

Dim objDictionary

Set objSWbemLocator    = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(".", "root\cimv2")

Set objDictionary      = WScript.CreateObject("Scripting.Dictionary")

objDictionary.Add "www.google.com", Null
objDictionary.Add "www.vk.com", Null

Do
    For Each strAddress In objDictionary.Keys
        For Each objSWbemObject In objSWbemServicesEx.ExecQuery("SELECT * FROM Win32_PingStatus WHERE Address = '" & strAddress & "'")
            With objSWbemObject
                If Not IsNull(.StatusCode) Then
                    If .StatusCode = 0 Then
                        objDictionary.Item(strAddress) = .ResponseTime
                    Else
                        objDictionary.Item(strAddress) = Null
                    End If
                Else
                    objDictionary.Item(strAddress) = Null
                End If
            End With
        Next
    Next
    
    If Not IsNull(objDictionary.Item("www.google.com")) And Not IsNull(objDictionary.Item("www.vk.com")) Then
        If objDictionary.Item("www.google.com") - objDictionary.Item("www.vk.com") > 32 Then
            WScript.Echo objDictionary.Item("www.google.com") - objDictionary.Item("www.vk.com")
        End If
    End If
    
    WScript.Sleep 1000
Loop

objDictionary.RemoveAll

Set objDictionary      = Nothing

Set objSWbemServicesEx = Nothing
Set objSWbemLocator    = Nothing

WScript.Quit 0

12

Re: VBScript: Сравнение пингов

Спасибо огромное,  все работает как надо