Windows 安装器损坏用户 PATH——将已有条目的盘符冒号 C:/D: 写成 C;/D;
严重程度:高(静默破坏系统配置,影响其他软件)
环境
- OS:Windows 11(build 26200),x64
- Qoder IDE 1.31.0,Windows x64 用户版安装器(Inno Setup,带 inno_updater)
- 安装路径:自定义非默认路径(
D:盘) - 安装前用户 PATH(
HKCU\Environment\Path)已有约 14 个条目
问题描述
安装完成后,用户 PATH 中与 Qoder 无关的已有条目出现损坏:部分条目盘符后的冒号(:)被替换为分号(;),一个有效条目因此被拆成两个无效条目,等同从 PATH 中静默移除。
实际损坏示例(同一次安装中出现 3 处)
| 安装前(正确) | 安装后(损坏) |
|---|---|
C:\Users\<user>\.dotnet\tools |
C;\Users\<user>\.dotnet\tools |
C:\Program Files\mingw64\bin |
C;\Program Files\mingw64\bin |
D:\<custom>\bun\bin(用户自定义目录) |
D;\<custom>\bun\bin |
损坏后的 PATH 被解析为幽灵段 C(或 D)+ 无盘符路径 \...,两者均无效。受影响的工具(本例中 bun、gcc/mingw 等)在新开的终端中直接"消失",且全程无任何报错,用户通常很久之后才会发现。
同一次写入中,安装器追加的自身条目(Qoder bin 目录)是正确的,说明损坏发生在对已有内容的改写环节。
证据(时间线)
- 安装前几分钟的
reg export HKCU\Environment备份:PATH 完好无损; - 备份与检查之间,系统内唯一对 PATH 的写入操作 = Qoder 1.31.0 安装(自定义路径);
- 安装完成后导出检查:出现上述 3 处
:→;损坏 + 新增 Qoder bin 条目(前后导出文件可提供)。
复现步骤
- Windows 11,确保用户 PATH 中已有多个含盘符的条目;
- 记录基线:
reg export HKCU\Environment pre.reg /y; - 运行 Qoder 用户版安装器,选择非默认安装路径;
- 再次导出:
reg export HKCU\Environment post.reg /y,对比可见部分已有条目X:\变为X;\。
预期行为
安装器仅向 PATH 追加自己的条目,其余内容原样保留(字节级不变)。
相关问题(疑似同源)
以自定义路径安装的 Qoder,在某次更新后新版出现在默认位置 %LOCALAPPDATA%\Programs\Qoder IDE,原自定义目录停留在旧版本不再更新(本机实例:旧版冻结于自定义路径,新版出现在默认位置,形成双份安装)。怀疑安装/更新脚本对"自定义路径 + 已有 PATH"的处理存在系统性缺陷。
修复建议
- 写 PATH 时采用"读取原值 → 仅末尾追加 → 写回"流程,不对已有字符串做任何字符级替换/重建;
- 排查 Inno Setup 脚本中对 Path 的改写逻辑(疑似把
:误当作分隔符或转义符处理); - 更新逻辑应从注册表
_is1键的InstallLocation定位原安装目录,定位失败时显式报错,而不是静默安装到默认位置。