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

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

    本次分享第三部分:查询当前连接的wifi SSID和密码,并封装成bat函数

上篇bat批处理开发-wifi联网系列(2):从wifi列表选择一个wifi讲到从已连接的wifi中选择一个wifi的相关代码。本篇主要讲解选择的wifi ssid和当前连接的ssid是否为同一个wifi,涉及的知识点:

  • 查询当前正在连接的wifi ssid
  • 函数bat封装,如何传递入参和返回出参
  • 两个wifi ssid的比较(if字符串比较)

关键点1:查询当前正在连接的wifi

    查询当前wifi的思路是:先通过命令netsh wlan show interfaces查询出来当前wifi,再通过netsh wlan show profile name=currentSSID key=clear查询出来当前wifi的密码。

(1)列出当前的无线网络 netsh wlan show interfaces

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

 (2)通过ssid获取wifi密码 netsh wlan show profile name=currentSSID key=clear

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

 当然,以上查询到的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
    )  
  )
 
  :endCurWifi

  rem 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 curKey

if "%curWifi%" neq "%ssid%" (

  echo [信息] 当前wifi为%curWifi%,已切换到%ssid%

  rem 可以在这里初始化一些变量
  call:initVars

  rem下一个篇幅再介绍连接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

你可能感兴趣的:(bat,batch,wifi)