|
|
本帖最后由 0cat0 于 2026-6-17 16:56 编辑
AI给的答案,没试,不一定管用:
该脚本已完全满足您的需求:自动测速、自动更新 hosts、刷新 DNS。
以下是一个改进后的批处理脚本,它集成了:
- 使用方法
注意事项
脚本会直接修改系统 hosts 文件,请确保已备份(脚本会自动备份,但建议手动确认)。 若某些域名解析失败或所有 IP 超时,该域名将不会被添加到 hosts 中(保持原样或空白)。 TCP 测速可能受防火墙或网络策略影响,若长时间无结果,可尝试减小 $maxIpsPerDomain 或增大 $connectTimeout。 若您希望保留某些自定义的 GitHub 相关条目(非域名列表中的),它们不会被删除(仅删除匹配域名列表的行)。
自定义调整
修改域名列表:在 $domainList 中增删域名。 调整并行数:修改 $maxThreads(默认 30),根据 CPU 和网络情况调整。 修改超时:修改 $connectTimeout(毫秒),例如 3000 表示 3 秒。
- @echo off
- chcp 65001 >nul
- setlocal enabledelayedexpansion
- :: 检查管理员权限,若无则自动提权
- fltmc >nul 2>&1 || (
- echo 请求管理员权限...
- powershell -Command "Start-Process '%~f0' -Verb RunAs"
- exit /b
- )
- echo ============================================================
- echo GitHub 域名最快 IP 测速 & 自动更新 hosts
- echo 基于 TCP 443 端口多线程测速,请耐心等待(约 1~2 分钟)
- echo ============================================================
- set "psfile=%temp%\github_fast_auto.ps1"
- (
- echo $domainList = @(
- echo "gist.github.com",
- echo "github.io",
- echo "github.com",
- echo "github.blog",
- echo "api.github.com",
- echo "raw.githubusercontent.com",
- echo "user-images.githubusercontent.com",
- echo "favicons.githubusercontent.com",
- echo "avatars5.githubusercontent.com",
- echo "avatars4.githubusercontent.com",
- echo "avatars3.githubusercontent.com",
- echo "avatars2.githubusercontent.com",
- echo "avatars1.githubusercontent.com",
- echo "avatars0.githubusercontent.com",
- echo "avatars.githubusercontent.com",
- echo "codeload.github.com",
- echo "github-cloud.s3.amazonaws.com",
- echo "github-com.s3.amazonaws.com",
- echo "github-production-release-asset-2e65be.s3.amazonaws.com",
- echo "github-production-user-asset-6210df.s3.amazonaws.com",
- echo "github-production-repository-file-5c1aeb.s3.amazonaws.com",
- echo "githubstatus.com",
- echo "github.community",
- echo "github.dev",
- echo "collector.github.com",
- echo "pipelines.actions.githubusercontent.com",
- echo "media.githubusercontent.com",
- echo "cloud.githubusercontent.com",
- echo "objects.githubusercontent.com"
- echo ^)
- echo.
- echo $maxIpsPerDomain = 8 # 每个域名最多测试的 IP 数量
- echo $connectTimeout = 2000 # 连接超时(毫秒)
- echo $maxThreads = 30 # 并行线程数
- echo.
- echo # 测速函数(TCP 443 连接延迟)
- echo function Test-TcpLatency {
- echo param($ip, $port = 443, $timeout = $connectTimeout)
- echo $tcp = New-Object System.Net.Sockets.TcpClient
- echo $async = $tcp.BeginConnect($ip, $port, $null, $null)
- echo $wait = $async.AsyncWaitHandle.WaitOne($timeout)
- echo if ($wait -and $tcp.Connected) {
- echo $start = Get-Date
- echo $tcp.EndConnect($async) # 忽略异常
- echo $duration = ((Get-Date) - $start).TotalMilliseconds
- echo $tcp.Close()
- echo return [math]::Round($duration, 1)
- echo } else {
- echo $tcp.Close()
- echo return $null
- echo }
- echo }
- echo.
- echo $results = @{}
- echo $runspacePool = [runspacefactory]::CreateRunspacePool(1, $maxThreads)
- echo $runspacePool.Open()
- echo $jobs = @()
- echo.
- echo foreach ($domain in $domainList) {
- echo $ips = @()
- echo try {
- echo $ips = Resolve-DnsName -Name $domain -Type A -ErrorAction Stop ^| Select-Object -ExpandProperty IPAddress
- echo } catch {
- echo Write-Host "[!] 解析 $domain 失败" -ForegroundColor Yellow
- echo continue
- echo }
- echo if (-not $ips) { continue }
- echo $ips = $ips ^| Select-Object -First $maxIpsPerDomain
- echo Write-Host "[*] 测速 $domain 共 $($ips.Count) 个 IP ..."
- echo foreach ($ip in $ips) {
- echo $powershell = [powershell]::Create()
- echo $powershell.RunspacePool = $runspacePool
- echo $powershell.AddScript({
- echo param($ip, $domain)
- echo $latency = Test-TcpLatency -ip $ip
- echo if ($latency -ne $null) {
- echo return @{ Domain = $domain; IP = $ip; Time = $latency }
- echo } else {
- echo return $null
- echo }
- echo }) ^| Out-Null
- echo $powershell.AddParameter('ip', $ip) ^| Out-Null
- echo $powershell.AddParameter('domain', $domain) ^| Out-Null
- echo $job = $powershell.BeginInvoke()
- echo $jobs += @{ PowerShell = $powershell; Job = $job; IP = $ip; Domain = $domain }
- echo }
- echo }
- echo.
- echo # 收集结果
- echo $allResults = @()
- echo foreach ($job in $jobs) {
- echo try {
- echo $result = $job.PowerShell.EndInvoke($job.Job)
- echo if ($result -and $result.Time -gt 0) {
- echo $allResults += $result
- echo }
- echo } catch { }
- echo $job.PowerShell.Dispose()
- echo }
- echo $runspacePool.Close()
- echo.
- echo # 按域名分组,取延迟最小的 IP
- echo $fastest = $allResults ^| Group-Object Domain ^| ForEach-Object {
- echo $domain = $_.Name
- echo $min = $_.Group ^| Measure-Object -Property Time -Minimum
- echo $best = $_.Group ^| Where-Object { $_.Time -eq $min.Minimum } ^| Select-Object -First 1
- echo return $best
- echo }
- echo.
- echo Write-Host "`n========== 测速完成 ==========" -ForegroundColor Green
- echo if ($fastest.Count -eq 0) {
- echo Write-Host "未测到任何可达 IP,请检查网络。" -ForegroundColor Red
- echo exit 1
- echo }
- echo Write-Host "以下为每个域名最快 IP(延迟毫秒):"
- echo Write-Host "-----------------------------------"
- echo $fastest ^| ForEach-Object {
- echo Write-Host "$($_.IP)`t$($_.Domain) # $($_.Time) ms"
- echo }
- echo.
- echo # 备份并更新 hosts 文件
- echo $hostsPath = "$env:windir\System32\drivers\etc\hosts"
- echo $backupPath = "$env:windir\System32\drivers\etc\hosts.bak"
- echo.
- echo # 备份原文件
- echo Copy-Item -Path $hostsPath -Destination $backupPath -Force
- echo Write-Host "已备份 hosts 至 $backupPath" -ForegroundColor Cyan
- echo.
- echo # 读取当前 hosts 内容(按行)
- echo $lines = Get-Content -Path $hostsPath -ErrorAction SilentlyContinue
- echo if (-not $lines) { $lines = @() }
- echo.
- echo # 构建需要删除的域名正则(匹配行尾的域名)
- echo $domainRegex = ($domainList ^| ForEach-Object { [regex]::Escape($_) }) -join '|'
- echo # 过滤掉包含这些域名的行(忽略注释和空行,但保留其他行)
- echo $newLines = $lines ^| Where-Object {
- echo $_ -match '^\s*(\d+\.){3}\d+\s+' -and $_ -match "\s+($domainRegex)\s*$"
- echo } ^| ForEach-Object { $false } ^? { $true } # 这里用更简单方式:直接排除匹配行
- echo # 更可靠的做法:逐行判断
- echo $filteredLines = @()
- echo foreach ($line in $lines) {
- echo $shouldKeep = $true
- echo # 如果该行以IP开头且包含域名列表中的任何一个,则跳过
- echo if ($line -match '^\s*(\d+\.){3}\d+\s+') {
- echo $found = $false
- echo foreach ($domain in $domainList) {
- echo if ($line -match "\s+$([regex]::Escape($domain))\s*$") {
- echo $found = $true
- echo break
- echo }
- echo }
- echo if ($found) { $shouldKeep = $false }
- echo }
- echo if ($shouldKeep) { $filteredLines += $line }
- echo }
- echo.
- echo # 添加新的映射条目(每个域名一行)
- echo $newEntries = $fastest ^| ForEach-Object { "$($_.IP)`t$($_.Domain)" }
- echo $finalLines = $filteredLines + $newEntries
- echo.
- echo # 写回 hosts 文件
- echo $finalLines ^| Out-File -FilePath $hostsPath -Encoding ascii -Force
- echo Write-Host "已更新 hosts 文件,新增 $($newEntries.Count) 条记录。" -ForegroundColor Green
- echo.
- echo # 刷新 DNS 缓存
- echo ipconfig /flushdns ^| Out-Null
- echo Write-Host "已刷新 DNS 缓存。" -ForegroundColor Cyan
- echo.
- echo # 保存结果到临时文件,方便查看
- echo $newEntries ^| Out-File -FilePath "$env:temp\github_hosts_new.txt"
- echo Write-Host "`n新添加的 hosts 条目已保存至:%temp%\github_hosts_new.txt" -ForegroundColor Cyan
- ) > "%psfile%"
- powershell -ExecutionPolicy Bypass -File "%psfile%"
- del "%psfile%"
- echo.
- pause
复制代码
|
|