如何用Python替换批处理文件中的DNS地址,实现DNS切换与延迟测试?
解决方法
步骤1:将批处理改为模板文件
把原批处理里固定的1.1.1.1替换成占位符{DNS_ADDRESS},保存为dns_template.bat:
@echo off cls for /F "skip=3 tokens=1,2,3* delims= " %%G in ('netsh interface show interface') DO ( IF "%%H"=="Disconnected" netsh interface set interface "%%J" enabled IF "%%H"=="Connected" netsh interface set interface "%%J" enabled echo %%J netsh interface ip set dns %%J static {DNS_ADDRESS} )
步骤2:编写Python逻辑实现自动替换与测试
在原Python脚本基础上,添加读取模板、替换DNS、执行批处理、循环测试的逻辑:
from tcp_latency import measure_latency import subprocess import os host = input("Enter host: ") def pinger(): try: latency_list = measure_latency(host, port=80, runs=10, timeout=2.5) # 过滤超时产生的None值 valid_latencies = [lat for lat in latency_list if lat is not None] if not valid_latencies: return "Timeout" avg_latency = sum(valid_latencies) / len(valid_latencies) return round(avg_latency, 2) except Exception as e: return f"Error: {str(e)}" # DNS地址列表 dns_list = ["1.1.1.1","1.0.0.1","8.8.8.8","8.8.4.4","9.9.9.9","149.112.112.112","208.67.222.222","208.67.220.220","8.26.56.26","8.20.247.20","185.228.168.9","185.228.169.9"] # 批处理模板路径 template_path = "dns_template.bat" # 临时批处理文件名 temp_batch = "temp_dns_switch.bat" # 存储测试结果 results = [] for dns in dns_list: print(f"\n正在切换DNS到: {dns}") # 读取模板并替换DNS占位符 with open(template_path, 'r', encoding='gbk') as f: batch_content = f.read().replace("{DNS_ADDRESS}", dns) # 写入临时批处理文件 with open(temp_batch, 'w', encoding='gbk') as f: f.write(batch_content) # 执行批处理(需管理员权限) subprocess.run([temp_batch], shell=True, check=True) # 测试延迟 latency = pinger() print(f"DNS {dns} 的平均延迟: {latency} ms") results.append((dns, latency)) # 清理临时文件 if os.path.exists(temp_batch): os.remove(temp_batch) # 输出所有结果对比 print("\n=== 所有DNS延迟测试结果 ===") for dns, latency in results: print(f"DNS {dns}: {latency} ms")
关键注意事项
- 必须以管理员身份运行Python脚本,否则
netsh命令无权限修改DNS设置。 - 批处理文件用
gbk编码是适配Windows CMD默认编码,避免乱码。 - 加入了超时值过滤,避免
measure_latency返回None导致计算错误。
内容的提问来源于stack exchange,提问作者itzowo
相关产品推荐
相关产品推荐

