Board logo

标题: [网络连接] 求助批处理自动检测DNS并设定最佳DNS的代码 这段代码出现问题 [打印本页]

作者: 22123    时间: 2022-11-11 06:12     标题: 求助批处理自动检测DNS并设定最佳DNS的代码 这段代码出现问题

新人小白求助各位大大  本人之前求助 得到论坛@Echo11大大的一段 自动检测DNS并设定最佳DNS的代码,目前遇到个问题
就是这段代码执行后,除了第一个ip显示正常,接下去的几个ip检测都会失败,显示全部丢失.最终只会添加第一个正常的ip到dns中.
好像是这句【IF not %errorlevel%==0 ECHO.%~1 全部丢失!&GOTO:EOF】有问题?还是怎么回事 哪位大大能帮助下 改正确?谢谢了
还有CALL: pingDNS 8.8.8.88是我做ping不通测试的ip 貌似这个ip ping不通不会显示 全部丢失!要放第一个位置 还会自动被加入到主DNS 相当于ping不通的ip会加入到dns里

我希望是比如有6个ip 各ping 4次 只要有ip的ping包 丢失大于1次就不把 这个ip 写入到dns .但其他ip正确能4次都ping通的,不丢包的ip按照ms最快的排序 依次加入到 "WLAN"中,而不是有一个ip错误就全都放弃


代码如下↓ 求助大大们能帮我修正下这个问题 谢谢
  1. @ECHO off
  2. ECHO.提示:netsh 需要管理员权限,请以管理员权限运行本脚本.
  3. setlocal EnableDelayedExpansion
  4. SET "IP1="
  5. SET "IP2="
  6. SET "IP3="
  7. ECHO.请稍等...&ECHO.
  8. CALL :PingDNS 223.5.5.5
  9. CALL :PingDNS 114.114.114.114
  10. CALL :PingDNS 180.76.76.76
  11. CALL :PingDNS 119.29.29.29
  12. CALL :PingDNS 8.8.8.8
  13. ECHO.执行以下命令:
  14. IF defined IP1 netsh int ip add dns "WLAN" %IP1% index=1
  15. IF defined IP2 netsh int ip add dns "WLAN" %IP2% index=2
  16. IF defined IP3 netsh int ip add dns "WLAN" %IP3% index=3
  17. pause
  18. GOTO:EOF
  19. :PingDNS <dnsIP>
  20. for /f "tokens=1-9 delims==m " %%a in ('ping -n 4 %~1 ^| find "平均"') do ECHO.%~1 的平均时间:%%fms&SET %~1_time=%%f
  21. REM 对于4次全部丢失的,不显示平均时间,故直接丢弃
  22. IF not %errorlevel%==0 ECHO.%~1 全部丢失!&GOTO:EOF
  23. CALL :CMP %~1
  24. GOTO:EOF
  25. :CMP <IP>
  26. IF not defined IP1 SET "IP1=%~1"&EXIT /B 1
  27. IF not defined IP2 SET "IP2=%~1"&EXIT /B 2
  28. IF not defined IP3 SET "IP3=%~1"&EXIT /B 3
  29. IF !%~1_time! LSS !%IP1%_time! SET "IP3=%IP2%"&SET "IP2=%IP1%"&SET "IP1=%~1"&EXIT /B 1
  30. IF !%~1_time! LSS !%IP2%_time! SET "IP3=%IP2%"&SET "IP2=%~1"&EXIT /B 2
  31. IF !%~1_time! LSS !%IP3%_time! SET "IP3=%~1"&EXIT /B 3
  32. EXIT /B 0
复制代码

作者: BAT221110    时间: 2022-11-11 07:08

本帖最后由 BAT221110 于 2022-11-11 07:09 编辑

