NSIS中DeleteRegKey仅二次安装后生效的问题求助
问题分析与解决办法
核心问题
你的卸载代码中直接调用DeleteRegKey删除HKLM下的卸载注册表项,但NSIS的DeleteRegKey默认仅能删除空的注册表项(即项内无任何子键或值)。而你在安装时向该项写入了DisplayName、DisplayIcon、UninstallString三个值,未先清除这些值就删除父项,必然导致删除操作失效。
首次卸载看似正常可能是系统缓存延迟掩盖了问题,二次安装后注册表项的状态变化让问题显性化。
修复步骤
卸载时先清除注册表项内的所有值
在删除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添加二次安装检测(可选但推荐)
避免用户不卸载直接换路径安装的情况,在初始化时检测是否已存在安装记录,若已安装则提示卸载:Function .onInit ReadRegStr $0 HKCU "Software\${NAME}" "" ; 若存在已安装路径 StrCmp $0 "" +3 MessageBox MB_YESNO "${NAME} 已安装,是否先卸载现有版本?" IDYES RunUninstall Abort RunUninstall: ExecWait '$0\Uninstall.exe' FunctionEnd统一注册表视图设置
若你的安装包仅针对64位系统,可在脚本开头就设置SetRegView 64,避免后续代码中因视图不一致导致的注册表操作异常。
补充说明
你之前添加的IfErrors未捕获到错误,是因为NSIS的DeleteRegKey在非空项上执行时不会触发错误标记,必须先清空项内内容才能确保删除操作成功。
内容的提问来源于stack exchange,提问作者hbt_han
相关产品推荐
相关产品推荐

