Repository navigation
v1.7.4 — 装在中文文件夹里的 WorkBuddy,终于找得到了
「腾讯」两个字,让插件整整看不见一个装好、登录着、正在运行的 WorkBuddy。
你会看到:插件卡片报「找不到 WorkBuddy 桌面端,无法取得密钥」,可你明明:程序装着、还开着、凭据文件就在那儿躺着。中文 Windows 上,只要安装路径里带中文(比如 D:\ruanjian\anzhuang\腾讯\WorkBuddy\)就会中招——国内用户把软件装进中文目录太常见了。
为什么:插件去注册表里问「WorkBuddy 装哪儿了」,用的是 reg.exe,而 reg.exe 按系统控制台代码页输出——中文系统就是 GBK(936)。我们这边却当成 UTF-8 去读。于是:
实际路径:D:\ruanjian\anzhuang\腾讯\WorkBuddy\WorkBuddy.exe
读出来: D:\ruanjian\anzhuang\��Ѷ\WorkBuddy\WorkBuddy.exe ← 存的什么鬼
腾讯 变成 ��Ѷ,这个路径当然不存在。所有候选路径全部落空,插件就得出「没装」的结论。可笑的是它其实探到了注册表记录,只是读成了乱码。
这个坑和之前那个「装到非系统盘」是两回事——那个是找不到记录,这个是找到了但读不对。
怎么修的:
- 改走 PowerShell 读注册表(主路径)。
Get-ItemProperty直接调注册表 API,根本不过控制台代码页那一关,中文路径原样拿到; - 保留
reg.exe作后备(万一机器上 PowerShell 不可用),但不再假定 UTF-8:按字节读进来,逐个尝试各种编码,并且用「这个路径是否真的存在」来判定哪个解码是对的——这是唯一能区分「正确字节」和「看着像那么回事的乱码」的办法。
顺带修了报告里提到的两点:
DisplayIcon和InstallLocation两个字段都读(不少安装包的InstallLocation是空的,只有DisplayIcon有值),并且清理",0后缀的逻辑保持不变;doctor现在会把探测到的每一条路径原样列出来,前面标✓/·表示存不存在。以前它压根不显示这些路径——而这恰恰是排查「装了却找不到」最该看的东西。乱码路径现在一眼就能看见,不用再靠猜。
验证
- 类型检查全绿,测试 278 项全绿(+2)。
- 新增
tests/windows-registry-encoding.test.ts:在本机真实创建一个含中文的目录(D:\...\腾讯\WorkBuddy\WorkBuddy.exe)并写进真实注册表,然后跑插件的真实探测逻辑,断言拿到的路径与真实路径完全一致、且文件确实存在。 - 反向验证:把修复撤掉、退回「
reg.exe+ UTF-8」,含中文的路径读不出来(0 条),测试变红——确认这个测试真的能抓住这个 bug。 - 实测
doctor输出:✓ D:\DSH\_doc_check\腾讯\WorkBuddy\WorkBuddy.exe,中文完整、存在性正确。
给中招的人(在你升级之前,或者万一还有别的编码)
临时指路,设完完全退出 DSH 再启动:
[Environment]::SetEnvironmentVariable("WORKBUDDY_APP_EXECUTABLE",
"D:\ruanjian\anzhuang\腾讯\WorkBuddy\WorkBuddy.exe", "User")写进 $DSH_HOME/.env 也一样有效(不用注销,更省事)。