CMD/BAT - [решено] Проверка состояния сети.

Аватара пользователя
CyberMuesli

Re: CMD/BAT - [решено] Проверка состояния сети.

Сообщение CyberMuesli »

Цитата Anonymоus:



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 - [решено] Проверка состояния сети.

Сообщение Iska »

Изображение, 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 - [решено] Проверка состояния сети.

Сообщение CyberMuesli »

Цитата Iska:



А хоть что говорит такой:

читать дальше »

код (чтобы хоть немного представлять ситуацию, и как себя в ней вести)?
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 - [решено] Проверка состояния сети.

Сообщение Guest »

Iska,



Код:

Код: Выделить всё

192.168.70.1	Off	Status code: 11002

CyberMuesli, как вариант, использовать вот такую конструкцию, где будет дополнительно проверяться и наличие потерь:



Код:

Код: Выделить всё

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 - [решено] Проверка состояния сети.

Сообщение Iska »

CyberMuesli, можно так:


читать дальше »




Код:

Код: Выделить всё

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 - [решено] Проверка состояния сети.

Сообщение Iska »

Anonymоus, порылся немного. Да, похоже Вы совершенно правы. Вон и Симон рекомендует пользовать исключительно фильтр на TTL (а для полной ясности и вовсе проверять реальную доступность конечного адреса ажник в четыре шага, начиная с localhost и последовательно углубляясь по маршруту):
Ping
.



Ещё раз спасибо. Будем знать.
Аватара пользователя
CyberMuesli

Re: CMD/BAT - [решено] Проверка состояния сети.

Сообщение CyberMuesli »

Цитата Iska:



вынеся собственно подключение к Wbem за рамки цикла.
CMD/BAT - [решено] Проверка состояния сети.




а, ну да


Цитата Iska:



Дело в том, что «Variable» в этом случае раскрывается до исполнения строки команд
CMD/BAT - [решено] Проверка состояния сети.




плюсану
Аватара пользователя
Dreamer_UFA

Re: CMD/BAT - [решено] Проверка состояния сети.

Сообщение Dreamer_UFA »

Уважемые, возник такой вопрос.

Как можно добавить в скрипт предложенный Anonymous использование переменных.

Так как филиалы разные то и ип адреса тоже. Хотелось бы что бы в тело не лезли.... а прописали где нибудь типа settings.ini.

Ну а сам батник конвертнуть в com или exe....



не силен в скриптовых языках... мозг сломал уже Изображение
Аватара пользователя
Guest

Re: CMD/BAT - [решено] Проверка состояния сети.

Сообщение Guest »

Dreamer_UFA, сам скрипт:



Код:

Код: Выделить всё

@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
Ответить

Вернуться в «Скриптовые языки администрирования Windows»