Windows 批处理脚本实现WiFi连接状态监控与智能重连
📅 2026/7/6 12:26:12
👁️ 阅读次数
📝 编程学习
1. 为什么需要WiFi自动重连脚本
在工业自动化测试、设备调试等场景中,PC与设备之间的WiFi连接稳定性至关重要。想象一下这样的场景:你正在通过WiFi连接一台测试仪器进行长时间的数据采集,突然WiFi断开导致数据中断,不仅影响工作效率,还可能造成重要数据丢失。Windows系统自带的自动重连机制并不总是可靠,特别是在设备频繁重启或信号不稳定的环境中。
我曾在调试一台嵌入式设备时,设备每半小时就会自动重启一次。每次重启后都需要手动重新连接WiFi,严重影响测试效率。后来开发了这个批处理脚本后,完全实现了无人值守的自动重连,测试效率提升了近70%。
2. 核心原理与技术实现
2.1 netsh命令的妙用
这个脚本的核心是Windows自带的netsh命令。netsh(Network Shell)是Windows提供的网络配置命令行工具,通过它我们可以:
# 查看当前连接的WiFi接口 netsh WLAN show interfaces # 连接指定WiFi netsh wlan connect ssid=mywifi name=mywifi脚本通过定时执行netsh WLAN show interfaces命令,配合findStr过滤出目标WiFi名称,从而判断当前连接状态。如果发现连接断开,就立即执行connect命令进行重连。
2.2 批处理脚本的循环检测机制
整个脚本采用了一个简单的无限循环结构:
:mainloop (检测连接状态的命令 && 已连接) || ( # 重连逻辑 set /a try_cnt+=1 netsh wlan connect... ) choice /t 5 /d y /n >nul goto mainloop这里有几个关键点:
choice /t 5实现了5秒的检测间隔try_cnt计数器记录重试次数||运算符在左侧命令失败时执行右侧命令
3. 完整脚本解析与优化
3.1 基础版本脚本
让我们先看一个最基础的实现版本:
@echo off set wifi_name=mywifi set log_file=wifi.log :mainloop netsh WLAN show interfaces | findStr %wifi_name% >nul && ( echo [%date% %time%] WiFi已连接 >> %log_file% ) || ( echo [%date% %time%] 尝试连接WiFi... >> %log_file% netsh wlan connect ssid=%wifi_name% name=%wifi_name% >> %log_file% ) timeout /t 5 >nul goto mainloop这个版本已经可以实现基本功能,但存在几个问题:
- 没有重试次数限制
- 日志记录过于简单
- 没有错误处理机制
3.2 增强版脚本
针对上述问题,我优化后的版本增加了以下功能:
@echo off setlocal enabledelayedexpansion :: 配置参数 set wifi_name=mywifi set max_retry=10 set check_interval=10 set log_file=wifi_%date:/=%.log :: 初始化日志 echo [%date% %time%] 脚本启动 >> %log_file% echo 监控WiFi: %wifi_name% >> %log_file% echo 最大重试次数: %max_retry% >> %log_file% echo 检测间隔: %check_interval%秒 >> %log_file% set retry_count=0 :mainloop netsh WLAN show interfaces | findStr %wifi_name% >nul if !errorlevel! equ 0 ( echo [%date% %time%] WiFi连接正常 >> %log_file% set retry_count=0 ) else ( set /a retry_count+=1 echo [%date% %time%] WiFi断开,尝试第!retry_count!次重连 >> %log_file% netsh wlan connect ssid=%wifi_name% name=%wifi_name% >> %log_file% if !errorlevel! neq 0 ( echo [%date% %time%] 连接失败,错误代码: !errorlevel! >> %log_file% ) if !retry_count! geq %max_retry% ( echo [%date% %time%] 达到最大重试次数,退出脚本 >> %log_file% exit /b 1 ) ) timeout /t %check_interval% >nul goto mainloop这个版本的主要改进:
- 增加了最大重试次数限制
- 使用更精确的错误码检测
- 日志包含更详细的运行时信息
- 支持可配置的检测间隔
- 使用日期作为日志文件名后缀
4. 高级功能扩展
4.1 多WiFi优先级切换
在某些场景下,设备可能提供多个WiFi热点。我们可以扩展脚本实现智能切换:
:: 定义WiFi优先级列表 set wifi_list=TestDevice1,TestDevice2,OfficeWiFi :check_next_wifi for %%w in (%wifi_list%) do ( netsh WLAN show interfaces | findStr %%w >nul && ( set current_wifi=%%w goto wifi_connected ) ) :: 所有WiFi都不可用时的处理 echo [%date% %time%] 所有WiFi均不可用 >> %log_file% goto reconnect_logic :wifi_connected if not "%current_wifi%"=="%target_wifi%" ( echo [%date% %time%] 切换到备用WiFi: %current_wifi% >> %log_file% set target_wifi=%current_wifi% )4.2 网络质量监控
除了简单的连接状态,我们还可以监控网络质量:
:check_quality for /f "tokens=3 delims= " %%s in ( 'netsh WLAN show interfaces ^| findStr "信号"' ) do ( set signal_strength=%%s echo [%date% %time%] 信号强度: !signal_strength! >> %log_file% if "!signal_strength!"=="低" ( echo [%date% %time%] 警告:信号质量差 >> %log_file% :: 可以触发报警或其他处理逻辑 ) )4.3 邮件报警功能
对于无人值守的设备,可以集成邮件报警:
:send_alert set alert_subject=WiFi连接告警 set alert_body=设备%COMPUTERNAME%于%date% %time%失去WiFi连接,已重试%retry_count%次。 :: 使用blat发送邮件 blat -to admin@example.com -subject "%alert_subject%" -body "%alert_body%" if !errorlevel! equ 0 ( echo [%date% %time%] 告警邮件发送成功 >> %log_file% ) else ( echo [%date% %time%] 告警邮件发送失败 >> %log_file% )5. 实际应用中的经验分享
在工业现场部署这类脚本时,我遇到过几个典型问题及解决方案:
- 权限问题:某些操作需要管理员权限。可以通过以下方式自动提权:
:: 检查管理员权限 net session >nul 2>&1 if %errorlevel% neq 0 ( echo 请求管理员权限... mshta vbscript:CreateObject("Shell.Application").ShellExecute("cmd.exe","/c %~s0 ::","","runas",1)(window.close)&&exit exit /b )- 日志文件过大:长期运行的脚本会产生大日志文件。可以添加日志轮转:
:: 检查日志文件大小 for %%F in (%log_file%) do set log_size=%%~zF if %log_size% gtr 1048576 ( echo [%date% %time%] 日志文件超过1MB,执行轮转 >> %log_file% move /y %log_file% %log_file%.bak >nul )- 系统资源占用:长时间运行可能占用资源。可以优化检测间隔:
:: 根据连接状态动态调整检测间隔 if %retry_count% equ 0 ( set check_interval=30 ) else ( set /a check_interval=5*retry_count if !check_interval! gtr 300 set check_interval=300 )- 多网卡环境处理:当设备有多个无线网卡时,需要指定接口:
:: 获取第一个无线网卡名称 for /f "tokens=2 delims=:" %%i in ( 'netsh wlan show interfaces ^| findstr /i "名称"' ) do ( set wifi_interface=%%i goto got_interface ) :got_interface set wifi_interface=%wifi_interface:~1% netsh wlan connect name=%wifi_name% interface="%wifi_interface%"在实际项目中,这个脚本通常与设备测试框架集成。比如在Python测试脚本中调用:
import subprocess import time def check_wifi_connection(): while True: result = subprocess.run( ['auto_connect_wifi.bat', 'TestDevice'], capture_output=True, text=True ) if "连接成功" in result.stdout: break time.sleep(10)这种组合方案在自动化测试中特别有用,可以确保测试过程中网络连接始终可用。
编程学习
技术分享
实战经验