Python脚本for循环不执行 Windows WiFi SSID提取故障求助
问题排查结论
你的for循环完全不执行是文件指针操作错误+遍历逻辑写错共同导致的,具体错误点如下:
- 执行
d = f.read()时已经将ssids.txt的文件指针移动到了文件末尾,后续所有f.read()、f.readline()调用都会直接返回空值,for循环遍历空内容自然不会触发任何循环内逻辑 - 遍历
f.read()的写法本身不符合预期:f.read()返回的是整个文件的完整字符串,直接遍历会逐个迭代单个字符,根本不是按行读取SSID - 循环内
f.readline(line)属于参数误用,readline()不需要传入当前遍历的内容作为参数,且在文件指针已经到末尾的前提下,无论怎么调用都读不到有效内容 - 定义了
l1存储结果但全程没有写入任何数据,最后打印永远是空列表 - 调用
netsh wlan show profiles时没有加key=clear参数,即便循环正常执行也读不到WiFi明文密码,只能拿到基础配置信息 - 直接用
utf-8解码netsh输出在中文Windows系统上会乱码,中文系统netsh默认输出编码是GBK - 逐次调用replace清理输出字符串的逻辑鲁棒性极差,只要系统语言变化、netsh输出的空格/分隔线长度变化,就会把SSID内容切坏
修正方案
直接在内存中处理命令输出即可,不需要反复读写临时文件徒增bug,用正则匹配提取SSID和密码比字符串替换稳定得多,修正后的可运行代码如下:
import subprocess import re # 拉取本机所有保存的WiFi配置列表 profiles_res = subprocess.check_output( ['netsh', 'wlan', 'show', 'profiles'], text=True, encoding='gbk' ) # 正则匹配提取SSID,兼容中英文系统输出 ssid_list = re.findall(r'所有用户配置文件\s*:\s*(.*)', profiles_res) if not ssid_list: ssid_list = re.findall(r'All User Profile\s*:\s*(.*)', profiles_res) wifi_list = [] for ssid in ssid_list: ssid = ssid.strip() if not ssid: continue # 拉取对应WiFi的详细配置,加key=clear才能拿到明文密码 detail_res = subprocess.run( ['netsh', 'wlan', 'show', 'profile', f'name={ssid}', 'key=clear'], capture_output=True, text=True, encoding='gbk' ) # 匹配密码字段,兼容中英文系统 pwd_match = re.search(r'关键内容\s*:\s*(.*)', detail_res.stdout) if not pwd_match: pwd_match = re.search(r'Key Content\s*:\s*(.*)', detail_res.stdout) pwd = pwd_match.group(1).strip() if pwd_match else '未保存密码/权限不足无法读取' wifi_list.append({'ssid': ssid, 'password': pwd}) print(f"SSID: {ssid} | 密码: {pwd}") # 可选:结果写入本地文件 with open('wifi_record.txt', 'w', encoding='utf-8') as f: for item in wifi_list: f.write(f"SSID: {item['ssid']}\t密码: {item['password']}\n")
额外注意
- 执行脚本需要普通用户权限即可,不需要管理员权限
- 部分企业级WiFi配置了禁止导出密码,这类网络读不到明文密码属于正常情况
- 命令参数用列表传递比字符串拼接更安全,遇到带空格、特殊字符的SSID不会执行失败
内容的提问来源于stack exchange,提问作者sudam edirisinghe
相关产品推荐
相关产品推荐

