Skip to content

v1.7.4 — 装在中文文件夹里的 WorkBuddy,终于找得到了

Choose a tag to compare

@XDTrees XDTrees released this 30 Sep 02:36
· 55 commits to main since this release

「腾讯」两个字,让插件整整看不见一个装好、登录着、正在运行的 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 也一样有效(不用注销,更省事)。