bat批处理开发-wifi联网系列(4):连接wifi,获取本机ip、网关及dns,并通过ping对wifi网络的连通性可用性进行检测
公司wifi很不稳定,编写了个wifi断网后自动重连的批处理,主要包括:可用wifi查询、联网、wifi切换感知、自动检测及掉线重连,网络状态分析等功能。
本次分享第四部分:连接wifi,并对wifi网络的可用性进行检测
上篇bat批处理开发-wifi联网系列(3):查询当前连接的wifi SSID和密码,封装为bat函数(如何传递入参和返回出参)讲到如何查询当前连接的wifi及其密码,并介绍了如何将查询功能封装为函数,入参和出参如何传递等知识。
本篇主要讲解根据ssid连接wifi,连接后,检测wifi的可用性,涉及的知识点包括:
- 断开一个wifi连接
- 根据ssid连接wifi
- 获取本机的ip,网关及dns
- 通过ping检测wifi网络的连通性
下面一一介绍。
1. 断开一个wifi连接
当前连接的wifi不是你想连接的wifi时,需要先断开wifi连接。命令如下:
netsh wlan disconnect
bat代码为:
@netsh wlan disconnect>nul
其中:
@符号:表示屏蔽本行命令语句的回显。即netsh wlan disconnect命令不是显示在屏幕上
>符号:表示重定向,即命令语句执行结果的输出到哪里,由>指定,默认为屏幕。如果是文件名,则表示输出到文件。
nul符号:表示空指向,也即屏蔽输出。
>nul:等于1>nul,是简写。表示屏蔽命令执行的成功结果。如果要屏蔽失败结果则写成:2>nul。如果成功结果和失败结果都不想输出,那么则用 1>nul 2>nul 即可。
2.根据ssid连接wifi
要重新连接wifi,用到的命令为:netsh wlan connect ssid=ssidName name=ssidName
bat代码为:
@netsh wlan connect ssid=%ssidName% name=%ssidName%>nul
以上两个命令即可封装为 wifi连接的代码,bat代码如下:
rem 重连WIFI
:reConnectWifi set ssidName=%1set ssidKey=%2@netsh wlan disconnect>nul@netsh wlan connect ssid=%ssidName% name=%ssidName%>nul call:echoConnectInfo "[连接] wifi已重新连接 %ssidName%"
goto:eof
3. 获取本机的ip,网关及dns
获取本机ip,网关和dns需要用到ipconfig/all命令+find命令组合,过滤出来想要的结果。废话不多说,为了方便调用,获取本机ip网关及dns的功能直接封装成函数,bat代码如下:
:getDeviceInforem 获取电脑本机IP,网关,dnsfor /f "tokens=16" %%i in ('ipconfig /all ^| find /i "主机名"') do set hostName=%%i for /f "tokens=16" %%i in ('ipconfig ^|find /i "ipv4"') do set ip=%%ifor /f "tokens=15" %%i in ('ipconfig /all ^| find /i "默认网关" ^| find /i "192"') do set gateway=%%irem for /f "tokens=2 delims=:" %%i in ('ipconfig /all ^|findstr /i "DNS"') do set dns=%%ifor /f "tokens=16" %%i in ('ipconfig /all ^| find /i "DNS"') do set dns=%%i for /F "tokens=1,2* delims=:. " %%a in ('ipconfig/all') do (if defined s set s=%%a.%%b.%%c &goto:hanye)&if /i "%%a%%b"=="DNSServers" set dns2=noif "%hostName%"=="" (set hostName=空) else (call:trim %hostName% hostName)if "%ip%"=="" (set ip=空) else (call:trim %ip% ip)if "%gateway%"=="" (set gateway=空) else (call:trim %gateway% gateway)if "%dns%"=="" (set dns=无) else (call:trim %dns% dns)if "%dns2%"=="" (set dns2=无) else (call:trim %dns2% dns2)echo [信息] 机器名=%hostName%, 本机ip=%ip%, 网关=%gateway%, dns1=%dns%, dns2=%dns2%
goto:eof
很多机器的dns是自动获取的,因此dns1和dns2将是空值。
通过调用本程序的trim函数,将字符串左右两边的空格全部删掉,这样获取的值可以本其它函数调用直接使用。
一般在连接wifi后获取本机ip网关及dns。
4.通过ping检测wifi网络的连通性
wifi已经连接,本地ip、网关和dns(如果有的话)也有获取,那么连接的wifi使用可用呢?
wifi可用性的检测主要通过ping分别检测 本机、网关、外网IP和外网域名分别进行测试,如果都通过说明wifi可用。
本文对ping进行封装,4个入参,格式如下:
:ping [ 请求次数] [ip|url] [检测项名称] [检测项代码]
wifi的可用性,主要通过检测tcp/ip协议,网关、外网ip和外网域名的联通性进行判断。如有其中一项不同,则认为wifi不可用。
调用代码如下:
rem TCP/IP协议检测
call:ping 2 %IP_127% TCPIP协议 1
rem 网关检测
call:ping 2 %gateway% 网关 2rem 互联网IP检测
call:ping 2 %IP_INTERNET% 外网 3rem 互联网域名检测
call:ping 2 %IP_URL% DNS 4
ping函数代码如下:
:pingif "%2"=="" (goto detectWifiFailure)ping -n %1 %2 | find "TTL=" >nul if %errorlevel%==0 (goto detectWifiSuccess) else (goto detectWifiFailure):detectWifiSuccesscall:echoDetectInfo "[检测] √ (%4)%3正常 %2"set netAvailable=%4 goto endPing:detectWifiFailurecall:echoError "[检测] × (%4)%3不通 %2"rem echo [检测] × ^(%4^)%3不通 %2set /a netAvailable=-%4goto netError:endPing
goto:eof
以上为关键知识点,现将连接wifi、获取本机信息和wifi检测的完整代码呈现如下:
call:getDeviceInfoecho [信息] 当前wifi=%ssid%
echo=rem TCP/IP协议检测
call:ping 2 %IP_127% TCPIP协议 1rem 网关检测
call:ping 2 %gateway% 网关 2rem 互联网IP检测
call:ping 2 %IP_INTERNET% 外网 3rem 互联网域名检测
call:ping 2 %IP_URL% DNS 4:netErrorrem 删除缓存文件 ping 没有产生临时文件
rem if exist %temp%\*.ping del %temp%\*.pingset /a detectTotalCount+=1if %netAvailable% leq 0 (rem color %errorColor%set lastWifiReconnectDate=%date:~0,10%set lastWifiReconnectTime=%time% set /a detectErrorCount+=1echo=call:echoError "[结果] × 网络状态 %netAvailable%"call:echoConnectInfo "[连接] wifi重连中…"call:reConnectWifi %ssid% %wifiKey% set waittime=%ERROR_WAITTIME%
) else (rem color %normalColor%echo=echo [结果] √ 网络状态 %netAvailable%set waittime=%NORMAL_WAITTIME%
)call:analyseWifi
set lastDetectDate=%date:~0,10%
set lastDetectTime=%time% echo=
echo [提示] ※ 若要重新选择wifi检测,请按下Ctrl + C键,选择N,然后选择Y即可
echo=
call:echoStartEndInfo 结束
echo= rem 函数定义
rem ping
:pingif "%2"=="" (goto detectWifiFailure)ping -n %1 %2 | find "TTL=" >nul if %errorlevel%==0 (goto detectWifiSuccess) else (goto detectWifiFailure):detectWifiSuccesscall:echoDetectInfo "[检测] √ (%4)%3正常 %2"set netAvailable=%4 goto endPing:detectWifiFailurecall:echoError "[检测] × (%4)%3不通 %2"rem echo [检测] × ^(%4^)%3不通 %2set /a netAvailable=-%4goto netError:endPing
goto:eofrem 重连WIFI
:reConnectWifi set ssidName=%1set ssidKey=%2@netsh wlan disconnect>nul@netsh wlan connect ssid=%ssidName% name=%ssidName%>nul call:echoConnectInfo "[连接] wifi已重新连接 %ssidName%"
goto:eof:getDeviceInforem 获取电脑本机IP,网关,dnsfor /f "tokens=16" %%i in ('ipconfig /all ^| find /i "主机名"') do set hostName=%%i for /f "tokens=16" %%i in ('ipconfig ^|find /i "ipv4"') do set ip=%%ifor /f "tokens=15" %%i in ('ipconfig /all ^| find /i "默认网关" ^| find /i "192"') do set gateway=%%irem for /f "tokens=2 delims=:" %%i in ('ipconfig /all ^|findstr /i "DNS"') do set dns=%%ifor /f "tokens=16" %%i in ('ipconfig /all ^| find /i "DNS"') do set dns=%%i for /F "tokens=1,2* delims=:. " %%a in ('ipconfig/all') do (if defined s set s=%%a.%%b.%%c &goto:hanye)&if /i "%%a%%b"=="DNSServers" set dns2=noif "%hostName%"=="" (set hostName=空) else (call:trim %hostName% hostName)if "%ip%"=="" (set ip=空) else (call:trim %ip% ip)if "%gateway%"=="" (set gateway=空) else (call:trim %gateway% gateway)if "%dns%"=="" (set dns=无) else (call:trim %dns% dns)if "%dns2%"=="" (set dns2=无) else (call:trim %dns2% dns2)echo [信息] 机器名=%hostName%, 本机ip=%ip%, 网关=%gateway%, dns1=%dns%, dns2=%dns2%
goto:eof
运行截图如下:
系列文章:
bat批处理开发系列(1):获取已连的wifi及其密码
bat批处理开发-wifi联网系列(2):从wifi列表选择一个wifi
bat批处理开发-wifi联网系列(3):查询当前连接的wifi SSID和密码,封装为bat函数(如何传递入参和返回出参)
bat批处理开发-wifi联网系列(4):连接wifi,获取本机ip、网关及dns,并通过ping对wifi网络的连通性可用性进行检测相关推荐
- bat批处理开发-wifi联网系列(5):wifi稳定性分析之日期时间比较及奇特数字的坑
公司wifi很不稳定,编写了个wifi断网后自动重连的批处理,主要包括:可用wifi查询.联网.wifi切换感知.自动检测及掉线重连,网络状态分析等功能. 上篇:bat批处理开发-wifi联网系列(4 ...
- bat批处理开发-wifi联网系列(3):查询当前连接的wifi SSID和密码,封装为bat函数(如何传递入参和返回出参)
公司wifi很不稳定,编写了个wifi断网后自动重连的批处理,主要包括:可用wifi查询.联网.wifi切换感知.自动检测及掉线重连,网络状态分析等功能. 本次分享第三部分:查询当前连接的wifi S ...
- qt获取本机全部ipv4_QT5下获取本机IP地址、计算机名、网络连接名、MAC地址、子网掩码、广播地址...
获取主机名称 /* * 名称:get_localmachine_name * 功能:获取本机机器名称 * 参数:no * 返回:QString */ QString CafesClient::get_ ...
- qt获取本机IP地址、计算机名、网络连接名、MAC地址、子网掩码、广播地址
获取主机名称 /** 名称:get_localmachine_name* 功能:获取本机机器名称* 参数:no* 返回:QString*/ QString CafesClient::get_local ...
- 批处理获取本机IP(局域网)及MAC地址
::==================批处理获取本机IP(局域网)及MAC地址============== ::code by youxi01@bbs.bathome.cn 2008-1-5 @ec ...
- bat批处理开发-wifi联网系列(1):获取已连的wifi及其密码
公司wifi很不稳定,编写了个wifi断网后自动重连的批处理,主要包括:可用wifi查询.联网.wifi切换感知.自动检测及掉线重连,网络状态分析等功能. 本次分享第一部分:可用wifi查询的功能. ...
- iOS获取WIFI配置信息,WIFI名称、网关(路由器地址)、本机IP地址、DNS
DEMO地址(看代码,什么就都有了):https://github.com/SimpleBraver/test_wifi.git 1.获取当前手机WIFI名称信息 #import <System ...
- C#连接mysql数据库的一个例子和获取本机IP的方法
本例子是一个最初级直接连接mysql数据库的例子,实现了往数据库插入数据的操作: string MyConnectionMysql="Server=localhost;Datbase=xxx ...
- android获取本地连接ip地址,C#获取本机IP地址(ipv4)
获取本机所有IP地址: 这些地址是包含所有网卡(虚拟网卡)的ipv4和ipv6地址. string name = Dns.GetHostName(); IPAddress[] ipadrlist = ...
最新文章
- SharpUpdater:开源的.NET桌面程序自动更新组件
- Spring in Action 入门之面向切面编程AOP
- Hessian 原理分析
- QT 定时器与动画实现
- 一年赚上亿的生意_如何一年不到的时间2万赚10个亿?
- P1038 神经网络(拓扑排序)
- 7-37 图形卡片排序游戏 (40 分)
- jzoj3348,bzoj3258-秘密任务【最短路,网络流最小割】
- 常见的算法面试问题以及代码实现
- 只能获取fixed语句初始值_因用了Insert into select语句,美女同事被开除了!
- FD.io VPP 使用场景-用例
- js怎么获取ueditor值_UEditor获取内容
- python随机生成6位数验证码
- jenkins使用_Spring Boot 系列:使用 Jenkins 部署 Spring Boot
- 最新的easymule版本,使用vs2005编译
- 拓扑排序和关键路径算法----关键路径算法 (C语言实现)
- 金仓数据库KingbaseES中 数据库实例命令
- 信号与系统:综述【知识梳理】
- CAD插入块不显示,通过复制到原坐标实现两图的叠加
- 方法重写与方法重载的区别
热门文章
- Neuroink的8个疯狂梦想
- 第三方支付平台漏洞多 消费者1个月内被19次盗刷
- xxxxxx 不在 sudoers 文件中。此事将被报告
- Linux Polkit本地权限提升漏洞(CVE-2021-4034)
- python def 识别print_Python零基础快速入门(一):print()函数与变量
- win7 android 双系统平板 p1000,优派Win7/Android双系统ViewPad 100
- 转载:使用Windows Live Writer发布日志
- The Armijo Goldstein line search scheme
- 婚宴座位图html5,结婚酒席座位安排
- ProcessingJoy —— 粒子流逝特效【JAVA】