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

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

desalmadoll@vk 24-07-2019 08:10 2881192

Нужно написать Батник который пингует DNS сервера.
 
Доброго Времени Суток Дорогие Друзья!

У меня возникли трудности в написание нужного мне батника. Суть его такова...

В Батнике прописаны DNS Сервера. Допустим их штук 10 и нужно сделать так,чтобы батник пропинговал все эти DNS Сервера и вычислил средний пинг. Далее батник выбирает наилучший результат и присваивает ему переменную (например: DNS),чтобы в дальнейшем я мог поставить это значение в регедит.

Пример: for /f "usebackq" %%i in (`reg query HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\Interfaces`) do (
Reg.exe add %%i /v "NameServer" /t REG_SZ /d "%DNS1%,%DNS2%" /f
)

Извините если как-то не так объяснил. Надеюсь мою задумку все поняли.

megaloman 25-07-2019 12:14 2881330

батник пропинговал все эти DNS Сервера и вычислил средний пинг. Далее батник выбирает наилучший результат и присваивает ему переменную (например: DNS)
Код:

@Echo Off
cls
chcp 866 >nul
       
        Set "@DNS01=82.209.240.241"
        Set "@DNS02=82.209.243.241"
        Set "@DNS03=82.209.253.2"
        Set "@DNS04=193.232.248.2"
        Set "@DNS05=194.158.204.238"
        Set "@DNS06=82.209.195.12"
        Set "@DNS07=82.209.213.51"
        Set "@DNS08=82.209.213.56"
        Set "@DNS09=194.158.206.206"
        Set "@DNS10=194.158.206.205"
        Set "@DNS11=86.57.160.65"
        Set "@DNS12=86.57.160.66"
        Set "@DNS13=82.209.200.16"
        Set "@DNS14=82.209.200.17"

        Set /A tminDNS=999999999
        Set /A DNS=9999

        Set /A nCount=4

        FOR /F "usebackq tokens=2 delims==" %%i IN (`Set "@DNS"`) DO (
                FOR /F "usebackq tokens=4 delims==" %%t IN (`Ping -4 -n %nCount% %%i`) DO (
                        Set tDNS=%%t
                )
                Call :minDNS %%i %%tDNS%%
        )
       
        If %DNS%==9999 (Echo !!! No  DNS-server found &Pause &Exit /b 2)
        Echo === Best DNS-server %DNS%  (%tminDNS%ms)
Pause
Exit /B

:minDNS
        If "%3"=="" (Echo !!! %1 not found &Exit /B 2)
        Echo +++ %1 %2ms
        If %tminDNS% LEQ %2 Exit /B 1

        Set /A tminDNS=%2
        Set "DNS=%1"
Exit /B

Если не надо отображение процесса выполнения, уберите красное.
Выбирайте сами число запросов в Ping - это сильно влияет на время, например
Set /A nCount=2
Вместо Ping WMIC
Код:

@Echo Off
cls
        Set "@DNS01=82.209.240.241"
        Set "@DNS02=82.209.243.241"
        Set "@DNS03=82.209.253.2"
        Set "@DNS04=193.232.248.2"
        Set "@DNS05=194.158.204.238"
        Set "@DNS06=82.209.195.12"
        Set "@DNS07=82.209.213.51"
        Set "@DNS08=82.209.213.56"
        Set "@DNS09=194.158.206.206"
        Set "@DNS10=194.158.206.205"
        Set "@DNS11=86.57.160.65"
        Set "@DNS12=86.57.160.66"
        Set "@DNS13=82.209.200.16"
        Set "@DNS14=82.209.200.17"

        Set /A tminDNS=999999999
        Set /A DNS=9999

        FOR /F "usebackq tokens=2 delims==" %%a IN (`Set "@DNS"`) DO (
                FOR /F "usebackq skip=1 tokens=1,2,3 delims= " %%i IN (`"wmic path Win32_PingStatus where address='%%a' get address,responsetime,statuscode,timeout"`) DO (
                        If %%a==%%i Call :minDNS %%i %%j %%k
                )
        )
       
        If %DNS%==9999 (Echo !!! No  DNS-server found &Pause &Exit /b 2)
        Echo === Best DNS-server %DNS%  (%tminDNS%ms)
Pause
Exit /B

:minDNS
        If Not %3==0 (Echo !!! %1 not found &Exit /B 2)
        Echo +++ %1 %2ms
        If %tminDNS% LEQ %2 Exit /B 1

        Set /A tminDNS=%2
        Set "DNS=%1"
