
1. 为什么需要WiFi自动重连脚本在工业自动化测试、设备调试等场景中PC与设备之间的WiFi连接稳定性至关重要。想象一下这样的场景你正在通过WiFi连接一台测试仪器进行长时间的数据采集突然WiFi断开导致数据中断不仅影响工作效率还可能造成重要数据丢失。Windows系统自带的自动重连机制并不总是可靠特别是在设备频繁重启或信号不稳定的环境中。我曾在调试一台嵌入式设备时设备每半小时就会自动重启一次。每次重启后都需要手动重新连接WiFi严重影响测试效率。后来开发了这个批处理脚本后完全实现了无人值守的自动重连测试效率提升了近70%。2. 核心原理与技术实现2.1 netsh命令的妙用这个脚本的核心是Windows自带的netsh命令。netshNetwork Shell是Windows提供的网络配置命令行工具通过它我们可以# 查看当前连接的WiFi接口 netsh WLAN show interfaces # 连接指定WiFi netsh wlan connect ssidmywifi namemywifi脚本通过定时执行netsh WLAN show interfaces命令配合findStr过滤出目标WiFi名称从而判断当前连接状态。如果发现连接断开就立即执行connect命令进行重连。2.2 批处理脚本的循环检测机制整个脚本采用了一个简单的无限循环结构:mainloop (检测连接状态的命令 已连接) || ( # 重连逻辑 set /a try_cnt1 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_namemywifi set log_filewifi.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_namemywifi set max_retry10 set check_interval10 set log_filewifi_%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_count0 :mainloop netsh WLAN show interfaces | findStr %wifi_name% nul if !errorlevel! equ 0 ( echo [%date% %time%] WiFi连接正常 %log_file% set retry_count0 ) else ( set /a retry_count1 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_listTestDevice1,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 tokens3 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_subjectWiFi连接告警 set alert_body设备%COMPUTERNAME%于%date% %time%失去WiFi连接已重试%retry_count%次。 :: 使用blat发送邮件 blat -to adminexample.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 21 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_interval30 ) else ( set /a check_interval5*retry_count if !check_interval! gtr 300 set check_interval300 )多网卡环境处理当设备有多个无线网卡时需要指定接口:: 获取第一个无线网卡名称 for /f tokens2 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_outputTrue, textTrue ) if 连接成功 in result.stdout: break time.sleep(10)这种组合方案在自动化测试中特别有用可以确保测试过程中网络连接始终可用。