通过NSIS添加控制面板卸载项时注册表键未写入的问题
问题:NSIS安装程序未在注册表中写入卸载项信息
我正在使用NSIS为应用程序制作安装/卸载程序,希望在控制面板的「添加/删除程序」列表中创建卸载项。参考相关步骤并考虑64位系统的注册表视图设置后,编写了如下代码:
Section "" SetOutPath $INSTDIR File /r appfiles\ ${If} ${RunningX64} SetRegView 64 ${Else} SetRegView 32 ${Endif} WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Aplicacion" "DisplayName" "Desinstalar Aplicación" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Aplicacion" "UninstallString" "$\"$INSTDIR\uninstall.exe$\"" WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Aplicacion" "DisplayIcon" "$\"$INSTDIR\appfiles\Resources\logo.jfif$\"" WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Aplicacion" "NoModify" 1 WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Aplicacion" "NoRepair" 1 SetRegView lastused WriteUninstaller "$INSTDIR\uninstall.exe" SectionEnd
但运行安装程序后,通过regedit.exe查看对应注册表项,发现未写入任何内容,请问遗漏或操作错误的地方是什么?
问题排查与解决
1. 命令参数跨行导致语法错误
你的代码中,WriteRegStr命令的最后一个参数(字符串值)被拆分成了两行,比如:
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Aplicacion" "DisplayName" "Desinstalar Aplicación"
NSIS不允许命令参数跨行拆分,这会导致命令缺少必要的参数值,无法执行注册表写入操作。需要把参数放在同一行:
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Aplicacion" "DisplayName" "Desinstalar Aplicación"
同理修正UninstallString和DisplayIcon对应的WriteRegStr命令。
2. 缺少管理员权限
写入HKLM(本地机器)注册表项需要管理员权限,NSIS默认以普通用户权限运行,会导致注册表写入失败。需要在脚本开头添加以下代码,请求管理员权限:
RequestExecutionLevel admin
3. 额外验证点
- 确认
${RunningX64}宏已正确引入,需在脚本开头包含x64.nsh头文件:!include x64.nsh - 检查安装程序运行时是否弹出UAC提示,如果没有,说明权限请求未生效,需确认
RequestExecutionLevel设置正确。
内容的提问来源于stack exchange,提问作者tutiplain
相关产品推荐
相关产品推荐