只需在PingDNS下重置ERRORLEVEL即可。
修改后的代码:
  1. @ECHO off
  2. ECHO.提示:netsh 需要管理员权限,请以管理员权限运行本脚本.
  3. setlocal EnableDelayedExpansion
  4. SET "IP1="
  5. SET "IP2="
  6. SET "IP3="
  7. ECHO.请稍等...&ECHO.
  8. CALL :PingDNS 223.5.5.5
  9. CALL :PingDNS 114.114.114.114
  10. CALL :PingDNS 180.76.76.76
  11. CALL :PingDNS 119.29.29.29
  12. CALL :PingDNS 8.8.8.8
  13. ECHO.执行以下命令:
  14. IF defined IP1 echo netsh int ip add dns "WLAN" %IP1% index=1
  15. IF defined IP2 echo netsh int ip add dns "WLAN" %IP2% index=2
  16. IF defined IP3 echo netsh int ip add dns "WLAN" %IP3% index=3
  17. pause
  18. GOTO:EOF
  19. :PingDNS <dnsIP>
  20. set "errorlevel=0"
  21. for /f "tokens=1-9 delims==m " %%a in ('ping -n 4 %~1 ^| find "平均"') do ECHO.%~1 的平均时间:%%fms & SET %~1_time=%%f
  22. REM 对于4次全部丢失的,不显示平均时间,故直接丢弃
  23. IF not %errorlevel%==0 ECHO. %~1 全部丢失!&GOTO:EOF
  24. CALL :CMP %~1
  25. GOTO:EOF
  26. :CMP <IP>
  27. IF not defined IP1 SET "IP1=%~1" & EXIT /B 1
  28. IF not defined IP2 SET "IP2=%~1" & EXIT /B 2
  29. IF not defined IP3 SET "IP3=%~1" & EXIT /B 3
  30. IF !%~1_time! LSS !%IP1%_time! SET "IP3=%IP2%"&SET "IP2=%IP1%"&SET "IP1=%~1"&EXIT /B 1
  31. IF !%~1_time! LSS !%IP2%_time! SET "IP3=%IP2%"&SET "IP2=%~1"&EXIT /B 2
  32. IF !%~1_time! LSS !%IP3%_time! SET "IP3=%~1"&EXIT /B 3
  33. EXIT /B 0
复制代码
效果:
  1. 提示:netsh 需要管理员权限,请以管理员权限运行本脚本.
  2. 请稍等...
  3. 223.5.5.5 的平均时间:18ms
  4. 114.114.114.114 的平均时间:41ms
  5. 180.76.76.76 的平均时间:15ms
  6. 119.29.29.29 的平均时间:15ms
  7. 8.8.8.8 的平均时间:34ms
  8. 执行以下命令:
  9. netsh int ip add dns "WLAN" 119.29.29.29 index=1
  10. netsh int ip add dns "WLAN" 223.5.5.5 index=2
  11. netsh int ip add dns "WLAN" 8.8.8.8 index=3
  12. 请按任意键继续. . .
复制代码
有可能是后面EXIT的时候把ERRORLEVEL搞乱了。
作者: 22123    时间: 2022-11-11 08:35

本帖最后由 22123 于 2022-11-11 14:01 编辑

谢谢大大 貌似还是有点问题
ping不通的ip 不会过滤掉 而且会以默认速度最高加到首选dns里
作者: 22123    时间: 2022-11-11 10:01

只需在PingDNS下重置ERRORLEVEL即可。
修改后的代码:效果:有可能是后面EXIT的时候把ERRORLEVEL搞乱了。
BAT221110 发表于 2022-11-11 07:08



    @BAT221110大大您好,我使用您修改后的脚本 可以正常ping所有ip了, 但还有个问题出现 我附上代码 您帮我再看看
我的问题是:我用2个错误的ip放在ping地址里  一个是ping不通 显示请求超时的ip 8.8.8.88 和地址不存在的 08.8.8.8 来做测试,
结果就是虽然ping不通的8.8.8.88 会当做速度最快的ip 放入到DNS里,而不是丢弃不写入到IP1里.  另一个08.8.8.8也差不多,会显示配置的DNS服务器不正确或不存在, 但会添加到DNS里,因添加错误而留白.   
这个问题该如何修正 ?   谢谢!!!
------------------------------------------------------------
□■自动检测DNS速度并设定最佳DNS
正在检测DNS...

阿里:   223.5.5.5       腾讯:   119.29.29.29    114:    114.114.114.114         百度:   180.76.76.76
360:    101.226.4.6     谷歌:   8.8.8.8         Cloudflare:     1.1.1.1

223.5.5.5       的平均时间:5ms
119.29.29.29    的平均时间:10ms
114.114.114.114 的平均时间:14ms
180.76.76.76    的平均时间:12ms
101.226.4.6     的平均时间:13ms
1.1.1.1 的平均时间:200ms
8.8.8.8 的平均时间:70ms
正在设定最佳DNS...
参数错误。
配置的 DNS 服务器不正确或不存在。
   IPv4 地址 . . . . . . . . . . . . : 192.168.0.91(首选)
   子网掩码  . . . . . . . . . . . . : 255.255.255.0
   默认网关. . . . . . . . . . . . . : 192.168.0.1
   DHCP 服务器 . . . . . . . . . . . : 192.168.0.1
   DNS 服务器  . . . . . . . . . . . : 8.8.8.88
                                             223.5.5.5
                                               ↑ 本机目前DNS
