You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NSIS中DeleteRegKey仅二次安装后生效的问题求助

问题分析与解决办法

核心问题

你的卸载代码中直接调用DeleteRegKey删除HKLM下的卸载注册表项,但NSIS的DeleteRegKey默认仅能删除空的注册表项(即项内无任何子键或值)。而你在安装时向该项写入了DisplayName、DisplayIcon、UninstallString三个值,未先清除这些值就删除父项,必然导致删除操作失效。

首次卸载看似正常可能是系统缓存延迟掩盖了问题,二次安装后注册表项的状态变化让问题显性化。

修复步骤

  1. 卸载时先清除注册表项内的所有值
    在删除HKLM的卸载项前,先逐个删除其中的注册表值,再删除空项:

    Section "Uninstall"
      ; 删除快捷方式
      Delete "$DESKTOP\${NAME}.lnk"
    
      ; 删除卸载程序
      Delete "$INSTDIR\Uninstall.exe"
    
      ; 删除安装目录及上级空目录
      RMDir /r "$INSTDIR"
      ${RMDirUP} "$INSTDIR"
    
      ; 删除HKCU配置项
      DeleteRegKey HKCU "Software\${NAME}"
    
      ; 删除HKLM卸载项:先清值,再删空项
      SetRegView 64
      DeleteRegValue HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${NAME}" "DisplayName"
      DeleteRegValue HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${NAME}" "DisplayIcon"
      DeleteRegValue HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${NAME}" "UninstallString"
      DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${NAME}"
    SectionEnd
    
  2. 添加二次安装检测(可选但推荐)
    避免用户不卸载直接换路径安装的情况,在初始化时检测是否已存在安装记录,若已安装则提示卸载:

    Function .onInit
      ReadRegStr $0 HKCU "Software\${NAME}" ""
      ; 若存在已安装路径
      StrCmp $0 "" +3
        MessageBox MB_YESNO "${NAME} 已安装,是否先卸载现有版本?" IDYES RunUninstall
        Abort
      RunUninstall:
        ExecWait '$0\Uninstall.exe'
    FunctionEnd
    
  3. 统一注册表视图设置
    若你的安装包仅针对64位系统,可在脚本开头就设置SetRegView 64,避免后续代码中因视图不一致导致的注册表操作异常。

补充说明

你之前添加的IfErrors未捕获到错误,是因为NSIS的DeleteRegKey在非空项上执行时不会触发错误标记,必须先清空项内内容才能确保删除操作成功。

内容的提问来源于stack exchange,提问作者hbt_han

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 18:57:46