Тема: VBScript: Сравнение пингов
Ребят, очень нужна ваша помощь...нужен скрипт, который пингует два ip, вычисляет между ними разницу во времени ответа, и записывает эту разницу в какой то текстовый документ. Может кто поможет чем сможет
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Ребят, очень нужна ваша помощь...нужен скрипт, который пингует два ip, вычисляет между ними разницу во времени ответа, и записывает эту разницу в какой то текстовый документ. Может кто поможет чем сможет
Может кто поможет чем сможет
Без проблем. С чем у Вас затруднения в реализации?
вот что я слепил на данный момент :
' Создаем объект 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 познакомился)
Как насчёт такого:
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>"Хм, да, ваш намного приятнее выглядит и работает) Спасибо!
НеОчень, как есть, без Блокнота, устраивает? Прерывать исполнение скрипта как обычно — «Ctrl-C»/«Ctrl-Break».
та да, так даже лучше, еще в идеале конечно если, например, разница между пингами 100мс, то записать это значение в блокнот. Если не сложно то помогите, а если я вам сильно морочу голову, то сам буду разбираться)
как то сложно мне дается...Разделил на два цикла
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
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ооо, Спасибо!:)
а я вот так сделал
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 пустых и одно
значение
так то не хорошо
Ещё один код для новых условий:
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Спасибо огромное, все работает как надо ![]()
Страницы 1
Чтобы отправить ответ, вы должны войти или зарегистрироваться