Войти

Показать полную графическую версию : [решено] Тестирование сетки.


Страниц : [1] 2

a139st
12-10-2010, 15:32
Возникла необходимость тестировать сеть, чтобы определить работающее оборудование.
Имеется Excel-ский файл, состоит из нескольких столбцов. В 14 столбце занесены IP адреса. Нужно взять IP, пингануть и результат пингов записать в следующий столбец т.е сформировать 15 столбец с результатами, если хоть один пинг прошёл то результат ОК, если нет то строку оставить пустым. Затем переход на следующую строку.
и так до конца столбца. Всего 1000 строк. Желательно, чтобы можно былобы регулировать количество пингов.
Буду очень признателен за помощь.

NiOl
12-10-2010, 16:26
1. Для работы с таблицами Вам скорее всего придется использовать VBS, особливо учитывая, что он уже встроен в Exel... ;)
2. Если заменить таблицу на текстовый файл, то можно сделать так (на базе старого отчета по пингам):
@Echo off
setLocal EnableExtensions

set tm=%time::=%
set tm=%tm:~0,-3%
set dt=%date:~8,2%%date:~3,2%%date:~0,2%

for /f "UseBackQ tokens=1,*" %%A in ("%~n0.txt") do call :Ping %%A "%%B"
del /f "%~n0.old" >nul 2>nul
ren "%~n0.txt" *.old 2>nul
ren "%~n0.tmp" *.txt 2>nul
goto END

:Ping
set stat=Faild
if "%1"=="Date" echo Date %dt% %~2>>"%~n0.tmp"&exit /b
if "%1"=="Time" echo Time %tm% %~2>>"%~n0.tmp"&exit /b
ping -n 1 %1 >nul 2>nul
if %ErrorLevel%==0 set stat=Ok
echo %1 %stat% %~2>>"%~n0.tmp"
exit /b

:END

исходный файл должен выглядить так:
Date
Time
192.168.0.1
192.168.0.151
192.168.0.8
192.168.0.101
192.168.0.111
192.168.0.6
На выходе будет так:
Date 101012 101012 101012
Time 162205 162143 162131
192.168.0.1 Ok Ok Ok
192.168.0.151 Ok Ok Ok
192.168.0.8 Ok Ok Ok
192.168.0.101 Ok Ok Ok
192.168.0.111 Ok Ok Ok
192.168.0.6 Ok Faild Faild
* строки Date и Time можно опустить в любой последовательности

a139st
13-10-2010, 16:39
Вот как я сделал.
Создал файл с расширением 123.bat и записал там код, что Вы дали.
там же разместил файл 123.txt
содержимое:
Date
Time
192.168.0.1
192.168.0.151
192.168.0.8
192.168.0.101
192.168.0.111
192.168.0.6

и потом запустил файл 123.bat

хотелось бы пояснений по коду

но ничего не произошло.
Подскажите пожалуйста как правильно сделать.
Спасибо

NiOl
13-10-2010, 17:47
но ничего не произошло. »
Давайте проверим. Сам текстовый файл со списком не обязан находится в том же каталоге, что и "батник" (для пользования нескольких списков, разложенных по каталогам)

1. Текстовый файл в обычной кодировке ASCII (или 1251 или 866 - неважно, главное не UTF16..64)
2. Он не заблокирован текстовым редактором, батник запускается действительно в каталоге, где расположен 123, допустим каким-либо "коммандером". (Вы правильно сделали, назвав текстовый файл также, как и "батник", я забыл уточнить этот немаловажный момент, извиняюсь)
3. Если все условия соблюдены, то хорошо-бы сделать отладочный лог - укоротить список адресов до 2-3, убрать первую строку "@Echo off", убрать перенаправления ">nul" и особенно "2>nul"
4. Запустить "батник" в консоли (cmd.exe) и все, что там окажется скопировать в текстовичок, который выложить сюда.

