公司wifi很不稳定,编写了个wifi断网后自动重连的批处理,主要包括:可用wifi查询、联网、wifi切换感知、自动检测及掉线重连,网络状态分析等功能。
本次分享第三部分:查询当前连接的wifi SSID和密码,并封装成bat函数
上篇bat批处理开发-wifi联网系列(2):从wifi列表选择一个wifi讲到从已连接的wifi中选择一个wifi的相关代码。本篇主要讲解选择的wifi ssid和当前连接的ssid是否为同一个wifi,涉及的知识点:
关键点1:查询当前正在连接的wifi
查询当前wifi的思路是:先通过命令netsh wlan show interfaces查询出来当前wifi,再通过netsh wlan show profile name=currentSSID key=clear查询出来当前wifi的密码。
(1)列出当前的无线网络 netsh wlan show interfaces
(2)通过ssid获取wifi密码 netsh wlan show profile name=currentSSID key=clear
当然,以上查询到的ssid及其密码还需for+find进行字符串解析才能最终得到。代码片段如下:
setlocal enableextensions enabledelayedexpansion&set cwifi=&set ckey=
for /f "usebackq delims=: tokens=2" %%a in (`netsh wlan show interfaces ^| find "SSID"`) do (
for /f "usebackq delims=: tokens=2" %%i in (`netsh wlan show profile name^=%%a key^=clear ^| findstr "关键内容"`) do (
set "cwifi=%%a"
set "ckey=%%i"
)
)
关键点2:bat函数封装,入参出参如何传递
为了便于bat程序模块化开发,本篇把查询当前wifi的功能封装为函数,有助于程序结构清晰、代码复用。
和其它开发语言一样,bat函数也包括函数声明和函数调用两方面。
(1)bat函数声明
bat 函数声明结构如下,包括函数体中如何取得入参,以及如何给出参赋值返回。
rem 程序声明开始,冒号+函数名
:fn
setlocal //即从这里开始直到endlolcal定义的变量优先为局部变量,否则变量则为全局的。
TODO:程序代码
set a=%1 //取得第一个入参
endlocal&"set %2=返回值" //即将“返回值”赋值给第二个参数即出参
goto:eof 程序声明结束
(2)调用函数,传递入参和出参
调用格式如下:
call+冒号:+fn+空格+入参若干(参数间用空格隔开)+空格+出参若干(参数间用空格隔开)
格式为:call:fn [%param1%] [%param2%] [paramReturn1] [paramReturn1]
入参解释:传参时变量名用%%包裹,即传入是为%param%
出参解释:传参时变量名不加%%,即直接用变量名传入即可
假如函数第一个为入参,第二个为出参,则调用示例如下:
set param="我是入参"
set paramReturn=
call:fn %param% paramReturn
echo 出参值为=paramReturn
本篇中,查询当前wifi的函数定义为:querenyCurrentWifi,无需传入参数,但需要返回当前wifi 的ssid和密码,即两个出参。代码片段如下:
函数调用如下:
call:queryCurrentWifi curWifi curKey
函数声明如下:
rem 获取当前wifi的ssid和密码
:queryCurrentWifi
setlocal enableextensions enabledelayedexpansion&set cwifi=&set ckey=
for /f "usebackq delims=: tokens=2" %%a in (`netsh wlan show interfaces ^| find "SSID"`) do (
for /f "usebackq delims=: tokens=2" %%i in (`netsh wlan show profile name^=%%a key^=clear ^| findstr "关键内容"`) do (
set "cwifi=%%a"
set "ckey=%%i"
goto endCurWifi
)
)
:endCurWifirem trim函数是删除字符串的左右空格,后续篇幅再单独讲解
if "%cwifi%" neq "" (call:trim %cwifi% cwifi)
if "%ckey%" neq "" (call:trim %ckey% ckey)
endlocal&set "%1=%cwifi%"&set "%2=%ckey%"
goto:eof
关键点3:选择的wifi ssid(变量为ssid)和当前wifi的ssid(变量为curWifi)比较是否同一个
(1)字符串是否为空比较
思路将变量用双引号包裹起来和空字符串(即双引号)比较是否想相等。
关键代码为:
if "%curWifi%"=="" (echo 字符串为空) else (字符串不为空)
(2)字符串是否相同比较
在批处理中,大于号>和小于号<为重定向符号,所以我们不能用>和<表示大于和小于,也不能用>=、<=、<>来表示大于等于、小于等于、不等于。为此,在批处理中用了特殊操作符代替它们,具体介绍如下:
EQU - 等于
NEQ - 不等于
LSS - 小于
LEQ - 小于或等于
GTR - 大于
GEQ - 大于或等于
本篇中,判断两个wifi的ssid是否同一个,关键代码为:
if "%curWifi%" neq "%ssid%" (echo 字符串不相等) else (echo 字符串相等)
废话不多说,直接上代码及注释
rem 判断当前wifi是否为选择的wifi,如果不是则重新链接到当前wifi,并且初始化参数
set curWifi=
set curKey=
call:queryCurrentWifi curWifi curKeyif "%curWifi%" neq "%ssid%" (
echo [信息] 当前wifi为%curWifi%,已切换到%ssid%
rem 可以在这里初始化一些变量
call:initVarsrem下一个篇幅再介绍连接wifi
call:reConnectWifi %ssid% %wifiKey%
)rem 函数:查询当前wifi的ssid和密码
:queryCurrentWifi
setlocal enableextensions enabledelayedexpansion&set cwifi=&set ckey=
for /f "usebackq delims=: tokens=2" %%a in (`netsh wlan show interfaces ^| find "SSID"`) do (
for /f "usebackq delims=: tokens=2" %%i in (`netsh wlan show profile name^=%%a key^=clear ^| findstr "关键内容"`) do (
set "cwifi=%%a"
set "ckey=%%i"
goto endCurWifi
)
)
:endCurWifi
if "%cwifi%" neq "" (call:trim %cwifi% cwifi)
if "%ckey%" neq "" (call:trim %ckey% ckey)
endlocal&set "%1=%cwifi%"&set "%2=%ckey%"
goto:eof
系列文章:
bat批处理开发系列(1):获取已连的wifi及其密码
bat批处理开发-wifi联网系列(2):从wifi列表选择一个wifi