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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 07:00:12