Пояснения по коду по блокам:
1. Разрешить новые возможности команд
2. Взять текущие время и дату в формате YYMMDD и HHMMSS - без разделителей, чтобы поместились в столбец из 8 символов (для вывода в CSV лучше сохранить и дату и время в другом формате - эксел при инпорте принудительно делает распознование типа данных, чем иногда портит все удовольствие от использования)
3. Начинаем в цикле построчный разбор уже имеющегося файла: выделяется первый столбец с адресом в %%A и все остальные столбцы со статистикой в %%B, обработка вынесена в отдельную процедуру ":Ping" для удобства и возможности в дальнейшем использовать какие-нить допобработки не прибегая к включению режима "отложенного раскрытия переменных" (setLocal EnableDelayedExpansion).
4. Процедура ":Ping" проверяет "адрес" (первый параметр) на совпадение со словами Date или Time (могут встретиться в любой строке файла) и выводит соответсвующую переменную до остальных столбцов (т.е. какбы вставляя новый столбец). В противном случае "адрес" является действительно адресом (или именем компа/сайта) - делаем тестовый "пинг", если ошибки нет (переменная %ErrorLevel%) - меняем значение "статуса" с "Faild" на "Ok". Выводим результат в том же порядке - "Адрес" текущий результат проверки, все предыдущие результаты проверки (вставляется столбец).
Весь вывод процедуры осуществляется во временный файл в текущем каталоге, с тем же именем, что и "батник", но расширением "tmp" ("%~n0.tmp")
5. По завершению цикла (который мог и не выполниться ниразу), удаляется файл "*.old" (предыдущий результат), *.txt (наш текстовик) переименовывается в "*.old", а временный файл переименовывается на место "текстовика".

megaloman
13-10-2010, 19:19
Вот макрос ExcelSub pinglan()
Begin = "N3" ' Клетка, с которой начинается просмотр адресов в таблице
Set WS = CreateObject("WScript.Shell")

ip = Range(Begin)
i = 0
Do While Len(Trim(ip)) <> 0
Ret = WS.Run("cmd /C Ping " + ip, 1, True)

Msg = CStr(Date) + " " + CStr(Time)
If Ret = 0 Then Msg = Msg + " OK" Else Msg = Msg + " Err"
Range(Begin).Offset(i, 1) = Msg
' MsgBox Msg

i = i + 1
ip = Range(Begin).Offset(i, 0)
Loop
End Sub Готовая таблица в прикреплённом файле

a139st
14-10-2010, 09:27
NiOl
Спасибо большое! Всё работает.
Сказать честно не понял в чём была причина, думаю в кодировке а может нет. Незнаю.
Создал заново 123.txt. Результат такой как Вы описываете.
Просьба осталась одна: нужно чтобы количество пингов можно было регулировать, дело в том что на первые 3-5 пингов оборудование может не ответить. Скажем чтобы послать 8 пингов и естли один из пингов ответил то результат ОК
Спасибо за помошь!

megaloman
Интесено.
Поясните пожалуйста как мне запустить проверку, я не совсем понял.
вот у меня есть файл 123.xls Каковы мои действия?

megaloman
14-10-2010, 09:58
Я прикрепил к ответу готовую таблицу (см мой предыдущий пост, как видно по статистике, вы в мою таблицу не заглядывали). Возьмите её. Там пример использования -В 14 столбце занесены IP адреса. Нужно взять IP, пингануть и результат пингов записать в следующий столбец т.е сформировать 15 столбец с результатами. Я не знаю, что в Вашем файле 123, но, в любом случае, там надо создать макрос (код я привёл) и выполнить его. Если у Вас трудности с созданием макроса в таблице - пишите. нужно чтобы количество пингов можно было регулировать см. подсказку ping /?. Например:
Ping -n 8 111.111.111.111
В моём коде это будет выглядеть
Ret = WS.Run("cmd /C Ping -n 8 " + ip, 1, True)
При желании число пингов можно прочесть из клетки в той же таблице - пишите, сделаю.

a139st
14-10-2010, 10:45
файл я смотрел , подносишь курсор на кнопку "запустить сканирование указанных IP" он у меня преврашается в форму стрелки на все 4 стороны, т.е. для перемешения.


Каждый раз файл для тестирования будет разный, т.е. допустим строк у меня в файле 1000, из них сегодня в работе (которые я уверенно знаю работают) 895, на следующий день что то из этого списка может выпасть или что то добавиться. Получается каждый раз для тестирования я беру новый файл.
Допустим есть такой файл: все столбцы до включительно 14 заполнены. Содержимое остальных строк не должно измениться. результат получить в 15 столбце.
Как создать макрос в таблице и запустить его ? Подскажите пожалуйста.

NiOl
14-10-2010, 12:19
a139st, megaloman правильно отметил, в команде ping за количество пингов отвечает параметр -n - после него вместо 1 ставите 8, но я пока не нашел на чем мне проверить, каков будет код возврата в таком случае - успешно, если пинг хоть раз пробился, или неудачный в случае потери хоть одного пакета... найду кого на работе можно без последствий "отключить" и проверю...

a139st
14-10-2010, 12:56
Верно, с количеством пингов разобрался

a139st
15-10-2010, 11:01
megaloman Разобрался, для было уровне безопасности, поставил низкую заработала.
Но осталось ещё одна проблема. При любом пинге, есть оборудование нет его - результат ОК.
Специально ввёл несуществующие IP, результат проверки ОК.
Вижу запускается командная строка в ней пингование и вижу что нет ответа, но в строчке результат ОК
Что же это может быть?

