cfst_hosts.bat 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. :: --------------------------------------------------------------
  2. :: 项目: CloudflareSpeedTest 自动更新 Hosts
  3. :: 版本: 1.0.4
  4. :: 作者: XIU2
  5. :: 项目: https://github.com/XIU2/CloudflareSpeedTest
  6. :: --------------------------------------------------------------
  7. @echo off
  8. Setlocal Enabledelayedexpansion
  9. ::判断是否已获得管理员权限
  10. >nul 2>&1 "%SYSTEMROOT%\system32\cacls.exe" "%SYSTEMROOT%\system32\config\system"
  11. if '%errorlevel%' NEQ '0' (
  12. goto UACPrompt
  13. ) else ( goto gotAdmin )
  14. ::写出 vbs 脚本以管理员身份运行本脚本(bat)
  15. :UACPrompt
  16. echo Set UAC = CreateObject^("Shell.Application"^) > "%temp%\getadmin.vbs"
  17. echo UAC.ShellExecute "%~s0", "", "", "runas", 1 >> "%temp%\getadmin.vbs"
  18. "%temp%\getadmin.vbs"
  19. exit /B
  20. ::如果临时 vbs 脚本存在,则删除
  21. :gotAdmin
  22. if exist "%temp%\getadmin.vbs" ( del "%temp%\getadmin.vbs" )
  23. pushd "%CD%"
  24. CD /D "%~dp0"
  25. ::上面是判断是否以获得管理员权限,如果没有就去获取,下面才是本脚本主要代码
  26. ::如果 nowip_hosts.txt 文件不存在,说明是第一次运行该脚本
  27. if not exist "nowip_hosts.txt" (
  28. echo 该脚本的作用为 CFST 测速后获取最快 IP 并替换 Hosts 中的 Cloudflare CDN IP。
  29. echo 使用前请先阅读:https://github.com/XIU2/CloudflareSpeedTest/issues/42#issuecomment-768273768
  30. echo.
  31. echo 第一次使用,请先将 Hosts 中所有 Cloudflare CDN IP 统一改为一个 IP。
  32. set /p nowip="输入该 Cloudflare CDN IP 并回车(后续不再需要该步骤):"
  33. echo !nowip!>nowip_hosts.txt
  34. echo.
  35. )
  36. ::从 nowip_hosts.txt 文件获取当前 Hosts 中使用的 Cloudflare CDN IP
  37. set /p nowip=<nowip_hosts.txt
  38. echo 开始测速...
  39. :: 这个 RESET 是给需要 "找不到满足条件的 IP 就一直循环测速下去" 功能的人准备的
  40. :: 如果需要这个功能就把下面 3 个 goto :STOP 改为 goto :RESET 即可
  41. :RESET
  42. :: 这里可以自己添加、修改 CFST 的运行参数,echo.| 的作用是自动回车退出程序(不再需要加上 -p 0 参数了)
  43. echo.|cfst.exe -o "result_hosts.txt"
  44. :: 判断结果文件是否存在,如果不存在说明结果为 0
  45. if not exist result_hosts.txt (
  46. echo.
  47. echo CFST 测速结果 IP 数量为 0,跳过下面步骤...
  48. goto :STOP
  49. )
  50. :: 获取第一行的最快 IP
  51. for /f "tokens=1 delims=," %%i in (result_hosts.txt) do (
  52. SET /a n+=1
  53. If !n!==2 (
  54. SET bestip=%%i
  55. goto :END
  56. )
  57. )
  58. :END
  59. :: 判断刚刚获取的最快 IP 是否为空,以及是否和旧 IP 一样
  60. if "%bestip%"=="" (
  61. echo.
  62. echo CFST 测速结果 IP 数量为 0,跳过下面步骤...
  63. goto :STOP
  64. )
  65. if "%bestip%"=="%nowip%" (
  66. echo.
  67. echo CFST 测速结果 IP 数量为 0,跳过下面步骤...
  68. goto :STOP
  69. )
  70. :: 下面这段代码是 "找不到满足条件的 IP 就一直循环测速下去" 才需要的代码
  71. :: 考虑到当指定了下载速度下限,但一个满足全部条件的 IP 都没找到时,CFST 就会输出所有 IP 结果
  72. :: 因此当你指定 -sl 参数时,需要移除下面这段代码开头的这个 :: 冒号注释符,来做文件行数判断(比如下载测速数量:10 个,那么下面的值就设在为 11)
  73. ::set /a v=0
  74. ::for /f %%a in ('type result_hosts.txt') do set /a v+=1
  75. ::if %v% GTR 11 (
  76. :: echo.
  77. :: echo CFST 测速结果没有找到一个完全满足条件的 IP,重新测速...
  78. :: goto :RESET
  79. ::)
  80. echo %bestip%>nowip_hosts.txt
  81. echo.
  82. echo 旧 IP 为 %nowip%
  83. echo 新 IP 为 %bestip%
  84. CD /d "C:\Windows\System32\drivers\etc"
  85. echo.
  86. echo 开始备份 Hosts 文件(hosts_backup)...
  87. copy hosts hosts_backup
  88. echo.
  89. echo 开始替换...
  90. (
  91. for /f "tokens=*" %%i in (hosts_backup) do (
  92. set s=%%i
  93. set s=!s:%nowip%=%bestip%!
  94. echo !s!
  95. )
  96. )>hosts
  97. echo 完成...
  98. echo.
  99. :STOP
  100. pause