NSIS Script是配置NSIS打包工具的基础,它使用类似脚本语言的语法规则。
1. 脚本文件格式
在NSIS脚本文件中每一行被称为一个命令(Command),命令的格式是 command [parameters],例如
File "myfile"
在NSIS脚本中使用分号(;)或者井号(#)作为行注释,也可以使用C语言中的注释 /* */来注释一块代码。
调用Plugin-in中函数的方式 plugin::command [parameters],例如:
nsExec::Exec "myfile"
当参数中包含数字时,可以使用十进制、十六进制(以0x开头)或者八进制(以0开头)表示,颜色RGB值使用类似html网页中颜色的表示方式(使用16进制数,但是不包含#号),例如:
IntCmp 1 0x1 1bl_equal
SetCtlColors $HWND CCCCCC ;CC是红色、绿色和蓝色成分
字符串使用引号表示,引号可以是单引号、双引号
变量使用$引用,变量的定义使用Var关键字,例如
Var MYVAR
StrCpy $MYVAR "myvalue"
2. NSIS脚本中的变量
NSIS脚本中的变量长度限定在1024个字符以内,所有的变量都是全局的,这些变量可以被用在区段和函数之中。
2.1 用户自定义变量
用户自定义变量使用Var命令来定义,当使用的时候使用$开头来引用它,所有被定义的变量都是全局变量(即使他们在函数和区段中被定义),在函数和区段中定义变量的时候需要加上 /GLOBAL 标签,在函数和区段之外定义没有这样的要求。
Var example
Function testVar
Var /GLOBAL example2
StrCpy $example "example value"
StrCpy $example2 "another example value"
FunctionEnd
2.2 其他预定义变量
在NSIS脚本中预先定义了20个变量,它们是:
0,
1,
2,
3,
4,
5,
6,
7,
8,
9,
R0,
R1,
R2,
R3,
R4,
R5,
R6,
R7,
R8,
R9
这些预先定义的变量可以被用于函数和区段,不需要定义,使用它们不会出现名字冲突。
INSTDIR安装目录( INSTDIR一般会被StrCpy、ReadRegStr、ReadINIStr等函数修改,可以在.onInit函数中作一些检测以确定安装程序需要安装的位置)
$OUTDIR
当前输出的目录位置
$CMDLINE
安装包的命令行参数
$LANGUAGE
当前使用的语言,例如English是1033,可以在.onInit中修改
2.3 常量
PROGRAMFILES
PROGRAMFILES32
PROGRAMFILES64在64位计算机中使用
PROGRAMFILES64,它一般指向 c:\ProgramFIles
$DESKTOP 运行时解析的桌面位置,一般是 C:\Windows\Desktop
${NSISDIR}电脑上NSIS的安装目录,可以使用它来获取NSIS安装中的一些资源和UI等
3. 标签
在NSIS脚本中,经常会使用Goto来跳转程序的执行流程,在Goto使用中会需要标签。标签必须在区段或者函数中使用,标签在局部作用域中起作用(并非是全局的),定义标签的方式很简单:
MyLabel:
便定义好了一个标签,标签不能使用特殊符号和数字开头(-, +, !, $, or 0-9)在定义Label的时候以 .开头的Label是全局的Label,可以从任何函数或者区段中跳跃到该Label(但是不能从安装段跳跃到卸载段,反向也不行)
4. 相对跳转
使用Label的跳转是绝对的,即从某处跳转到Label指定的位置。除此之外NSIS脚本还支持相对跳转,可以跳跃一定的行数。使用 +2 +3 和 -2 -3 类似的风格跳转。
5. 页面
每一个NSIS脚本包含一系列的页面,这些页面可以是内置的页面(built-in Page),也可以是用户自定义的页面(通过nsDialogs或者InstallOptions定义的页面)
页面主要包括两种类型,Page定义的页面(出现在安装程序中)以及 UninstPage(出现在卸载程序中),此外PageEx可以更灵活的配置页面出现的位置以及方式
5.1 顺序
页面出现的顺序与它们在脚本中的位置一致,例如
Page license
Page components
Page directory
Page instfiles
UninstPage uninstConfirm
UninstPage instfiles
5.2 页面选项
License页面:
- LicenseText
- LicenseData
- LicenseForceSelection
模块选择页面:
- ComponentText
安装位置页面: - DirText
- DirVar
- DirVerify
卸载安装日志页面: - DetailsButtonText
- CompletedText
卸载确认页面: - DirVar
- UninstallText
此外每个页面的标题使用Caption来设置
5.3 页面回调函数
每一个内置的页面有三个回调函数:
pre-function
show-function
leave-function
自定义的页面只包含两个函数,其中有一个是必须的,该函数是你创建页面时候的回调函数,另一个回调函数是leave-function(和内置一样),下面是一个使用回调函数的示例:
Page license skipLicense "" stayInLicense
Page custom customPage "" ": custom page"
Page instfiles
Function skipLicense
MessageBox MB_YESNO "Do you want to skip the license page?" IDNO no
Abort
no:
FunctionEnd
Function stayInLicense
MessageBox MB_YESNO "Do you want to stay in the license page?" IDNO no
Abort
no:
FunctionEnd
Function customPage
GetTempFileName $R0
File /oname=$R0 customPage.ini
InstallOptions::dialog $R0
Pop $R1
StrCmp $R1 "cancel" done
StrCmp $R1 "back" done
StrCmp $R1 "success" done
error: MessageBox MB_OK|MB_ICONSTOP "InstallOptions error:$\r$\n$R1"
done:
FunctionEnd
6. 页面的定义语法
Page :
自定义页面:
custom [creator_function] [leave_function] [caption] [/ENABLECANCEL]
内置页面:
internal_page_type [pre_function] [show_function] [leave_function] [/ENABLECANCEL]
UninstPage
自定义页面:
custom [creator_function] [leave_function] [caption] [/ENABLECANCEL]
内置页面:
internal_page_type [pre_function] [show_function] [leave_function] [/ENABLECANCEL]