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

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

moobi 03-12-2011 15:31 1808535

скрипт определения скорости соеденения интернета
 
вообщем задача такая: нужен скрипт который сможет узнать ип впн соеденения скорость на текущий момент и количество исходящего трафика.

moobi 03-12-2011 15:32 1808536

да и как узнать ip адрес маршутизатора? не могу пройти авторизацию и отпарсить страницу.

moobi 27-12-2011 02:45 1823066

хм такк не кто и не ответил(((

Dragokas 27-12-2011 12:21 1823267

Могу подсказать подход к решению:

Цитата:

Цитата moobi
узнать ип »

ipconfig /all
покажет Вам все ip, потом нужно будет фильтровать через |find

Цитата:

Цитата moobi
количество исходящего трафика »

Можно рассчитать исходя из данных, полученных через некоторый интервал времени командой
netstat -e

moobi 27-12-2011 12:53 1823309

пробовал ип то узнаю без проблем а вот траф не получаеться(((

moobi 27-12-2011 21:30 1823666

Цитата:

Цитата Diskretor
Можно рассчитать исходя из данных, полученных через некоторый интервал времени командой
netstat -e »

это решил но скорость так и не смог понять как отмониторить(((

Anonymоus 28-12-2011 00:59 1823811

moobi, например, вот вам решение на bat с использованием wget:
Код:

Set SpeedTestFile=http://dl.dropbox.com/u/11632454/speedtest/speedtest.dat
Wget %SpeedTestFile% -O "%Temp%\speedtest" 2>"%Temp%\wget.log"
For /F "tokens=2 delims=(" %%A In ('FindStr /R "%time:~-0,5%.*(" "%Temp%\wget.log"') Do (
        For /F "tokens=1 delims=)" %%B In ("%%A") Do (
                Set NetSpeed=%%B
                Del "%Temp%\wget.log">nul
                Del "%Temp%\speedtest">nul
        )
)
Echo %NetSpeed%

Соответственно, переменной SpeedTestFile присваиваете значение - ссылку на любой файл (от 2 до 10 мб, чем больше - тем точнее), расположенный на быстром сервере. Я для этого использую http://dl.dropbox.com/u/11632454/spe.../speedtest.dat
Результат оказывается у вас в переменной NetSpeed. Wget выводит скорость в килобайтах, не килобитах.

Цитата:

Цитата Diskretor
ipconfig /all »

Diskretor, возможно, ему требуется узнать внешний IP?

moobi, опять-таки вам пригодится wget:
Код:

wget http://automation.whatismyip.com/n09230945.asp -O ip.txt 2>nul
Set /P MyIP=<ip.txt
Echo %MyIP%


moobi 28-12-2011 01:03 1823817

Цитата:

Цитата Anonymоus
wget. »

Цитата:

Цитата Anonymоus
Соответственно, переменной SpeedTestFile присваиваете значение - ссылку на любой файл (от 2 до 10 мб, чем больше - тем точнее), расположенный на быстром сервере. Я для этого использую http://dl.dropbox.com/u/11632454/spe.../speedtest.dat
Результат оказывается у вас в переменной NetSpeed. Wget выводит скорость в килобайтах, не килобитах. »

хм не совсем понял способ(

Dragokas 28-12-2011 01:29 1823826

Wget есть бесплатная сторонняя утилита. Берется здесь http://gnuwin32.sourceforge.net/packages/wget.htm

moobi 28-12-2011 01:34 1823829

Цитата:

Цитата Diskretor
Wget есть бесплатная сторонняя утилита. Берется здесь http://gnuwin32.sourceforge.net/packages/wget.htm »

да она у меня есть . вопрос не в этом. смотрите:у меня к примеру дуаллап конект мне нужно узнать локальный ип конекта то есть тот который на компьютере. потом узнать скорость и кличество трафика и делать это раз к примеру в 10 сек. ваш способ как я понял показывать будет только макс скорость при скачке файла а мне не совсем это требуеться)

Anonymоus 28-12-2011 02:57 1823853

Ага, понятно, я немного не то решение подсказал. Тогда для определения IP и правда, лучше воспользоваться ipconfig, как подсказал товарищ Diskretor, а вот скорость и количество трафика - подсчитывается вот так
Код:

@Echo Off
SetLocal EnableDelayedExpansion
:: Добавляем директорию с бинарниками в path
Echo %Path%|Find "%CD%\bin">nul||Set Path=%Path%;%CD%\bin
:: Устанавливаем интервал обновления, в секундах
Set Refresh=5

:: Получаем IP (первый, из подходящей сети)
For /F "tokens=2 delims=:" %%I In ('IPConfig /All^|Find " 10.22"') Do (Set IP=%%~I&GoTo NetStatLoop)
Set OldIn=0&Set OldOut=0
:NetStatLoop
For /F "tokens=2,3 skip=3" %%A In ('netstat -e') Do (
Set In=%%A
Set Out=%%B
GoTo Break
)
:Break
:: Получаем статистику скачанного и переданного
For /F "tokens=1" %%A In ('gnucalc %In%/1024/1024') Do (
        :: Урезаем дробную часть
        For /F "tokens=1,2 delims=." %%B In ("%%A") Do (
                Set tmpString=%%C
                Set tmpString=!tmpString:~,2!
                Set TotalDownloadMB=%%B.!tmpString!
        )
)
For /F "tokens=1" %%A In ('gnucalc %Out%/1024/1024') Do (
        :: Урезаем дробную часть
        For /F "tokens=1,2 delims=." %%B In ("%%A") Do (
                Set tmpString=%%C
                Set tmpString=!tmpString:~,2!
                Set TotalUploadMB=%%B.!tmpString!
        )
)
:: Рассчитываем скорость
For /F "tokens=1" %%A In ('gnucalc ^(%In%/1024-%OldIn%/1024^)/%Refresh%') Do (
        :: Урезаем дробную часть
        For /F "tokens=1,2 delims=." %%B In ("%%A") Do (
                Set tmpString=%%C
                Set tmpString=!tmpString:~,2!
                Set DownloadSpeed=%%B.!tmpString!
        )
)
For /F "tokens=1" %%A In ('gnucalc ^(%Out%/1024-%OldOut%/1024^)/%Refresh%') Do (
        :: Урезаем дробную часть
        For /F "tokens=1,2 delims=." %%B In ("%%A") Do (
                Set tmpString=%%C
                Set tmpString=!tmpString:~,2!
                Set UploadSpeed=%%B.!tmpString!
        )
)
Set OldIn=%In%&Set OldOut=%Out%
Cls
:: Выводим статистику
Echo IP            : %IP%
Echo.
Echo Total download : %TotalDownloadMB% MB
Echo Total upload  : %TotalUploadMB% MB
Echo.
Echo Download speed : %DownloadSpeed% Kb\s
Echo Upload speed  : %UploadSpeed% Kb\s
Ping -n %Refresh% 127.0.0.1>nul
GoTo NetStatLoop

В скрипте используется калькулятор из пакета gnuwin32, чтобы обойти ограничения встроенного. Он переименован из calc.exe в gnucalc.exe, чтобы вместо него не вызывался стандартный виндовый калькулятор. Сам .exe калькулятора и две нужные для работы библиотеки должны лежать в директории bin рядом со скриптом. Вот, я залил их на обменник: http://rghost.ru/35638212
Таймаут между обновлениями выполнен на ping, чтобы не тянуть сторонние утилиты вроде nircmd

moobi 28-12-2011 03:09 1823856

то что нужно. скажите а есть какая нить команда для перехода батником по урлу без вывода страницы?
да ребят спасибо огромное выручили) и подкинули знаний)

Anonymоus 28-12-2011 03:11 1823857

Цитата:

Цитата moobi
какая нить команда для перехода батником по урлу без вывода страницы? »

Уже ответил в личку, но пусть и тут будет, может кому пригодится:
Код:

Start "" "http://google.com"
Открывается в браузере по умолчанию.

moobi 28-12-2011 03:16 1823859

Цитата:

Цитата Anonymоus
Start "" "http://google.com" »

в том то и дело что открывать арбузер ненужно) я так думаю вгет заюзать о чета у мну не вышло вот код нарыл но тут блин нужно вставлять урл а надо чтобы с того скрипта с скоростью и трафом вбивало их как переменные в зараннее приготовленный урл и запускало типа этого скрипта)
p.s вот код @Echo Off
Rem Устанавливает промежуток между запросами, в минутах
Set Timeout=10
Rem Устанавливаем количество запросов, после которого скрипт прекратит работу
Rem Если установить в 0, скрипт будет работать до закрытия его окна вручную
Set Counter=0
Color 70
Echo.
Echo.
Echo Enter URL:
Echo.
Set /P Url=^>
Set /A i=0
Set /A Wait=Timeout*10*10
:GetUrl
Cls
.\bin\wget --retry-connrefused --random-wait -nd -P tmp -U "Opera/9.80 (Windows NT 5.1; U; ru) Presto/2.6.30 Version/10.63" --keep-session-cookies -p %Url%
Echo.
Echo Страница была запрошена: %i% раз
.\bin\nircmdc wait %Wait%
Set /A i=i+1
If %i%==%Counter% Cls&Echo.&Echo Работа скрипта завершена&Pause&Exit
GoTo GetUrl

Anonymоus 28-12-2011 03:22 1823860

Покажи пример запроса, как он должен выглядеть? Я так понимаю, http://site.com/script.pl?task=somet...UF4bvuiGHDBj1S - что-то вроде этого?

UPD: Финальный, подправленный вариант скрипта - улучшен разбор значений скорости, добавлен подсчет среднего значения скорости, убран лишний пробел в IP. Добавлен запрос через wget, естественно, вместо реального url'a - пример.
Код:

@Echo Off
:: Anonymous, 2011
Color 1F
Mode CON Cols=35 Lines=9
Title LanStat
SetLocal EnableDelayedExpansion
:: Добавляем директорию с бинарниками в path
Echo %Path%|Find "%CD%\bin">nul||Set Path=%Path%;%CD%\bin
:: Интервал обновления статистики, в секундах
Set Refresh=1
:: Маска IP адреса (например, 192.168)
Set IPMask=10.54

:: Получаем IP (только один раз, при запуске)
IPConfig /All|Find " %IPMask%"|Find "IP">nul
If %ErrorLevel%==0 (
        For /F "tokens=2 delims=:" %%A In ('IPConfig /All^|Find " %IPMask%"^|Find "IP"') Do (Set IP=%%A)
        If "!IP:~,1!"==" " Set IP=!IP:~1!
) Else (
        Set IP=NOT FOUND
)

:NetStatLoop
:Break1
For /F "tokens=2,3 skip=3" %%A In ('netstat -e') Do (
Set In=%%A
Set Out=%%B
GoTo Break2
)
:Break2
Echo %IP%|Find "%IPMask%">nul||Set IP=OFFLINE
:: Получаем статистику скачанного и переданного
For /F "tokens=1" %%A In ('gnucalc %In%/1024/1024') Do (
        Call :Cut "%%A" "TotalDownloadMB"
)
For /F "tokens=1" %%A In ('gnucalc %Out%/1024/1024') Do (
        Call :Cut "%%A" "TotalUploadMB"
)

:: Рассчитываем скорость
For /F "tokens=1" %%A In ('gnucalc ^(%In%/1024-%OldIn%/1024^)/%Refresh%') Do (
        Call :Cut "%%A" "DownloadSpeed"
)
If %DownloadSpeed%==0.11 Set DownloadSpeed=0.0
For /F "tokens=1" %%A In ('gnucalc ^(%Out%/1024-%OldOut%/1024^)/%Refresh%') Do (
        Call :Cut "%%A" "UploadSpeed"
)
If %UploadSpeed%==0.11 Set UploadSpeed=0.0

:: Рассчитываем среднюю скорость
Set AverageDownSpeed=!DownloadSpeed!:%AverageDownSpeed%
For /F "tokens=1,2,3,4,5,6,7,8,9,10 delims=:" %%A In ("%AverageDownSpeed%") Do (
        For /F "tokens=1" %%L In ('gnucalc ^(%%A+%%B+%%C+%%D+%%E+%%F+%%G+%%H+%%I+%%J^)/10 2^>nul') Do (
                Call :Cut "%%L" "AvgDownload"
        )
        Set AverageDownSpeed=%%A:%%B:%%C:%%D:%%E:%%F:%%G:%%H:%%I:%%J
        If "!AvgDownload!"=="" Set AvgDownload=Calculating...
        If Not !AvgDownload!==Calculating... Set AvgDownload=!AvgDownload! Kb\s
)
Set AverageUpSpeed=!UploadSpeed!:%AverageUpSpeed%
For /F "tokens=1,2,3,4,5,6,7,8,9,10 delims=:" %%A In ("%AverageUpSpeed%") Do (
        For /F "tokens=1" %%L In ('gnucalc ^(%%A+%%B+%%C+%%D+%%E+%%F+%%G+%%H+%%I+%%J^)/10 2^>nul') Do (
                Call :Cut "%%L" "AvgUpload"
        )
        Set AverageUpSpeed=%%A:%%B:%%C:%%D:%%E:%%F:%%G:%%H:%%I:%%J
        If "!AvgUpload!"=="" Set AvgUpload=Calculating...
        If Not !AvgUpload!==Calculating... Set AvgUpload=!AvgUpload! Kb\s
)

Set OldIn=%In%&Set OldOut=%Out%
Cls
:: Выводим статистику
Echo IP              : %IP%
Echo Total download  : %TotalDownloadMB% Mb
Echo Total upload    : %TotalUploadMB% Mb
Echo.
Echo Download speed  : %DownloadSpeed% Kb\s
Echo Upload speed    : %UploadSpeed% Kb\s
Echo Average download : %AvgDownload%
Echo Average upload  : %AvgUpload%

:: Отсылаем данные
:: wget --retry-connrefused -O post.txt --keep-session-cookies -U "Mozilla/5.0 (Windows NT 5.1; rv:6.0.2) Gecko/20100101 Firefox/6.0.2" "http://site.ru/&ip=%IP%&speed=%UploadSpeed%&param=value" 2>nul&Del post.txt

:Задержка между циклами
Ping -n %Refresh% 127.0.0.1>nul
GoTo NetStatLoop

:Cut
:: Урезаем дробную часть
For /F "tokens=1,2 delims=." %%A In ("%~1") Do (
        Set tmpA=%%A
        If "!tmpA:~,1!"=="~" Set tmpA=!tmpA:~1!
        If "!tmpA:~,1!"=="-" Set tmpA=!tmpA:~1!
        Set tmpB=%%B
        If "!tmpB:~,1!"=="~" Set tmpB=!tmpB:~1!
        If "!tmpB:~,1!"=="-" Set tmpB=!tmpB:~1!
        If "!tmpB!"=="" Set tmpB=0
        Set tmpB=!tmpB:~,2!
        Set %~2=!tmpA!.!tmpB!
)
Exit /B


serraxer 29-12-2011 05:07 1824598

как же долго искал, то что нужно.
Anonymоus можете подсказать, как правильно добавить
netsh interface set interface local disabled
netsh interface set interface local enabled
чтобы при скорости меньше 50 кбит сек сеть перезапускалась, а мониторинг продолжается.

Anonymоus 29-12-2011 19:11 1825087

Obsidian-step, я так понял, вам нужно замерять не текущую скорость соединения, как это сделано в посте #15, а приблизительную максимальную в один поток, так ведь? Иначе, при простое, когда соединение будет нагружено меньше 50кб\с, оно будет постоянно перезапускаться.

Вот, написал кое-что. Для работы требует wget, все тот же calc.exe из набора утилит gnuwin32 (переименованый в gnucalc.exe) и nircmd. Все должно лежать в директории bin рядом со скриптом.
Скачать требуемые файлы с RGhost

Требования к файлу для проверки скорости: должен располагаться на быстром сервере (чтобы измерение не упиралось в максимальную скорость отдачи на 1 поток самого сервера), должен быть размером не менее 1 мб (а желательно - от 2 до 10) для обеспечения приемлемой точности.

Код:

@Echo Off
:: Добавляем директорию с бинарниками в path
Echo %Path%|Find "%CD%\bin">nul||Set Path=%Path%;%CD%\bin
:: Период обновления, в минутах
Set Refresh=2
:: Устанавливаем файл для проверки (2-10 мб, на быстром хосте)
Set SpeedTestFile=http://support.satgate.net/dl_test/dl/5MB.bin
:: Нижний порог скорости, при опускании ниже этого предела - реконнект сети. (В кб\с)
Set MinSpeed=50

Call :ParseTimestamp %time:~-0,8%
Call :SerializeTime
Set StartedAt=%ErrorLevel%
Set Timestamp=%date% %time:~-0,8%
Set /A Refresh=Refresh*60*1000
:Loop
:: Замеряем время
Call :ParseTimestamp %time:~-0,8%
Call :SerializeTime
Set StartDL=%ErrorLevel%

:: Получаем файл
wget %SpeedTestFile% -O "%Temp%\speedtest.dat" 1>&2 2>nul||(Call :Reconnect&GoTo Loop)

:: Получаем его размер (получение размера напрямую, через переменную - не работает)
For /F "tokens=*" %%A In ('Dir "%Temp%\speedtest.dat" /A-D^|Find "speedtest.dat"') Do (
        For /F "tokens=3" %%S In ("%%A") Do (Set TestFileSize=%%S)
        rem Del %Temp%\speedtest.dat
)
:: Вырезаем псевдопробелы
Set TestFileSize=%TestFileSize:я=%

:: Получаем затраченное на скачивание время
Call :Timer %StartDL%
Set DLTime=%ErrorLevel%

:: Рассчитываем скорость
SetLocal EnableDelayedExpansion
For /F "tokens=*" %%A In ('gnucalc ^(%TestFileSize%/1024^)/%DLTime%') Do (
        For /F "tokens=1,2 delims=." %%A In ("%%A") Do (
                Set tmpA=%%A
                If "!tmpA:~,1!"=="~" Set tmpA=!tmpA:~1!
                If "!tmpA:~,1!"=="-" Set tmpA=!tmpA:~1!
                Set tmpB=%%B
                If "!tmpB:~,1!"=="~" Set tmpB=!tmpB:~1!
                If "!tmpB:~,1!"=="-" Set tmpB=!tmpB:~1!
                If "!tmpB!"=="" Set tmpB=0
                Set tmpB=!tmpB:~,2!
                Set DisplayedSpeedKBs=!tmpA!.!tmpB!
                If !tmpB! GEQ 50 Set /A tmpA+=1
                Set SpeedKBs=!tmpA!
        )
)

:: Проверяем, не слишком ли низкая скорость
If %SpeedKBs% LSS %MinSpeed% (Call :Reconnect&GoTo Loop)

:: Выводим состояние
Call :Timer %StartedAt%
Call :DeserializeTime %ErrorLevel%
Cls
Title Download speeed: %DisplayedSpeedKBs% Kb\s
Echo  Started at      : %Timestamp%
Echo  Elapsed time    : %ED% days, %DHH%:%DMM%:%DSS%
Echo  Connection speed : %DisplayedSpeedKBs% Kb\s
NircmdC wait %Refresh%
GoTo Loop

:: Перезапуск сети
:Reconnect
netsh interface set interface local disabled
netsh interface set interface local enabled
Exit /B

::===Функции работы со временем в .bat====================================
:: libTime.cmd, Anonymous, 2010
:ParseTimestamp
:: Разбирает на составляющие временную метку формата ЧЧ:ММ:СС
:: Формат:  Call :ParseTimestamp (время)
:: Вывод - в переменные HH MM и SS
For /F "tokens=1,2,3 delims=:" %%A In ("%1") Do (
Set HH=%%A
Set MM=%%B
Set SS=%%C
)

:SerializeTime
:: Сериализует время из переменных HH MM и SS
:: Вывод - в ErrorLevel
Set /A STime=(HH*60*60)+(MM*60)+SS
Exit /B %STime%

:DeserializeTime
:: Десериализует время, приводит его к стандартному формату
:: Формат:  Call :DeserializeTime (сериализованное время)
:: Вывод - в переменные DHH DMM и DSS
Set /A DHH=%1/60/60
Set /A DMM=(%1/60)-(DHH*60)
Set /A DSS=%1-(DHH*60*60)-(DMM*60)
If %DHH%==24 Set DHH=00
If %DHH% LSS 10 Set DHH=0%DHH%
If %DMM% LSS 10 Set DMM=0%DMM%
If %DSS% LSS 10 Set DSS=0%DSS%
Exit /B

:TMinus
:: Функция вычитания для сериализованного времени
:: Формат:  Call :TMinus (сериализованное время) (сколько секунд отнять)
:: Вывод - в ErrorLevel
Set /A Result=%1-%2
If %2 GTR %1 (
Set /A Result=86400+%1-%2
)
Exit /B %Result%

:TPlus
:: Функция прибавления для сериализованного времени
:: Формат:  Call :TPlus (сериализованное время) (сколько секунд прибавить)
:: Вывод - в ErrorLevel
Set /A Result=%1+%2
If %Result% GTR 86400 (
Set /A Result=%1+%2-86400
)
Exit /B %Result%

:Timer
:: Отсчитывает прошедшее с заданного момента время
:: Формат:  Call :Timer (запомненное сериализованное время)
:: Вывод - в ErrorLevel
:: Если счетчик переходит границу суток, число дней возрастает на 1
:: Дни выводятся в переменную ED (и накапливаются) // да, знаю, что костыль и быдлокод
Set OTime=%1
If "%ED%"=="" Set ED=0
Call :ParseTimestamp %time:~-0,8%
Call :SerializeTime
Set CTime=%ErrorLevel%
If %OTime% GTR %CTime% (
Set /A Timer=86400-%OTime%+%CTime%
Set /A ED+=1
) Else (
Set /A Timer=CTime-OTime
)
Exit /B %Timer%

:Timer2
:: Проверяет, прошел ли заданный промежуток времени
:: Формат:  Call :Timer2 (запомненное сериализованное время) (промежуток в секундах)
:: Вывод - в ErrorLevel (только 0=промежуток истёк или 1=промежуток ещё не истёк)
Call :ParseTimestamp %time:~-0,8%
Call :SerializeTime
Call :TMinus %ErrorLevel% %1
If %2 GTR %ErrorLevel% Exit /B 1
Exit /B 0
::========================================================================


serraxer 30-12-2011 17:56 1825707

Anonymоus нет нет, как раз наоборот, больше всего даже подходит пример из пост #11, при простое задача будет сниматься. скрипт нужен для поддержания нагрузки на модеме.


Запускается мониторинг трафика

ждём 5 сек для накопления статистики

:: Проверяем, не слишком ли низкая скорость, если да то
:: Перезапуск сети

продолжаем мониторинг.
добавил вот эти строки работает, но появилась проблема скрипт через некоторое время если отключить сеть завершает свою работу. как правильно зациклить?
Спойлер

Код:

:: Проверяем, не слишком ли низкая скорость
If %DownloadSpeed% LSS %MinSpeed% (Call :Reconnect&GoTo NetStatLoop)


GoTo NetStatLoop

:: Перезапуск сети
:Reconnect
netsh interface set interface "mts rus" disabled
netsh interface set interface "mts rus" enabled
GoTo NetStatLoop


Anonymоus 31-12-2011 00:58 1825929

Obsidian-step, сделал нужный вам вариант, минимальная скорость задается в начале, возле частоты обновления. Заодно подправил вывод средней скорости, теперь отсчет идет именно по ней. Для ее рассчета нужна задержка длинной "частота обновления*10". Из зависимостей - все тот же gnucalc.exe. Специально протестировал в течении пары часов при отключенной сети, скрипт не падает.


Код:

@Echo Off
:: Anonymous, 2011
SetLocal EnableDelayedExpansion
Mode CON Cols=35 Lines=10
Title LanStat
Color 1F
:: Добавляем директорию с бинарниками в path
Echo %Path%|Find "%CD%\bin">nul||Set Path=%Path%;%CD%\bin

:: Интервал обновления статистики, в секундах
Set Refresh=2
:: Маска IP адреса (например, 192.168)
Set IPMask=10.54
:: Минимальная скорость, в Кб\с
Set MinSpeed=20

Set i=0
:: Получаем IP (только один раз, при запуске)
IPConfig /All|Find " %IPMask%"|Find "IP">nul
If %ErrorLevel%==0 (
        For /F "tokens=2 delims=:" %%A In ('IPConfig /All^|Find " %IPMask%"^|Find "IP"') Do (Set IP=%%A)
        If "!IP:~,1!"==" " Set IP=!IP:~1!
) Else (
        Set IP=NOT FOUND
)

:NetStatLoop
For /F "tokens=2,3 skip=3" %%A In ('netstat -e') Do (
Set In=%%A
Set Out=%%B
GoTo Break2
)
:Break2
:: Получаем статистику скачанного и переданного
For /F "tokens=1" %%A In ('gnucalc %In%/1024/1024') Do (
        Call :Cut "%%A" "TotalDownloadMB"
)
For /F "tokens=1" %%A In ('gnucalc %Out%/1024/1024') Do (
        Call :Cut "%%A" "TotalUploadMB"
)

:: Рассчитываем скорость
For /F "tokens=1" %%A In ('gnucalc ^(%In%/1024-%OldIn%/1024^)/%Refresh%') Do (
        Call :Cut "%%A" "DownloadSpeed"
)
If %DownloadSpeed%==0.11 Set DownloadSpeed=0.0
For /F "tokens=1" %%A In ('gnucalc ^(%Out%/1024-%OldOut%/1024^)/%Refresh%') Do (
        Call :Cut "%%A" "UploadSpeed"
)
If %UploadSpeed%==0.11 Set UploadSpeed=0.0

:: Рассчитываем среднюю скорость
If Not %i% GTR 10 (Set /A i+=1)
Set AverageDownSpeed=!DownloadSpeed!:%AverageDownSpeed%
For /F "tokens=1,2,3,4,5,6,7,8,9,10 delims=:" %%A In ("%AverageDownSpeed%") Do (
        For /F "tokens=1" %%L In ('gnucalc ^(%%A+%%B+%%C+%%D+%%E+%%F+%%G+%%H+%%I+%%J^)/10 2^>nul') Do (
                Call :Cut "%%L" "AvgDownload"
        )
        Set AverageDownSpeed=%%A:%%B:%%C:%%D:%%E:%%F:%%G:%%H:%%I:%%J
        If Not %i% GTR 10 (Set AvgDownload=N\A)
)
Set AverageUpSpeed=!UploadSpeed!:%AverageUpSpeed%
For /F "tokens=1,2,3,4,5,6,7,8,9,10 delims=:" %%A In ("%AverageUpSpeed%") Do (
        For /F "tokens=1" %%L In ('gnucalc ^(%%A+%%B+%%C+%%D+%%E+%%F+%%G+%%H+%%I+%%J^)/10 2^>nul') Do (
                Call :Cut "%%L" "AvgUpload"
        )
        Set AverageUpSpeed=%%A:%%B:%%C:%%D:%%E:%%F:%%G:%%H:%%I:%%J
        If Not %i% GTR 10 (Set AvgUpload=N\A)
)

Set OldIn=%In%&Set OldOut=%Out%
Cls
:: Выводим статистику
Echo.
Echo  IP              : %IP%
Echo  Total download  : %TotalDownloadMB% Mb
Echo  Total upload    : %TotalUploadMB% Mb
Echo.
Echo  Download speed  : %DownloadSpeed% Kb\s
Echo  Upload speed    : %UploadSpeed% Kb\s
Echo  Average download : %AvgDownload% Kb\s
Echo  Average upload  : %AvgUpload% Kb\s

:: Задержка между циклами
Ping -n %Refresh% 127.0.0.1>nul

:: Проверка скорости
If %i% GTR 10 (
        For /F "tokens=1,2 delims=." %%A In ("%AvgDownload%") Do (
                Set ConnectionSpeed=%%A
                If %%B GEQ 50 Set /A ConnectionSpeed+=1
                :: Если ниже заданного порога, делаем реконнект
                If %MinSpeed% GTR !ConnectionSpeed! (
                        netsh interface set interface "mts rus" disabled
                        netsh interface set interface "mts rus" enabled
                )
        )
)


GoTo NetStatLoop

:Cut
:: Урезаем дробную часть
For /F "tokens=1,2 delims=." %%A In ("%~1") Do (
        Set tmpA=%%A
        If "!tmpA:~,1!"=="~" Set tmpA=!tmpA:~1!
        If "!tmpA:~,1!"=="-" Set tmpA=!tmpA:~1!
        Set tmpB=%%B
        If "!tmpB:~,1!"=="~" Set tmpB=!tmpB:~1!
        If "!tmpB:~,1!"=="-" Set tmpB=!tmpB:~1!
        If "!tmpB!"=="" Set tmpB=0
        Set tmpB=!tmpB:~,2!
        Set %~2=!tmpA!.!tmpB!
)
Exit /B



Время: 22:25.

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