NSIS 使用笔记
nsis是一个免费开源的Windows程序安装包生成工具。
nsis可以创建带安装、卸载、系统设置、文件提取等功能的安装包。
nsis采用脚本方式创建安装包,可以很方便的控制安装过程。
查看NSIS手册是最好的学习方式。
nsis几个概念
nsis脚本包含的几个部分:
- Attributes安装包信息(名称、公司等等)
- Pages 安装向导页面
- Sections/Functions
Installer Attributes 安装器的属性
Name
InstallDir
OutFile:生成的安装包文件存放位置,一个安装包至少包含一个section。
Pages 安装引导页面
非静态的安装包一定有一组安装向导页面,用于配置安装过程(例如设置安装路径)。
典型的页面设置如下:
# 许可协议
Page license
# 选择安装组件
Page components
# 设置安装路径
Page directory
# 显示最终要安装的组件
Page instfiles
# 确认卸载
UninstPage uninstConfirm
# 要卸载的组件
UninstPage instfiles
Sections 安装节/组件
每一个section都对应一个component。当改组件被选中后,将会执行对应section的脚本指令。
section的名字就是显示的component名字。
例如:
Section "My Program"
SetOutPath $INSTDIR
File ”MyProgram.exe“
File "Readme.txt"
SectionEnd
Functions函数
function可以包含脚本代码,和section类似。function和section的区别是它们的调用方式不同。函数有两种类型,用户函数和回调函数。
用户函数通过Call指令调用;回调函数由安装器的特定事件触发。
普通函数、事件函数
格式:
Function func_name
# commands
FunctionEnd
函数名称格式:
- 以”.“开头的函数通常是安装器的回调函数
- 以”un.“开头的函数通常是在卸载时候被调用的回调函数
- 普通函数不以"."、"un."开头,例如:”SayHello“
调用函数:
Call SayHello
回调函数
安装时的回调函数
- .onGUIInit
- .onInit
- .onGUIEnd
- .onRebootFailed
- .onSelChange
- .onUserAbort
- .onVerifyInstDir
卸载时的回调函数
- un.onGUIInit
- un.onInit
- un.onUninstFailed
- un.onUninstSuccess
- un.onGUIEnd
- un.onRebootFailed
- un.onSelChange
- un.onUserAbort
脚本
逻辑代码结构
条件指令:
- StrCmp
- IntCmp
- IfErrors
- Goto
使用LogicLib(LogicLib.nsh)可以用很简单的宏构建复杂的逻辑结构。
使用LogicLib:
!include LogicLib.nsh
LoginLib中的指令:
- ${If}
- ${ElseIf}
- ${Else}
- ${EndIf}
- ${Switch}
- ${Case}
- ${Default}
- ${Break}
- ${EndSwitch}
- ${While}
- ${EndWhile}
- ${For}
- ${Next}
- ${Do}
- ${LoopUntil}
变量
使用Var声明变量,变量都是全局变量。
声明并使用变量:
Var BLA ;Declare the variable
Section bla
StrCpy $BLA "123" ;Now you can use the variable $BLA
SectionEndVar BLA ;Declare the variable
Stack 栈
Function bla
# 入栈
Push $R0
# 出栈
Pop $R0
FunctionEnd
调试脚本
通常可以使用MessageBoxes或DetailPrint输出调试日志。
也可以使用DumpState插件输出变量信息。
默认情况下,所有的安装行为都会输出到日志窗口。
运行脚本
当用户执行安装或卸载程序时,Page将以脚本中定义的顺序展示。当到达instfiles page,选中的组件的section的代码将以定义的顺序执行。如果没有展示component page,所有的section都会被执行。
编译器指令
定义编译时的常量(宏常量):!define
!define VERSION "1.0.3"
Name "My Program ${VERSION}"
OutFile "My Program Installer - ${VERSION}.exe"
定义宏代码块:macro
一次定义,多次复用。和c++中的宏类似,编译时时将代码插入引用的位置。
!macro MyFunc UN
Function ${UN}MyFunc
Call ${UN}DoRegStuff
ReadRegStr $0 HKLM Software\MyProgram key
DetailPrint $0
FunctionEnd
!macroend
!insertmacro MyFunc ""
!insertmacro MyFunc "un."
跳转
在StrCmp或其他逻辑判断语句后需要跳转执行代码,例如:
# 1 $0==0则跳转至标签view
StrCmp $0 0 view
# 2 $R0==0不做任何处理,$R0!=0则跳转至之后的第3条指令
StrCmp $R0 0 0 +3
常用指令
常用指令:
- SetOutPath 设置安装路径
- File 提取指定文件
- Call 调用用户函数
- Abort 停止安装,并立即退出