CMD/BAT - [решено] Проверка состояния сети.
-
Guest
-
CyberMuesli
Re: CMD/BAT - [решено] Проверка состояния сети.
Цитата Anonymоus:
Ping некорректно возвращает ErrorLevel в некоторых случаях.
Спасибо, Вы правы. Я смог смоделировать эту ситуацию. На вайфайке есть host и guest зона, между ними настроена маршрутизацияКомпьютер в host зоне, телефон в guest зонеТелефон помещаем в бидон, бидон в кастрюлю, открываем и закрываем крышку кастрюли, пингуем, пинги то есть, то нетПри этом сообщения об ошибке могут быть разные: узел недоступен, превышен интервал ожидания запросаПри этом errorlevel 0
find "TTL" действительно самый дешевый способ. Но мне он не нравится тем, что если из 10 пингов 1 пройдет, эта команда нам скажет, что всё в порядке, тогда как цель такого мониторинга выявить проблемы.
Набросал вот. Алгоритм следующий: мы просим find не просто найти TTL, а подсчитать количество таких строк. Эту цифру мы можем считать и сравнить с той, которую передавали ранее пингу в параметре -n. Если хотя бы один пинг не прошел - операция считается неудачной
Код:
Результаты работы в эксперименте с бидоном
192.168.0.1 - wifi роутер в host зоне, 192.168.1.100 - телефон в guest зоне
Цитата:
C>TestPing.bat 192.168.1.100 15
Обмен пакетами с 192.168.1.100 по 32 байт:
Ответ от 192.168.0.1: Заданный узел недоступен.
Ответ от 192.168.0.1: Заданный узел недоступен.
Ответ от 192.168.1.100: число байт=32 время=2205мс TTL=64
Ответ от 192.168.1.100: число байт=32 время=5мс TTL=64
Превышен интервал ожидания для запроса.
Превышен интервал ожидания для запроса.
Превышен интервал ожидания для запроса.
Превышен интервал ожидания для запроса.
Превышен интервал ожидания для запроса.
Ответ от 192.168.1.100: число байт=32 время=12мс TTL=64
Ответ от 192.168.1.100: число байт=32 время=408мс TTL=64
Ответ от 192.168.1.100: число байт=32 время=228мс TTL=64
Ответ от 192.168.1.100: число байт=32 время=107мс TTL=64
Ответ от 192.168.1.100: число байт=32 время=109мс TTL=64
Ответ от 192.168.1.100: число байт=32 время=325мс TTL=64
Статистика Ping для 192.168.1.100:
Пакетов: отправлено = 15, получено = 10, потеряно = 5 (33% потерь),
Приблизительное время приема-передачи в мс:
Минимальное = 5мсек, Максимальное = 2205 мсек, Среднее = 339 мсек
------------- results: -------------
Ping count : 15
Success count : 8
Ping errorLevel: 0 {INVALID}
There is ping error
----------- errorlevel: 1 ----------
Ping некорректно возвращает ErrorLevel в некоторых случаях.
CMD/BAT - [решено] Проверка состояния сети.
Спасибо, Вы правы. Я смог смоделировать эту ситуацию. На вайфайке есть host и guest зона, между ними настроена маршрутизацияКомпьютер в host зоне, телефон в guest зонеТелефон помещаем в бидон, бидон в кастрюлю, открываем и закрываем крышку кастрюли, пингуем, пинги то есть, то нетПри этом сообщения об ошибке могут быть разные: узел недоступен, превышен интервал ожидания запросаПри этом errorlevel 0
find "TTL" действительно самый дешевый способ. Но мне он не нравится тем, что если из 10 пингов 1 пройдет, эта команда нам скажет, что всё в порядке, тогда как цель такого мониторинга выявить проблемы.
Набросал вот. Алгоритм следующий: мы просим find не просто найти TTL, а подсчитать количество таких строк. Эту цифру мы можем считать и сравнить с той, которую передавали ранее пингу в параметре -n. Если хотя бы один пинг не прошел - операция считается неудачной
Код:
Код: Выделить всё
@echo off
setlocal enabledelayedexpansion
call :TestPing[] -debug %1 %2
echo ----------- errorlevel: %errorlevel% ----------
goto :eof
:TestPing[]
:: Parameters: [-debug] IP [PingCount]
if "%1"=="-debug" (
set TestPing.Debug=Yes
shift
)
set TestPing.PingCount=%2
if "%TestPing.PingCount%"=="" (
set TestPing.PingCount=2
)
set TestPing.Out2=B%random%.tmp
set TestPing.Out3=C%random%.tmp
>%TestPing.Out2% (ping -n %TestPing.PingCount% %1)
set TestPing.PingErrorLevel=!errorlevel!
>%TestPing.Out3% (find /C "TTL=" Результаты работы в эксперименте с бидоном
192.168.0.1 - wifi роутер в host зоне, 192.168.1.100 - телефон в guest зоне
Цитата:
C>TestPing.bat 192.168.1.100 15
Обмен пакетами с 192.168.1.100 по 32 байт:
Ответ от 192.168.0.1: Заданный узел недоступен.
Ответ от 192.168.0.1: Заданный узел недоступен.
Ответ от 192.168.1.100: число байт=32 время=2205мс TTL=64
Ответ от 192.168.1.100: число байт=32 время=5мс TTL=64
Превышен интервал ожидания для запроса.
Превышен интервал ожидания для запроса.
Превышен интервал ожидания для запроса.
Превышен интервал ожидания для запроса.
Превышен интервал ожидания для запроса.
Ответ от 192.168.1.100: число байт=32 время=12мс TTL=64
Ответ от 192.168.1.100: число байт=32 время=408мс TTL=64
Ответ от 192.168.1.100: число байт=32 время=228мс TTL=64
Ответ от 192.168.1.100: число байт=32 время=107мс TTL=64
Ответ от 192.168.1.100: число байт=32 время=109мс TTL=64
Ответ от 192.168.1.100: число байт=32 время=325мс TTL=64
Статистика Ping для 192.168.1.100:
Пакетов: отправлено = 15, получено = 10, потеряно = 5 (33% потерь),
Приблизительное время приема-передачи в мс:
Минимальное = 5мсек, Максимальное = 2205 мсек, Среднее = 339 мсек
------------- results: -------------
Ping count : 15
Success count : 8
Ping errorLevel: 0 {INVALID}
There is ping error
----------- errorlevel: 1 ----------
-
Iska
Re: CMD/BAT - [решено] Проверка состояния сети.
, Anonymоus, чувствую себя тем неграмотным волком из анекдота про волка, лошадь и её задние копыта.А хоть что говорит такой:
читать дальше »
Код:
Код: Выделить всё
Option Explicit
Dim objSWbemObjectEx
For Each objSWbemObjectEx In WScript.CreateObject("WbemScripting.SWbemLocator").ConnectServer(".", "root\cimv2").ExecQuery( _
"SELECT * FROM Win32_PingStatus WHERE ADDRESS = '192.168.70.1'")
With objSWbemObjectEx
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 .Address & vbTab & "Not found"
End If
End With
Next
WScript.Quit 0код (чтобы хоть немного представлять ситуацию, и как себя в ней вести)?
-
CyberMuesli
Re: CMD/BAT - [решено] Проверка состояния сети.
Цитата Iska:
А хоть что говорит такой:
читать дальше »
код (чтобы хоть немного представлять ситуацию, и как себя в ней вести)?
у меня зацикленный код для телефона в кастрюле + закрытой потом открытой крышкой говорит следующее
192.168.1.100 Off Status code: 11010
192.168.1.100 Off Status code: 11003
192.168.1.100 Off Status code: 11010
192.168.1.100 Off Status code: 11003
192.168.1.100 Off Status code: 11010
192.168.1.100 On Response time: 5 ms
192.168.1.100 On Response time: 232 ms
192.168.1.100 On Response time: 186 ms
192.168.1.100 On Response time: 212 ms
192.168.1.100 On Response time: 12 ms
192.168.1.100 On Response time: 218 ms
зы. начало цикла надо делать до CreateObject, я правильно понял?
А хоть что говорит такой:
читать дальше »
код (чтобы хоть немного представлять ситуацию, и как себя в ней вести)?
CMD/BAT - [решено] Проверка состояния сети.
у меня зацикленный код для телефона в кастрюле + закрытой потом открытой крышкой говорит следующее
192.168.1.100 Off Status code: 11010
192.168.1.100 Off Status code: 11003
192.168.1.100 Off Status code: 11010
192.168.1.100 Off Status code: 11003
192.168.1.100 Off Status code: 11010
192.168.1.100 On Response time: 5 ms
192.168.1.100 On Response time: 232 ms
192.168.1.100 On Response time: 186 ms
192.168.1.100 On Response time: 212 ms
192.168.1.100 On Response time: 12 ms
192.168.1.100 On Response time: 218 ms
зы. начало цикла надо делать до CreateObject, я правильно понял?
-
Guest
Re: CMD/BAT - [решено] Проверка состояния сети.
Iska,
Код:
CyberMuesli, как вариант, использовать вот такую конструкцию, где будет дополнительно проверяться и наличие потерь:
Код:
Из минусов - слишком громоздко, cтоит использовать лишь там, где процент потерь при пинге действительно нужно учитывать.
Отредактировал второй пост, поправил скрипт, чтобы он учитывал частично прошедший пинг и добавлял статус "Unstable connection" в таком случае.
Код:
Код: Выделить всё
192.168.70.1 Off Status code: 11002CyberMuesli, как вариант, использовать вот такую конструкцию, где будет дополнительно проверяться и наличие потерь:
Код:
Код: Выделить всё
Set IP=192.168.70.1&Set i=3
For /F %%I In ('Ping -n %i% %IP%^|Find /C "TTL="') Do (If %%I==%i% Echo Пинг прошел, потерь нету)Из минусов - слишком громоздко, cтоит использовать лишь там, где процент потерь при пинге действительно нужно учитывать.
Отредактировал второй пост, поправил скрипт, чтобы он учитывал частично прошедший пинг и добавлял статус "Unstable connection" в таком случае.
-
Iska
Re: CMD/BAT - [решено] Проверка состояния сети.
CyberMuesli, можно так:
Код:
вынеся собственно подключение к Wbem за рамки цикла.
Anonymоus, спасибо, ясно. Статус именно тот, что Вы
Цитата:
11002 Destination Net Unreachable
(
Одно только замечание по коду со скриншота…
Код:
— он в данном виде непригоден для использования. Дело в том, что «Variable» в этом случае раскрывается до исполнения строки команд и будет возвращать код возврата предыдущей команды, а не «».
читать дальше »
Код:
Код: Выделить всё
Option Explicit
Dim strComputer
Dim objSWbemLocator
Dim objSWbemServicesEx
Dim objSWbemObjectEx
strComputer = "."
Set objSWbemLocator = WScript.CreateObject("WbemScripting.SWbemLocator")
Set objSWbemServicesEx = objSWbemLocator.ConnectServer(strComputer, "root\cimv2")
Do
For Each objSWbemObjectEx In objSWbemServicesEx.ExecQuery( _
"SELECT * FROM Win32_PingStatus WHERE Address = '192.168.70.1'")
With objSWbemObjectEx
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 .Address & vbTab & "Not found"
End If
End With
Next
Loop
Set objSWbemServicesEx = Nothing
Set objSWbemLocator = Nothing
WScript.Quit 0вынеся собственно подключение к Wbem за рамки цикла.
Anonymоus, спасибо, ясно. Статус именно тот, что Вы
CMD/BAT - [решено] Проверка состояния сети.
на скриншоте:Цитата:
11002 Destination Net Unreachable
(
Win32_PingStatus class
). Стало быть, будем знать про такую особенность «ping.exe».Одно только замечание по коду со скриншота…
читать дальше »
Код:
Код: Выделить всё
& echo %Variable%— он в данном виде непригоден для использования. Дело в том, что «Variable» в этом случае раскрывается до исполнения строки команд и будет возвращать код возврата предыдущей команды, а не «».
-
Iska
Re: CMD/BAT - [решено] Проверка состояния сети.
Anonymоus, порылся немного. Да, похоже Вы совершенно правы. Вон и Симон рекомендует пользовать исключительно фильтр на TTL (а для полной ясности и вовсе проверять реальную доступность конечного адреса ажник в четыре шага, начиная с localhost и последовательно углубляясь по маршруту):
Ещё раз спасибо. Будем знать.
Ping
.Ещё раз спасибо. Будем знать.
-
CyberMuesli
Re: CMD/BAT - [решено] Проверка состояния сети.
Цитата Iska:
вынеся собственно подключение к Wbem за рамки цикла.
а, ну да
Цитата Iska:
Дело в том, что «Variable» в этом случае раскрывается до исполнения строки команд
плюсану
вынеся собственно подключение к Wbem за рамки цикла.
CMD/BAT - [решено] Проверка состояния сети.
а, ну да
Цитата Iska:
Дело в том, что «Variable» в этом случае раскрывается до исполнения строки команд
CMD/BAT - [решено] Проверка состояния сети.
плюсану
-
Dreamer_UFA
Re: CMD/BAT - [решено] Проверка состояния сети.
Уважемые, возник такой вопрос.
Как можно добавить в скрипт предложенный Anonymous использование переменных.
Так как филиалы разные то и ип адреса тоже. Хотелось бы что бы в тело не лезли.... а прописали где нибудь типа settings.ini.
Ну а сам батник конвертнуть в com или exe....
не силен в скриптовых языках... мозг сломал уже
Как можно добавить в скрипт предложенный Anonymous использование переменных.
Так как филиалы разные то и ип адреса тоже. Хотелось бы что бы в тело не лезли.... а прописали где нибудь типа settings.ini.
Ну а сам батник конвертнуть в com или exe....
не силен в скриптовых языках... мозг сломал уже

-
Guest
Re: CMD/BAT - [решено] Проверка состояния сети.
Dreamer_UFA, сам скрипт:
Код:
Он же, упакованный в exe -
Содержимое файла настроек Settings.ini:
Код:
Код:
Код: Выделить всё
@Echo Off
SetLocal EnableDelayedExpansion
If Not Exist "settings.ini" Echo Settings not found&Pause&Exit 1
For /F "usebackq eol=# tokens=1,2* delims==" %%A In ("settings.ini") Do (
If Not "%%B"=="" Set %%A=%%B
)
Set MsgString="Status:"
:: Получаем набор адресов
Echo Wait...
For /F "tokens=2 delims==" %%A In ('Set Point_') Do (
For /F "tokens=1,2 delims=:" %%B In ("%%A") Do (
Echo Checking "%%B"
:: Проверяем на доступность сервера и стабильный пинг к нему
For /F %%I In ('Ping -n %PacketCount% %%B^|Find /C "TTL="') Do (
If %%I==%PacketCount% (Set Result=Online) Else (Set Result=Unstable connection)
If %%I==0 Set Result=Not responding
)
:: Составляем строку с данными для MsgBox'а
Set MsgString=!MsgString! + vbCrLf + "%%C - !Result!"
)
)
:: Генерируем и запускаем vbs-скрипт, выводящий данные
Echo MsgBox %MsgString%>"%Temp%\statusmsg.vbs"
"%Temp%\statusmsg.vbs"Он же, упакованный в exe -
http://dl.dropbox.com/u/11632454/dev/random/Pinger.rar
Содержимое файла настроек Settings.ini:
Код:
Код: Выделить всё
# Адреса серверов в формате IP:Отображаемое имя
Point_1=192.168.50.1:Billing server
Point_2=192.168.50.5:VPN server
Point_3=192.168.72.11:FTP
Point_4=127.0.0.1:Loopback
Point_5=209.85.148.113:Google.com
Point_6=87.250.250.203:Yandex.ru
# Количество пакетов для команды пинга
PacketCount=5