You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多
文档控制台
免费开始使用

NSIS卸载程序调用插件函数:如何引入StrFunc并调用StrCase?

解决NSIS卸载程序中调用StrFunc函数的问题

我之前也碰到过这个一模一样的问题!NSIS的卸载程序其实是独立的执行上下文,主脚本开头导入的StrFunc.nsh只会在安装程序的作用域里生效,卸载段默认是看不到这些宏的,得手动把宏导入到卸载作用域中才行。

下面是一个可直接运行的完整示例脚本,包含安装和卸载时调用${StrCase}的逻辑:

; 基础配置
Name "StrFunc卸载调用测试"
OutFile "StrFuncTestSetup.exe"
RequestExecutionLevel user
InstallDir "$TEMP\StrFuncTest"

; 1. 主安装程序作用域导入StrFunc
!include "StrFunc.nsh"

; ------------------------------
; 安装段:正常调用StrFunc
; ------------------------------
Section "主安装段"
  ; 创建安装目录
  CreateDirectory "$INSTDIR"

  ; 调用${StrCase}将字符串转为大写
  ${StrCase} "hello from installer" "upper" $0
  MessageBox MB_OK "安装程序输出(大写):$0"

  ; 写入卸载信息
  WriteUninstaller "$INSTDIR\Uninstall.exe"
SectionEnd

; ------------------------------
; 卸载程序作用域导入StrFunc
; ------------------------------
; 编译卸载程序时,NSIS会自动定义UNINIT宏,我们借此判断并导入StrFunc
!ifdef UNINIT
  !include "StrFunc.nsh"
!endif

; ------------------------------
; 卸载段:调用StrFunc
; ------------------------------
Section "卸载段"
  ; 调用${StrCase}将字符串转为小写
  ${StrCase} "HELLO FROM UNINSTALLER" "lower" $1
  MessageBox MB_OK "卸载程序输出(小写):$1"

  ; 执行卸载清理
  Delete "$INSTDIR\Uninstall.exe"
  RMDir "$INSTDIR"
SectionEnd

关键说明:

  • 主脚本开头的!include "StrFunc.nsh"是给安装程序用的,卸载程序看不到这部分定义
  • 通过!ifdef UNINIT判断当前是否在编译卸载程序,此时重新导入StrFunc.nsh,就能让卸载段的代码识别到${StrCase}
  • 不需要用${un.StrCase}这种写法,因为StrFunc的宏是通用型的,只要在对应作用域导入,直接用${StrCase}即可

你把这个脚本保存为test.nsi,用NSIS编译器编译后,安装时会弹出大写字符串的提示,卸载时会弹出小写字符串的提示,完全可以正常运行。

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

火山引擎 最新活动