Repository navigation
Replies: 2 comments
|
同机复验(绕过路径有效):本报告所在机器在两次应用内失败后,改为「完全退出 DSH → 从中性 cwd(
⇒ 安装器自身、安装目录( |
结论更新(2026-11-13):根因已定位——持锁者是 rc.2 新增「安装状态窗口」拉起的 rundll32,而非更新器自身感谢 #13086 中 CosMoss114 与 skoenng 的排查。此前我在该帖提出的疑问(
因此「安装器自身 cwd 已是 本机验证数据(Windows 11 10.0.26300、按用户安装到
|
Uh oh!
There was an error while loading. Please reload this page.
[Desktop/Win] 应用内自动更新 100% 失败:安装器备份改名 MoveFileExW 返回 error 32,重试 10 次全部失败(0.2.2-rc.1 → 0.2.2-rc.2)
摘要
Windows 桌面端 0.2.2-rc.1 升级到 0.2.2-rc.2 时,点击「安装并重启」后应用退出、安装器启动,但安装器在"把旧安装目录改名为
*.old-{GUID}作为回滚备份"这一步MoveFileExW返回 32(另一个程序正在使用此文件),重试 10 次全部失败后放弃;安装包已完整下载并校验通过。用户界面没有任何错误提示:应用被--force-run以旧版本重新拉起,仍然显示「安装并重启 0.2.2-rc.2」,于是形成"点一次失败一次"的循环。本机连续 2 次尝试 100% 复现。环境
resources/app.asar内 package.json:@deepseek-ai/dsh-desktop0.2.2-rc.1)→ 目标 0.2.2-rc.2D:\DSH\version)app-update.yml: provider generic, urlhttps://download.deepseek.com/dsh-desk/feeds/win-x64/)D:\DSH(非系统盘、普通 NTFS、当前用户可写、非 reparse point)DisplayVersion=0.2.2-rc.1、InstallLocation=D:\DSH、UninstallString="D:\DSH\Uninstall DeepSeek Harness.exe" /currentuser),update-info.json中isAdminRightsRequired: false,无需 UACD:\DSH%LOCALAPPDATA%\@deepseek-aidsh-desktop-updater\复现步骤
D:\DSH),从开始菜单快捷方式启动(快捷方式「起始位置」= 安装目录)。pending\deepseek-harness-0.2.2-rc.2-win-x64.exe,299,659,528 B,sha512 与update-info.json一致)。现象
%LOCALAPPDATA%\@deepseek-aidsh-desktop-updater\installer-logs\生成一份directory-failure-<YYYYMMDD-HHMMSS>.log(本机两份内容一致,仅 Time/GUID 不同)。证据
1. 安装器失败日志(原文)
第二份为
DSH.old-{12EB7F8A-...}、Time: 2026-11-12 18:17:15。Restoration error: 0说明旧目录未被破坏,仍是 rc.1。2. 排除权限 / 权限提升 / 磁盘问题
D:\DSH有 Modify 权限,可正常写入/删除测试文件;D 盘剩余 106 GB。update-info.json:{"fileName":"deepseek-harness-0.2.2-rc.2-win-x64.exe","sha512":"5rRAkVruKkm4KELAbTqV8ZFrMwSo3oESnzXb9ebkJWPCMe6WuHORQZR63uY+BqAc6sBdyBtwSelsCGh0k1NcJA==","isAdminRightsRequired":false}。installer.exe与pending\deepseek-harness-0.2.2-rc.2-win-x64.exe字节一致(SHA2567E25286518CE520B5C0943E178C52CDBA1CC9EC3680BC7DA181B79879E080C32,VersionInfo ProductVersion0.2.2-rc.2)。3. 进程工作目录(PEB
ProcessParameters.CurrentDirectory实测)运行时 8 个 DSH 进程的可执行文件都是
D:\DSH\DeepSeek Harness.exe,其 cwd:即:从快捷方式启动时,主进程及其 Electron 子进程的 cwd 就是安装目录
D:\DSH;Host 及其子进程的 cwd 是 profile 目录。4. 更新链路(源码)
apps/desktop/src/update-coordinator.ts:218:this.updater.quitAndInstall(true, true)。node_modules/electron-updater/out/):NsisUpdater.doInstall()只调用this.spawnLog(installerPath, args);BaseUpdater.spawnLog(cmd, args = [], env = undefined, stdio = "ignore")里spawn(cmd, args, { stdio, env, detached: true })—— 未指定cwd,安装器继承主进程 cwd。BaseUpdater.quitAndInstall():install()同步拉起安装器后,setImmediate(() => { ...; this.app.quit() }),即先拉起安装器、下一个 tick 才退出应用。分析:为什么 10 次重试注定失败
MoveFileExW返回 32 只可能来自两类保持:某进程把该目录当作 cwd(Windows 不允许重命名任何进程的当前目录),或目录内有句柄未以FILE_SHARE_DELETE打开。Sleep无意义;这与日志中"10 次全部 32、Restoration error: 0"完全吻合。补充一点与现有解释相冲突、需要确认的细节:#13086 将其解释为"安装器继承了主进程 cwd(安装目录)导致自锁"。但从仓库源码看,
apps/desktop/scripts/installer-directories.nsh:174-175在改名之前先执行SetOutPath $PLUGINSDIR,而 NSIS 的SetOutPath在运行时是SetCurrentDirectory(buf)(EW_CREATEDIR且parm1=1,见 NSISSource/exehead/exec.c;本机下载 NSIS 源码核对过)。也就是说:安装器自身在备份改名时的 cwd 已经是$PLUGINSDIR,而不是安装目录。因此若采纳"继承 cwd"的解释,还需解释改名瞬间仍持有D:\DSH的 cwd/句柄到底来自谁。同时,
installer.nsh:173-202的customCheckAppRunning只轮询$INSTDIR\${APP_EXECUTABLE_FILENAME}是否存在(250 ms × 40);本次既然写出了directory-failure日志而不是INSTALLER_RUNNING退出路径,说明该检查认为应用已退出,却仍有东西占着目录 —— 这是本报告最需要被定位的一点。建议
customInstallerDirectoryFailed在 silent 模式下只写日志、不提示;建议把Windows error: 32回传主进程,在更新 UI 上给出可读错误("安装目录被占用"),并把installer-logs路径呈现给用户。RmStartSession/RmRegisterResources/RmGetList)枚举占用$INSTDIR的进程与文件并写入日志;或枚举 cwd 位于$INSTDIR下的进程。这样一次复现就能定死根因,也能直接区分 "cwd 自锁" 与 "句柄未释放"。spawnLog显式给安装器一个中性 cwd(如app.getPath("temp"))——成本极低、无副作用,即使不是本 bug 的唯一原因也值得加。customCheckAppRunning从"只看 exe 文件"扩展为"exe 消失 +$INSTDIR下无进程 cwd/句柄",并把总预算从 ~10 s 提高到与目录改名重试预算相匹配的级别。250 ms × attempt(≈11 s),首次安装/杀软扫描 300 MB 目录时偏短;建议指数退避 + 总预算 60 s 量级的可配置值。临时绕过(用户可用,社区多例已验证有效)
完全退出 DSH(托盘退出 + 任务管理器确认无
DeepSeek Harness进程),从中性目录手动运行更新器已下载好的安装包:(
installer.exe与pending\deepseek-harness-0.2.2-rc.2-win-x64.exe相同;社区 #13086 报告从安装目录之外的 cwd 手动运行 37 s 完成。)另一条社区已验证路径是把快捷方式「起始位置」改为中性目录后从快捷方式启动再更新(#13086)。关联报告
本现象今天已有多个报告,本贴补充的是:Windows 11 26300 +
D:\DSH按用户安装的独立现场、PEB cwd 全量实测、以及与「安装器 cwd 自锁」解释存在冲突的 NSISSetOutPath语义核对。相关:#13086、#13057、#13054、#13080、#13037、#13040、#13041、#13076。备注
All reactions