Exit /B

Не знаю, какое тут время отклика, скорее всего по результату разового запроса, зато голова не болит о кодовой странице по умолчанию в системе и где какие пробелы в выдаче команды Ping

desalmadoll@vk 26-07-2019 09:28 2881412

megaloman, Огромное вам спасибо!

desalmadoll@vk 27-07-2019 07:18 2881557

megaloman, а можно сделать так,чтобы батник проверял 2 днс сервера и присваивал им значение DNS и DNS2
Допустим у меня есть Гугловские днс
8.8.8.8
8.8.4.4

megaloman 27-07-2019 10:34 2881581

Рассортируем все Ваши DNS по времени отклика и присвоим их IP переменным DNS01, DNS02, ...
Код:

@Echo Off
cls
chcp 866 >nul
        Set /A nCount=2
       
        Set /A nDNS=0, totalDNS=0
       
        Call :DNS 82.209.240.241
        Call :DNS 172.209.240.241
        Call :DNS 82.209.243.241
        Call :DNS 82.209.253.2
        Call :DNS 193.232.248.2
        Call :DNS 194.158.204.238
        Call :DNS 82.209.195.12
        Call :DNS 172.209.240.241
        Call :DNS 82.209.213.51
        Call :DNS 82.209.213.56
        Call :DNS 194.158.206.206
        Call :DNS 194.158.206.205
        Call :DNS 86.57.160.65
        Call :DNS 86.57.160.66
        Call :DNS 82.209.200.16
        Call :DNS 82.209.200.17

        Set /A M=100
        FOR /F "usebackq tokens=2 delims==" %%i IN (`Set "@@@"`) DO (
                Set /A M+=1
                Call Set "DNS%%M:~1%%=%%i"
        )

        Echo. &Echo === %totalDNS% DNS polled, responded %nDNS%, sorted by response time
        Set "DNS"
        Echo ===

        Echo DNS01=%DNS01%    DNS02=%DNS02%
Pause
Exit /B

:DNS
        Set /A totalDNS+=1
        FOR /F "usebackq tokens=4 delims==" %%t IN (`Ping -4 -n %nCount% %1`) DO Set tDNS=%%t
        Call :AllDNS %1 %tDNS%
Exit /B

:AllDNS
        If "%3"=="" (Echo !!! %1 not found &Exit /B 2)
        Echo +++ %1 %2ms
       
        Set /A nDNS+=1
        Set /A NN=(100000+%2)*1000+%nDNS%
        Set "@@@%NN%=%1"
Exit /B

wmic
Код:

@Echo Off
cls
        Set /A nCount=2
       
        Set /A nDNS=0, totalDNS=0
       
        Call :DNS 82.209.240.241
        Call :DNS 172.209.240.241
        Call :DNS 82.209.243.241
        Call :DNS 82.209.253.2
        Call :DNS 193.232.248.2
        Call :DNS 194.158.204.238
        Call :DNS 82.209.195.12
        Call :DNS 172.209.240.241
        Call :DNS 82.209.213.51
        Call :DNS 82.209.213.56
        Call :DNS 194.158.206.206
        Call :DNS 194.158.206.205
        Call :DNS 86.57.160.65
        Call :DNS 86.57.160.66
        Call :DNS 82.209.200.16
        Call :DNS 82.209.200.17
        Call :DNS 82.209.200.17
        Call :DNS 8.8.8.8
        Call :DNS 8.8.4.4

        Set /A M=100
        FOR /F "usebackq tokens=2 delims==" %%i IN (`Set "@@@"`) DO (
                Set /A M+=1
                Call Set "DNS%%M:~1%%=%%i"
        )

        Echo. &Echo === %totalDNS% DNS polled, responded %nDNS%, sorted by response time
        Set "DNS"
        Echo ===

        Echo DNS01=%DNS01%    DNS02=%DNS02%
Pause
Exit /B

:DNS
        Set /A totalDNS+=1
        FOR /F "usebackq skip=1 tokens=1,2,3 delims= " %%i IN (`"wmic path Win32_PingStatus where address='%1' get address,responsetime,statuscode,timeout"`) DO (
                If %1==%%i Call :AllDNS %%i %%j %%k
        )
Exit /B

:AllDNS
        If Not %3==0 (Echo !!! %1 not found &Exit /B 2)
        Echo +++ %1 %2ms
       
        Set /A nDNS+=1
        Set /A NN=(100000+%2)*1000+%nDNS%
        Set "@@@%NN%=%1"
Exit /B



Время: 23:23.

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