Показать полную графическую версию : [решено] Нужно написать Батник который пингует DNS сервера.
desalmadoll@vk
24-07-2019, 08:10
Доброго Времени Суток Дорогие Друзья!
У меня возникли трудности в написание нужного мне батника. Суть его такова...
В Батнике прописаны 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
@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 @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
megaloman, Огромное вам спасибо!
desalmadoll@vk
27-07-2019, 07:18
megaloman, а можно сделать так,чтобы батник проверял 2 днс сервера и присваивал им значение DNS и DNS2
Допустим у меня есть Гугловские днс
8.8.8.8
8.8.4.4
megaloman
27-07-2019, 10:34
@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
@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
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.