----------------------------------------------------------
请按任意键继续. . .
  1. @ECHO off
  2. ECHO □■自动检测DNS速度并设定最佳DNS
  3. REM 获取联网设备名称并重置DNS服务器地址为自动获取(防止之后DNS写入出错)
  4. for /f tokens^=2^ delims^=^" %%i in ('netsh interface ip show address') do (set "macname=%%i"
  5. goto:Next)
  6. :Next
  7. REM %macname%
  8. netsh int ip set dns %macname% dhcp >nul
  9. REM 获取网关(网关可作为首选或备用DNS)
  10. for /f "tokens=15" %%i in ('ipconfig /all ^| find /i "默认网关" ^| find /i "192"') do set gateway=%%i
  11. REM %gateway%
  12. setlocal EnableDelayedExpansion
  13. SET "IP1="
  14. SET "IP2="
  15. SET "IP3="
  16. ECHO.正在检测DNS...&ECHO.
  17. echo 阿里: 223.5.5.5 腾讯: 119.29.29.29 114: 114.114.114.114 百度: 180.76.76.76
  18. echo 360: 101.226.4.6 谷歌: 8.8.8.8 Cloudflare: 1.1.1.1
  19. echo.
  20. CALL :PingDNS 1.1.1.1
  21. CALL :PingDNS 8.8.8.8
  22. CALL :PingDNS 223.5.5.5
  23. CALL :PingDNS 119.29.29.29
  24. CALL :PingDNS 114.114.114.114
  25. CALL :PingDNS 180.76.76.76
  26. CALL :PingDNS 101.226.4.6
  27. CALL :PingDNS 8.8.8.88
  28. rem CALL :PingDNS %gateway%
  29. ECHO.正在设定最佳DNS...
  30. IF defined IP1 netsh int ip add dns %macname% %IP1% index=1
  31. IF defined IP2 netsh int ip add dns %macname% %IP2% index=2
  32. IF defined IP3 netsh int ip add dns %macname% %IP3% index=3 &goto:继续2●
  33. pause
  34. GOTO:EOF
  35. :PingDNS <dnsIP>
  36. set "errorlevel=0"
  37. for /f "tokens=1-9 delims==m " %%a in ('ping -n 4 %~1 ^| find "平均"') do ECHO.%~1 的平均时间:%%fms & SET %~1_time=%%f
  38. REM 对于4次全部丢失的,不显示平均时间,故直接丢弃
  39. IF not %errorlevel%==0 ECHO. %~1 全部丢失!&GOTO:EOF
  40. CALL :CMP %~1
  41. GOTO:EOF
  42. :CMP <IP>
  43. IF not defined IP1 SET "IP1=%~1" & EXIT /B 1
  44. IF not defined IP2 SET "IP2=%~1" & EXIT /B 2
  45. IF not defined IP3 SET "IP3=%~1" & EXIT /B 3
  46. IF !%~1_time! LSS !%IP1%_time! SET "IP3=%IP2%"&SET "IP2=%IP1%"&SET "IP1=%~1"&EXIT /B 1
  47. IF !%~1_time! LSS !%IP2%_time! SET "IP3=%IP2%"&SET "IP2=%~1"&EXIT /B 2
  48. IF !%~1_time! LSS !%IP3%_time! SET "IP3=%~1"&EXIT /B 3
  49. EXIT /B 0
  50. :继续2●
  51. ipconfig /all|findstr "[0-9]*\.[0-9]*\."
  52. echo                                         ↑ 本机目前DNS
  53. echo ----------------------------------------------------------
  54. REM 自动检测DNS速度并设定最佳DNS结束.↓下面可以放其他脚本继续执行......
  55. pause
复制代码

作者: BAT221110    时间: 2022-11-11 18:57

回复 4# 22123


    我研究了一下,如果IP PING不通的话,
  1. ping -n 4 %~1 ^| find "平均"
复制代码
会返回1,这个正常。但是在for后面,就变成返回0了。

我怀疑这是因为for修改了返回值。

所以,代码需要做整体的修改。建议新开一贴,看看高手们的意见。




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2