公司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% 网关 2

rem 互联网IP检测
call:ping 2 %IP_INTERNET% 外网 3

rem 互联网域名检测
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网络的连通性可用性进行检测相关推荐

  1. bat批处理开发-wifi联网系列(5):wifi稳定性分析之日期时间比较及奇特数字的坑

    公司wifi很不稳定,编写了个wifi断网后自动重连的批处理,主要包括:可用wifi查询.联网.wifi切换感知.自动检测及掉线重连,网络状态分析等功能. 上篇:bat批处理开发-wifi联网系列(4 ...

  2. bat批处理开发-wifi联网系列(3):查询当前连接的wifi SSID和密码,封装为bat函数(如何传递入参和返回出参)

    公司wifi很不稳定,编写了个wifi断网后自动重连的批处理,主要包括:可用wifi查询.联网.wifi切换感知.自动检测及掉线重连,网络状态分析等功能. 本次分享第三部分:查询当前连接的wifi S ...

  3. qt获取本机全部ipv4_QT5下获取本机IP地址、计算机名、网络连接名、MAC地址、子网掩码、广播地址...

    获取主机名称 /* * 名称:get_localmachine_name * 功能:获取本机机器名称 * 参数:no * 返回:QString */ QString CafesClient::get_ ...

  4. qt获取本机IP地址、计算机名、网络连接名、MAC地址、子网掩码、广播地址

    获取主机名称 /** 名称:get_localmachine_name* 功能:获取本机机器名称* 参数:no* 返回:QString*/ QString CafesClient::get_local ...

  5. 批处理获取本机IP(局域网)及MAC地址

    ::==================批处理获取本机IP(局域网)及MAC地址============== ::code by youxi01@bbs.bathome.cn 2008-1-5 @ec ...

  6. bat批处理开发-wifi联网系列(1):获取已连的wifi及其密码

    公司wifi很不稳定,编写了个wifi断网后自动重连的批处理,主要包括:可用wifi查询.联网.wifi切换感知.自动检测及掉线重连,网络状态分析等功能. 本次分享第一部分:可用wifi查询的功能. ...

  7. iOS获取WIFI配置信息,WIFI名称、网关(路由器地址)、本机IP地址、DNS

    DEMO地址(看代码,什么就都有了):https://github.com/SimpleBraver/test_wifi.git 1.获取当前手机WIFI名称信息 #import <System ...

  8. C#连接mysql数据库的一个例子和获取本机IP的方法

    本例子是一个最初级直接连接mysql数据库的例子,实现了往数据库插入数据的操作: string MyConnectionMysql="Server=localhost;Datbase=xxx ...

  9. android获取本地连接ip地址,C#获取本机IP地址(ipv4)

    获取本机所有IP地址: 这些地址是包含所有网卡(虚拟网卡)的ipv4和ipv6地址. string name = Dns.GetHostName(); IPAddress[] ipadrlist = ...

最新文章

  1. SharpUpdater:开源的.NET桌面程序自动更新组件
  2. Spring in Action 入门之面向切面编程AOP
  3. Hessian 原理分析
  4. QT 定时器与动画实现
  5. 一年赚上亿的生意_如何一年不到的时间2万赚10个亿?
  6. P1038 神经网络(拓扑排序)
  7. 7-37 图形卡片排序游戏 (40 分)
  8. jzoj3348,bzoj3258-秘密任务【最短路,网络流最小割】
  9. 常见的算法面试问题以及代码实现
  10. 只能获取fixed语句初始值_因用了Insert into select语句,美女同事被开除了!
  11. FD.io VPP 使用场景-用例
  12. js怎么获取ueditor值_UEditor获取内容
  13. python随机生成6位数验证码
  14. jenkins使用_Spring Boot 系列:使用 Jenkins 部署 Spring Boot
  15. 最新的easymule版本,使用vs2005编译
  16. 拓扑排序和关键路径算法----关键路径算法 (C语言实现)
  17. 金仓数据库KingbaseES中 数据库实例命令
  18. 信号与系统:综述【知识梳理】
  19. CAD插入块不显示,通过复制到原坐标实现两图的叠加
  20. 方法重写与方法重载的区别

热门文章

  1. Neuroink的8个疯狂梦想
  2. 第三方支付平台漏洞多 消费者1个月内被19次盗刷
  3. xxxxxx 不在 sudoers 文件中。此事将被报告
  4. Linux Polkit本地权限提升漏洞(CVE-2021-4034)
  5. python def 识别print_Python零基础快速入门(一):print()函数与变量
  6. win7 android 双系统平板 p1000,优派Win7/Android双系统ViewPad 100
  7. 转载:使用Windows Live Writer发布日志
  8. The Armijo Goldstein line search scheme
  9. 婚宴座位图html5,结婚酒席座位安排
  10. ProcessingJoy —— 粒子流逝特效【JAVA】