NiOl
15-10-2010, 13:18
Понятненько - если пингов несколько - результат положительный, если узел был досупен хоть раз.
В макросе думаю проблема в том, что возвращается код завершения CMD.EXE, а не самого PING. Попробуйте, выполнит ли макрос саму команду Ping без CMD

a139st
15-10-2010, 13:40
Нет не выполняет, Даёт ошибку.
Я сделал так: в макросе удалил команду cmd, и запустил макрос. Правильно?
А как можно пустить пинг без cmd? в фоновом режиме?

megaloman
15-10-2010, 14:08
Ret = WS.Run("Ping " + ip, 1, True)
Но у меня ведь работает! Правильно. И с CMD и без него

a139st
15-10-2010, 15:08
Мои действия были такие:
Сохранил файл который вы выслали. Из трёх IP два заменил на мои рабочие и удалил содержимое 15 столбца.
Запустил макрос, открылcя cmd вижу как идут пинги, первые два прошли успешно, а третий не прошёл.
А после завершения макроса результат все три IP ОК.
Может есть какие мысли? что не так делаю?

Если во время пингования я закрою окошко cmd командной строки (т.е. просто нажимаю крестик), то результат везде Err.

megaloman
15-10-2010, 19:10
Похоже, во всём виноват Windows. Проверил на Win XP, 2003 -работает. Win 2000 (у меня сервер) - увы. Там пинг по любому выдаёт ErrorLevel=0. Ни мой макрос, никакой батник с ping-ом и дальнейшей проверкой на ErrorLevel там работать не будут.
Если во время пингования я закрою окошко cmd командной строки (т.е. просто нажимаю крестик), то результат везде Err. - это как раз свидетельствует о том, что макрос отрабатывает, просто пинг не выдаёт ErrorLevel<>0 при отсутствии ответа.
Попробуйте запустить вот такой батник для имеющегося адреса и отсутствующего. Подозреваю, ErrorLevel в обоих случаях = 0
@Echo Off
Cls
Set ip=192.168.0.5

ping %ip%
Echo ---------------------------------
echo %ip% ErrorLevel=%ErrorLevel%
Echo ---------------------------------
Pause

А уровень безопасности лучше сделать средний- чтобы Excel спросил, отключить макрос или нет.

