hoochanlon 发表于 2023-4-11 17:10

【batch】显示当前WiFi与密码并生成二维码分享

## 缘起

做这事呢,有三个要因:

一、自己写的 macOS shell生成当前WiFi密码并记录所有WiFi的脚本,收到需要Windows版的反馈太多了

二、坛友 (https://www.52pojie.cn/home.php?mod=space&uid=1459634) 在帖子里也贡献了[他的“Windows获取所有WiFi密码”的脚本](https://www.52pojie.cn/forum.php?mod=redirect&goto=findpost&ptid=1766927&pid=46199170)(其实已经很好了),我觉得还可以再写一个获取当前的WiFi脚本,应对不同需求。

三、应付工作环境,摸鱼划水基本上也都会用到三个系统:Windows、macOS、Linux

虽然测试最后还是选择了 python 作为二维码生成方案,由此特别感谢 (https://www.52pojie.cn/home.php?mod=space&uid=308737) 讨论区帖子里提供“powershell生成二维码”的真诚讨论的建议。另外在延迟变量理解,以及在 “Windows版的软链接、别名”上略耗了点时间:

* 延迟变量见[脚本之家-变量延迟详解 call setlocal](https://www.jb51.net/article/193245.htm),个人认为写的不错
* “软链接”;Windows并不能像 macOS/Linux 使用 `cat <<'EOF' >~/1.sh` 这样来写文件,故PASS
* “别名”;Windows的 alias 设置虽可以使用powershell,但容易污染环境,故PASS

思路:

1. 通过netsh工具做好获取当前WiFi信息的代码
2. 利用python、nodejs之类的二维码生成工具写入WiFi信息到二维码
3. 将代码文件放入执行环境,并写入到环境变量这样就能在终端 `%WIFI%` 就能看当前WiFi并生成二维码了。
4. btw:思路三也算是对如上“软链接”及“别名”方案变通处理。

## 效果图

未使用脚本前,环境变量。

![](https://s2.xptou.com/2023/04/11/64351765abf36.png)

本地测试图如下,需注意:

* powershell环境使用`cmd /c ${env:wifi}` ,cmd 环境则是 `%wifi%`
* 我对没有python环境的朋友做了选择性抛异常,见源码 `pip install pillow > nul 2>&1` 部分

![](https://s2.xptou.com/2023/04/11/643517b438f3d.png)

在线测试图

`![](https://s2.xptou.com/2023/04/11/6435180d742c7.png) 图床显示不稳定,故先注释`

![](https://images2.imgbox.com/46/7c/jFypHcab_o.png)

附源码:https://github.com/hoochanlon/ihs-simple/blob/main/d-bat/show_wifi.bat

```basic
@echo off

:: ----------- 测试特权提升可行性 -----------

@rem 右键运行或是管理员命令有些麻烦
@REM 兼顾本地与网络加载,仅测试使用!
@REM 由于需移动文件至设置环境目录,故上条 PASS
@REM 经本地测试,由于特权提升开启新窗口后,旧终端对二维码不兼容,PASS


:: ----------------- 检测环境变量 ------------

@REM 设置环境变量
if not defined %WiFi% > nul (setx WiFi "%userprofile%\show_wifi.bat")

:: ----------------- 获取当前WiFi与密码 ---------------------

@REM 排除BSSID(基本服务集标识符)信息,有干扰到正常SSID输出。
setlocal enabledelayedexpansion
for /f "tokens=2 delims=:" %%i in ('netsh wlan show interfaces ^| findstr "SSID" ^| findstr /v "BSSID"') do (
    set now_wifi_ssid=%%i
    @REM 替换空格
    set now_wifi_ssid=!now_wifi_ssid: =!
)

for /f "tokens=2 delims=: " %%i in ('netsh wlan show profile name^="%now_wifi_ssid%" key^=clear ^| findstr "关键内容"') do (
    set "now_wifi_password=%%i"
    set now_wifi_password=!now_wifi_password!
)

echo WiFi:%now_wifi_ssid%
echo WiFi密码:%now_wifi_password%

:: ----------------- 二维码 ---------------------------------

@REM 二维码基本上是照片打开,Windows终端(旧版)字符支持受限,效果不理想
@REM Windows11以上自带的新版终端可行!
@REM https://github.com/microsoft/terminal

pip install qrcode > nul 2>&1
pip install pillow > nul 2>&1
pip install qrcode-terminal > nul 2>&1
set data= WiFi:%now_wifi_ssid% WiFi密码:%now_wifi_password%
python -c "import qrcode_terminal; qrcode_terminal.draw('%data%')"

::------------ 移动文件至用户家目录 ---------------

if not exist "c:\%userprofile%\show_wifi.bat" > nul (
    move "%~dp0\%~nx0" "%userprofile%\%~nx0"
)

:: --------------- 参考部分 ----------------------------------

@REM @REM 参考文档及资料 一

@REM @REM "tokens=2 delims=:" 参数只能在 for 命令中使用,tokens=2 ,“:” 之后的第二文本
@REM @REM"%now_ssid: =%" 将所有空格置 nul
@REM netsh wlan show profile /? 帮助文档
@REM netsh wlan show profile name="G***-***S" key=clear

@REM @REM (https://blog.csdn.net/kagurawill/article/details/114982328)
@REM @REM (https://www.cnblogs.com/Chary/p/5825189.html)

@REM @REM 参考文档及资料 二

@REM WiFi名称输出的不是理想的结果 00,第一次取值正常,第二次成了00
@REM 找到方案为:开启延迟变量,脚本之家例子不错,说了那么多,其实就是以实时变量相对,条与行的概念也十分重要
@REM https://www.jb51.net/article/193245.htm

:: --------------- 参考部分 ----------------------------------

```

也算是提供一个参考了,后续坛友们要是有心的话,再做一个select二选一之类的增强也不错。


参考文档:

*(https://www.cnblogs.com/Chary/p/5825189.html)
*[脚本之家-变量延迟详解 call setlocal](https://www.jb51.net/article/193245.htm)
*(https://blog.csdn.net/kagurawill/article/details/114982328)
*[坛友 leonca的Windows版脚本 (已置顶) ](https://www.52pojie.cn/forum.php?mod=redirect&goto=findpost&ptid=1766927&pid=46199170)
* `netsh wlan show profile /?` 系统帮助文档

hoochanlon 发表于 2023-4-11 21:31

关于获取所有WiFi密码,这部分是受 [老D网-CMD一键获取 所有连接过的WIFI密码](https://laod.cn/2138.html) 的启发。

老D帖子代码虽年久失修,但我觉得参考其代码,进行一次量体裁衣,应该还是蛮不错的。为了讲解方便,这里引用老D源码,做些必要性说明,同时也可做为大家学习研究的探讨话题。

老D源码:

```
for /f “skip=9 tokens=1,2 delims=:” %i in (‘netsh wlan show profiles’) do@echo %j | findstr -i -v echo | netsh wlan show profiles %j key=clear
```

就我当前环境而言,键入老D的代码,从图中可以看出信息虽全但未免显得过长,举个例子来说吧,同理于 `ipconfig` 差不多。**坛友要使用的话,如果是保存为批处理文件,要多加`%`,如`%%i`,第二将中文引号换成英文的(如下图示)。**

![](https://s2.xptou.com/2023/04/11/6435552facf79.png)

就我而言,**只需要知道 ”WiFi“和”密码“就够了,注意上图红字**,所以对于我来说,只需要写成一个懒人即用式代码就ok了。

```
netsh wlan show profiles | for /f "tokens=2 delims=:" %%i in ('findstr "用户配置文件"') do @echo %%i && netsh wlan show profiles name=%%i key=clear | findstr "关键内容"
```

较通俗直白的解释这段代码:显示所有保存过的WiFi信息,并将附加在WiFi名称上的多余滤掉("tokens=2 delims=:"),只剩WiFi名称了,再从这仅有的WiFi字段,不断地循环(for)地去找密码。

最后,我们再来看如下图(**注意最上图提到的语法规则**):

![](https://s2.xptou.com/2023/04/11/64355b8e22fd2.png)

涛之雨 发表于 2023-4-11 21:54

【bat脚本】读取当前设备wifi密码(仅win10测试)
https://www.52pojie.cn/thread-1357673-1-1.html
(出处: 吾爱破解论坛)

bat获取wifi账号密码的我也写过,
记得还看过一个纯bat生成二维码的项目,才是那个才真的是大佬。。。

不过兼容性不大好。。。

大豹子 发表于 2023-4-11 21:42

楼主能生成一个安卓apk给我们用吗

hoochanlon 发表于 2023-4-11 21:49

大豹子 发表于 2023-4-11 21:42
楼主能生成一个安卓apk给我们用吗

我不懂安卓,自己用了好几年的iOS了,也很少关心搞机方面的东西,记得上一次搞机还是诺基亚5230、N97那时代,平时也就看看微信、钉钉。

你试试看看有没有批处理这方面的安卓打包了,这方面我帮不了你什么忙了。

hoochanlon 发表于 2023-4-11 22:01

涛之雨 发表于 2023-4-11 21:54
【bat脚本】读取当前设备wifi密码(仅win10测试)
https://www.52pojie.cn/thread-1357673-1-1.html
(出 ...

哈哈,这个确实大神,十分牛逼。之前有在选二维码工具看了这个 (https://github.com/alishtory/qrcode-terminal/issues/4)issue,我就觉得原生二维码肯定相当不容易,又是绘图、考虑字体点阵什么的,头皮发麻....

反正我是就算搭了老命也弄不了,哈哈

kanyanhao 发表于 2023-4-11 22:12

确实厉害

hoochanlon 发表于 2023-4-11 22:22

kanyanhao 发表于 2023-4-11 22:12
确实厉害

我这个这是整合前人经验,加入了个人的一些想法。那个bat手搓二维码才是真大神,徒手造轮子,确实牛逼。

webzdqdxkj 发表于 2023-4-12 00:42

感谢大佬分享。。。

kaisen868 发表于 2023-4-12 00:48

多谢分享自制实用工具。
页: [1] 2
查看完整版本: 【batch】显示当前WiFi与密码并生成二维码分享