Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   Расчет Средне-арифметического процента потери связи в BAT (http://forum.oszone.net/showthread.php?t=177632)

registeruser1 08-06-2010 07:24 1429777

Расчет Средне-арифметического процента потери связи в BAT
 
Доброго дня уважаемые гуру...
Помогите пож-ста.

Пытаюсь сделать небольшую систему, которая бы грубо говоря пингами проверяла бы наличие связи. Состоит она вся из батников.
В кратце - пингует, если пинги не прошли пишет логи и отсылает на мыло - это я сделал, отладил - все работает.
Вторая часть этой системы - статистический модуль который тоже пингует объект, создает папки, в них пишет ежедневные логи и на основе ежедневных
логов выводит в отдельном файле txt ежемесячный лог с подсчетом средне-арифметического процента потери связи за месяц.
Потом пишет этот ежемесячный отчет в htm файл и отправляет на мыло...
Так вот со второй частью у меня проблемы возникли.
Не правильно ведет подсчет ежемесячных потерь и пишет ошибку "Missing operator".

Вот весь код -

Код:

@echo off
SetLocal EnableDelayedExpansion
:ping
cls
set /a day_sum=0
set /a day_count=0
set /a mes_sum=0
set /a mes_count=0
set /A count=count+1
Title Pinging number %count%
set "site=127.255.255.255"
set "mes=%date:~-7%"
1>nul 2>&1 MD "%systemdrive%\AN-80\%mes%\%date%"
set "Log=%systemdrive%\AN-80\%mes%\%date%\log.txt"
for /f "tokens=2 delims=()" %%a in ('ping -n 4 %site%') do echo.%date% %time:~,8% %%a>> %log%
for /f "tokens=3 delims=%% " %%a in (%systemdrive%\AN-80\%mes%\%date%\log.txt) do set /a day_sum=!day_sum!+%%a*100 & set /a day_count=!day_count!+1
set /a day_average=(%day_sum%)/(%day_count%)+10000
set /a day_average_int=!day_average:~0,-2!-100
echo.>> %systemdrive%\AN-80\%mes%\Monthly-report.txt
echo Средне-арифметический процент потери связи за %date% составил - %day_average_int%.%day_average:~-2%%%> %systemdrive%\AN-80\%mes%\%date%\Daily-report.txt
echo.> %systemdrive%\AN-80\%mes%\Monthly-report.txt
for /r %systemdrive%\AN-80\%mes% %%a in (Daily-report.txt) do if exist %%a type %%a>> %systemdrive%\AN-80\%mes%\Monthly-report.txt

for /f "tokens=9 delims=%% " %%a in (%systemdrive%\AN-80\%mes%\Monthly-report.txt) do set /a mes_sum=!mes_sum!+%%a*100 & set /a mes_count=!mes_count!+1
set /a mes_average=(%mes_sum%)/(%mes_count%)+10000
set /a mes_average_int=!mes_average:~0,-2!-100

echo.>> %systemdrive%\AN-80\%mes%\Monthly-report.txt
echo>> %systemdrive%\AN-80\%mes%\Monthly-report.txt -------------------------------------------------------------------------
echo Средне-арифметический процент потери связи за %mes% составляет - %mes_average_int%.%mes_average:~-2%%%>> %systemdrive%\AN-80\%mes%\Monthly-report.txt
goto :ping

for /f "tokens=9 delims=%% " %%a in (%systemdrive%\AN-80\%mes%\Monthly-report.txt) do set /a mes_sum=!mes_sum!+%%a*100 & set /a mes_count=!mes_count!+1
set /a mes_average=(%mes_sum%)/(%mes_count%)+10000
set /a mes_average_int=!mes_average:~0,-2!-100


Получается что он не считает правильно Monthly-report.txt из-за этой строки...

IP адрес специально выставил такой после нескольких проходов будет видно не правильные расчеты...
Средне-арифметический процент у меня вычисляется путем суммирования всех чисел, в данном случае - %, делённая на их количество.


Очень надеюсь на вашу помощь и буду очень признателен...

NiOl 08-06-2010 12:32 1429902

Первое, что бросается в глаза - нехватает включения расширений команд: SetLocal EnableExtensions

registeruser1 08-06-2010 12:44 1429907

Цитата:

Цитата NiOl
Первое, что бросается в глаза - нехватает включения расширений команд: SetLocal EnableExtensions »

...есть в самом верху.

Код:

@echo off
SetLocal EnableDelayedExpansion
:ping


amel27 10-06-2010 12:07 1431413

Цитата:

Цитата registeruser1
Missing operator »

батники поддерживают арифметику только с целыми числами, тут сохранение (%%a):
Код:

echo Средне-арифметический процент потери связи за %date% составил - %day_average_int%.%day_average:~-2%%%> %systemdrive%\AN-80\%mes%\%date%\Daily-report.txt
тут использование:
Код:

set /a mes_sum=!mes_sum!+%%a*100

NiOl 10-06-2010 13:25 1431474

1. Позволю себе ткнуть пальцем:
EnableExtensions - включает режим, при котором у комманд появляются расширенные возможности, например можно будет пользоваться арифметикой.
EnableDelayedExpansion - включает очень полезный режим, при котором можно пользоваться переменными внутри циклов и блоков условий, а также использовать переменные как индексы при обработке других переменных (правда при всех плюсах этот режим может стать причиной нежелательных изменений данных и как следствие - появление глючков).

2. По самому тексту - не очень то понятна логика Ваших подстчетов. Уточните пожалуйста, не является ли он компиляцией двух отдельных - пинга и анализа статистики (блок анализа похож на отдельный, вызываемый раз в день)

3. Есть некритичные замечания по тексту:
- set "site=127.255.255.255" - лучше писать set site=127.255.255.255 и в некотрых необходимых случаях set site="127.255.255.255"
- эта конструкция 1>nul 2>&1 MD "%systemdrive%\AN-80\%mes%\%date%" мне непонятна. Просто перенаправление сообщений? Если "да", то почему так?
- На кой нужна точность в сотые доли от процента? Да и вообще, вместо оценки доступности за 1 раз (4 посыла пинга за раз) наверно хватило бы пинговать только 1 раз. В Вашем случае получается различие статистики - 100% потерь означает недоступность одного ресурса (возможно из-за отсутствия иНета, а может и нет - для этого надо проверять несколько ресурсов), а в случае меньшего процента потерь однозначно говорит, что иНет есть, а вот его "качество" или надедность пингуемого ресурса "не очень".
- Каждый пинг сопровождается рассчетом с пробегом по всему логу... понятно, чем это кончается для сервака и времени между очередными пингами к концу дня... Возможно вы так поступили, чтобы при смене дат в каталоге остался последний результат... при этом каждый раз удаляете месячный отчет а в конце пытаетесь подбить по нему итоги...

Думаю Вы стали жертвой постоянных "улучшений и дописываний кода" - это тупиковая ветвь. По хорошему, если для Вас это важно - предлагаю сесть и серьезно проработать техническое задание и формат данных, выложить все сюда с кусками уже отлаженного кода (типа отсылки мыла) и уже вместе пытаться сделать новый рабочий отчет "все в одном". Не скажу, что это будет быстро и легко, но меньше будет непоняток.


Время: 18:18.

Время: 18:18.
© OSzone.net 2001-