Iska
16-10-2010, 04:19
Похоже, во всём виноват Windows. Проверил на Win XP, 2003 -работает. Win 2000 (у меня сервер) - увы. Там пинг по любому выдаёт ErrorLevel=0. Ни мой макрос, никакой батник с ping-ом и дальнейшей проверкой на ErrorLevel там работать не будут. »
К сожалению, помнится, было именно так. Если не пугают сторонние компоненты (в WMI в 2000 класс «Win32_PingStatus» тоже, к сожалению, отсутствует) — попробуйте метод «.Ping()» объекта «IPNetwork» из комплекта «System Scripting Runtime 1.5 (http://www.netal.com/)»:
Ping Method (IPNetwork Object)

The Ping method sends an ICMP echo request to the specified host and returns information about the response, if one is received.


Long =
oIPNetwork.Ping(
Destination,
ResponseTime,
SourceOfResponse,
Timeout,
TTL,
BufferSize
)



Parameters

Destination as String
String containing the name or the IP-address of the host to ping.

(optional) ResponseTime as Variant
A Variant variable of sub-type Long which returns the number of milliseconds passed between sending the echo request and receiving the response. The variable will only hold a value if the method returns sscPingSuccess (=0), sscPingDestinationUnreachable (=10) or sscPingTimeExceeded (=20).

(optional) SourceOfResponse as Variant
A Variant variable of sub-type String which returns the IP-address from which the received response was sent. The variable will only hold a value if the method returns sscPingSuccess (=0), sscPingDestinationUnreachable (=10) or sscPingTimeExceeded (=20).

(optional) Timeout as Long
Number of milliseconds the method will wait for a response before it returns with sscPingTimeout (=30). If this parameter is not specified, a timeout value of 1000 milliseconds will be used.

(optional) TTL as Long
Time-to-Live (1-255) value of the echo request packet. If this parameter is not specified, the system default value (NT 4.0: 128) will be used.

(optional) BufferSize as Long
Size in bytes (1 - 64000) of dummy data to be contained in the echo request packet. If this parameter is not specified, a buffer size of 32 will be used.

Return Value

The method returns one of the following result codes:
Result Code Description
sscPingSuccess = 0 A valid ICMP Echo Response packet has been received.
sscPingDestinationUnreachable = 10 An ICMP Destination Unreachable packet has been received.
sscPingTimeExceeded = 20 An ICMP Time Exceeded packet has been received, which may be caused by a TTL value being too small.
sscPingTimeout = 30 No response has been received within the timeout period.
sscPingInvalidParameter = 100 On or more of the provided parameters contain an invalid value.
sscPingSocketError = 110 An WinSocket related error occurred.
sscPingInvalidHostAddress = 120 The specified host address (hostname or IP-address) is invalid.
Remarks

The response time is accurate to 10 milliseconds. This means that if the response time returned is 0, as many as 9 milliseconds may have passed.

The ping method uses the raw sockets feature of WinSock 2.x. On Windows NT 4.0 SP4+ and Windows 2000, the use of raw sockets is limited to administrators. This default behavior can be changed in case of Windows NT 4.0 but not in case of Windows 2000. More information can be found in KB-Article Q195445.

a139st
18-10-2010, 09:45
megaloman Спасибо Вы оказались правы. Действительно на компьютере установлен Win 2000Server. Я тут и пробовал, он у меня имеет выход в инет.
Код я запустил вот результат:
Set ip=192.168.0.5

ping %ip%

Обмен пакетами с 192.168.0.5 по 32 байт:

Превышен интервал ожидания для запроса.
Превышен интервал ожидания для запроса.
Превышен интервал ожидания для запроса.
Превышен интервал ожидания для запроса.

Статистика Ping для 192.168.0.5:
Пакетов: отправлено = 4, получено = 0, потеряно = 4 (100% потерь),
Приблизительное время передачи и приема:
наименьшее = 0мс, наибольшее = 0мс, среднее = 0мс
Echo ---------------------------------
---------------------------------
echo %ip% ErrorLevel=%ErrorLevel%
192.168.0.5 ErrorLevel=0
Echo ---------------------------------
---------------------------------
Pause

А проверят мне нужно на другом компе, где установлен Win 2003Server.
Там всё действительно работает.

Если не тяжело можно будет дополнить макрос следующим образом:
После проверки IP, если результат ОК, то проверить IP на 1 больше, пример IP 192.168.2.2 результат ОК проверить IP 192.168.2.3 и результат проверки записать в 16 столбец. А потом переход на следующую строку. Если после проверки IP результат Err, то сразу переход на следующую строку.
Дело в том, что за одним оборудованием установлено ещё одно, IP которого отличается от главного на 1. Если главный IP не виден то второй проверять нет смысла.
Заранее благодарен за помощь!

megaloman
18-10-2010, 19:39
Sub pinglan()
Begin = "N3" ' Клетка, с которой начинается просмотр адресов в таблице
N_Uzl = 2 ' Число подузлов, отлич на единицу в последнем октете
N_Ping = 8 ' Число запросов

Set WS = CreateObject("WScript.Shell")

ip = Range(Begin)
i = 0
Do While Len(Trim(ip)) <> 0
ipm = Split(ip, ".")
Range(Begin).Offset(i, 1) = "Тестирую ..."
Range(Begin).Offset(i, 2) = ""
Ret = WS.Run("cmd /C Ping -n " + CStr(N_Ping) + " " + ip, 0, True)

Msg = CStr(Date) + " " + CStr(Time)
Msg2 = ""
If Ret = 0 Then
Msg = Msg + " OK"
For j = 1 To N_Uzl
ip = CStr(ipm(0)) + "." + CStr(ipm(1)) + "." + CStr(ipm(2)) + "." + CStr(ipm(3) + j)
Ret = WS.Run("cmd /C Ping -n " + CStr(N_Ping) + " " + ip, 0, True)
Msg2 = Msg2 + ip
If Ret = 0 Then Msg2 = Msg2 + "-OK " Else Msg2 = Msg2 + "-Err "
Next
Else
Msg = Msg + " Err"
End If
Range(Begin).Offset(i, 1) = Msg
Range(Begin).Offset(i, 2) = Msg2

i = i + 1
ip = Range(Begin).Offset(i, 0)
Loop
End Sub

a139st
19-10-2010, 10:34
Всё работает, Спасибо!
Только число подузлов у меня только один, и нет смысла пинговать второй подузел, его нет.
Для этого как нужно изменит код? Сделать N_Uzl = 1 , этого хватает или ещё что нужно поменять?
Измените пожалуйста код.

ещё одна просьба что нужно сделать чтобы тестирование проходило не в фоновом режиме, а наглядно видеть, т.е. окошко cmd? какая команда в коде? (Чтобы мог самостоятельно менять)




© OSzone.net 2001-2012