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




