NSIS卸载Excel加载项时删除未知注册表项无日志输出排查
问题诊断与解决思路
1. 确认LogText命令的有效性
NSIS默认没有内置LogText命令,该功能通常依赖第三方插件(如nsisLog)或自定义宏。若未正确加载对应插件/定义宏,日志输出命令根本不会生效:
- 检查卸载脚本头部是否包含插件加载语句,例如:
!include "nsisLog.nsh" - 若为自定义宏,需确认定义是否正确,示例如下:
!macro LogText text FileOpen $2 "$INSTDIR\uninstall.log" a FileWrite $2 "${text}$\r$\n" FileClose $2 !macroend
2. 日志文件路径的权限与位置问题
C盘根目录受UAC权限限制,普通用户权限下无法直接写入C:\install.log,导致日志无法生成:
- 建议将日志路径改为用户可写位置,比如:
- 安装目录:
$INSTDIR\uninstall.log - 用户临时目录:
$TEMP\uninstall.log
- 安装目录:
- 若坚持使用C盘路径,需确保卸载程序以管理员权限运行,在脚本中添加:
RequestExecutionLevel admin
3. 卸载程序日志的独立配置
安装程序与卸载程序的日志默认分开,若未在卸载脚本中明确指定日志输出,即使LogText有效也不会写入安装时的install.log:
- 使用
nsisLog插件时,需在卸载脚本开头设置日志文件:SetLogFile "$INSTDIR\uninstall.log" - 自定义宏时,直接在宏中指定目标日志文件路径即可。
4. 脚本逻辑的潜在验证点
若上述配置都正确但仍无日志,需验证循环逻辑是否触发:
- 在脚本开头添加固定日志语句,确认
LogText功能正常:LogText "卸载程序开始执行" - 检查注册表路径是否匹配用户的Office版本,若用户安装的不是Office 2016/2019/365(对应版本号16.0),需调整路径中的版本数字。
修正后的示例卸载脚本片段
!include "nsisLog.nsh" RequestExecutionLevel admin ; 初始化卸载日志 SetLogFile "$INSTDIR\uninstall.log" ; Iterates through the registry and unregisters the Add-In from Excel StrCpy $0 0 loop: LogText "Checking registry key: SOFTWARE\Microsoft\Office\16.0\Excel\Options -> OPEN$0" ${If} $0 == 0 ReadRegStr $1 HKCU "SOFTWARE\Microsoft\Office\16.0\Excel\Options" "OPEN" ${Else} ReadRegStr $1 HKCU "SOFTWARE\Microsoft\Office\16.0\Excel\Options" "OPEN$0" ${EndIf} ${if} $1 == "" LogText "Registry key is empty. Exiting loop." Goto end ${EndIf} LogText "Registry value: '$1'" ${If} $1 != "$INSTDIR\MyAddIn.xlam" LogText "Not our Add-In. Skipping..." Goto next ${Else} ${If} $0 == 0 LogText "Removing registry key: SOFTWARE\Microsoft\Office\16.0\Excel\Options -> OPEN" DeleteRegValue HKCU "SOFTWARE\Microsoft\Office\16.0\Excel\Options" "OPEN" ${Else} LogText "Removing registry key: SOFTWARE\Microsoft\Office\16.0\Excel\Options -> OPEN$0" DeleteRegValue HKCU "SOFTWARE\Microsoft\Office\16.0\Excel\Options" "OPEN$0" ${EndIf} Goto end ${EndIf} next: IntOp $0 $0 + 1 Goto loop end: LogText "卸载程序执行完毕"
内容的提问来源于stack exchange,提问作者Paulo Santos
相关产品推荐
相关产品推荐

