NSIS 脚本结构

一个 NSIS 脚本应该包括安装程序属性和区段、函数。 你也可以使用编译器命令在编译的时候进行指定。 所必需的是 OutFile 指令 (该命令告诉 NSIS 安装程序输出路径) 和一个区段。

安装程序属性
安装程序属性确定你的安装程序的性能、外观和习惯。由这些属性你可以更改安装的时候显示的文本、安装类型的数量等。这些命令大多数在运行时仅被设定并且不能更改。

其他基本的指令为 Name 和 InstallDir。

关于安装程序属性更多的信息,可以参阅 安装程序属性。

页面
一个非静默安装程序需要向导页面来指导用户运行安装程序,你可以通过 Page 命令 ( 或更多高级设置如PageEx )。 来设定哪个页面显示。一个典型的设置像这样:Page license Page components Page directory Page instfiles UninstPage uninstConfirm UninstPage instfiles区段
在一个普通的安装包里用户需要安装许多东西。例如在 NSIS 分配安装包里你可以选择安装源码、附加插件、脚本样例或其他。里面的每个组件都有它自己的代码块,当用户选择了安装该组件,那么安装程序就会执行对应的代码。在脚本里,这些代码称为区段。每个可见的区段都可以作为一个组件给用户选择是否安装,在这里我们暂不讨论不可见的区段。你可以只使用一个区段来构建安装包,但是如果你想要使用组件页来让用户选择可选的组件,那你就需要使用多个区段。

卸载程序也可以有多个区段。卸载程序区段名前要加上前缀“un.”。例如:[code]Section “Installer Section”
SectionEnd

Section “un.Uninstaller Section”
SectionEnd[/code]使用在段里的指令和安装程序属性指令不一样,他们在用户电脑运行环境里执行。

这些指令可以解压文件读取和写入注册表、INI文件或普通文件,创建目录,创建快捷方式和更多功能。你可以在 指令 找到更多。

更多的基本用法说明 SetOutPath 告诉安装程序要把文件输出到哪里,和要解压哪些 文件。

例:Section "My Program" SetOutPath $INSTDIR File "My Program.exe" File "Readme.txt" SectionEnd关于区段更详细的信息请看 区段。

函数
函数和区段类似,也包含了代码。 区段和函数所不同的是他们被调用的形式。一共有两种函数类型:用户函数和回调函数。

用户函数可以从一个区段里或另一个函数使用 Call 指令。 用户函数不能直接执行而只能调用它。在函数内的代码都会被执行然后安装程序会继续执行 Call 指令后面的指令,除非你在函数里面使用了退出指令。用户函数当你在安装程序里需要多次、多处使用一组指令的时候非常有用。如果你把代码放到一个函数里你可以节省拷贝的次数并且更容易的去修改、更新代码。

回调函数可以在某些定义事件之前被调用比如当安装程序开始运行时。回调是可选的。例如你想欢迎用户使用你的安装程序你可以定义一个名为 .onInit 的函数。NSIS 编译器会由它的名字知道它是一个回调函数并且会在安装程序开始时调用它。Function .onInit MessageBox MB_YESNO "即将安装我的程序,要继续吗?" IDYES gogogo Abort gogogo: FunctionEndAbort 在回调函数里有特殊含义。每个回调函数都有它自己的含义,详细情况请查看 回调函数 。 在上面的例子中 Abort 告诉安装程序停止初始化安装并立即退出。

关于函数更详细的信息请参阅 函数。

脚本的工作方式

变量

你可以用 Var 命令来声明自己的变量($VARNAME)。 变量是全局的并且可以在任何区段或函数中使用。

声明并使用一个用户变量 :

Var BLA ;声明变量[code]Section bla

StrCpy $BLA “123” ;现在你可以使用该变量 $BLA

SectionEnd[/code]另外堆栈可以用来作临时存储。 使用 Push 和 Pop 命令来访问堆栈。Push把一个值添加到堆栈,Pop 移除一个值并且设置该变量。

对于公共代码,这里有 20 个已注册的变量 (如 $0 和 $R0)。 这些静态的变量你不需要声明并且你不应使任何名字与之相冲突。 如果你想在公共代码里使用这些变量,你可以把原始的值存储在堆栈并随后恢复原始值。

在调用函数后,变量包含原来的值。需要注意使用多个变量时的次序(后进先出):[code]Function bla

Push $R0
Push $R1

...code...

Pop $R1
Pop $R0

FunctionEnd[/code]调试脚本
如果你要实现更多的功能那么你的脚本就会变得更复杂。这将会增加出错的可能性,特别是当你使用了很多变量的时候。以下将有可能会对你的脚本调试有所帮助。 使用MessageBoxes 或 DetailPrint 来显示变量内容。 对所有变量使用 Dumpstate 插件来勾画总体大纲。 默认情况下安装程序会把所有的操作显示在记录窗口上,你可以把记录的文本复制到剪贴板里(Ctrl+C 或使用鼠标右键的复制菜单),当然也有方法把它直接写到一个文件里,看 这里。

编译器命令
编译器命令会在你编译时在你的电脑上执行。他们可以用于条件编辑、包含头文件、运行一个应用程序、改变工作目录和更多。最常见的用法是定义,定义是编译时的常量,你可以定义你的产品版本号并在你的脚本里使用。例如:!define VERSION "1.0.3" Name "My Program ${VERSION}" OutFile "My Program Installer - ${VERSION}.exe"关于定义更详细的信息请看 条件编辑。

另一个常见的命令是宏。宏用于在编译时插入代码,依赖于定义并使用定义的值。一个关于宏的例子是 升级 DLL, 你可以用来升级一个 DLL 文件。宏的命令在编译时会插入。这样你只需要写一个通用的代码并只需要作为小的更改就可以多次的使用。例如:[code]!macro MyFunc UN
Function ${UN}MyFunc
Call ${UN}DoRegStuff
ReadRegStr $0 HKLM Software\MyProgram key
DetailPrint $0
FunctionEnd

!insertmacro MyFunc “”
!insertmacro MyFunc “un.”[/code]宏帮助你避免在安装部分和卸载部分写重复的代码。

上面两个 !insertmacros 插入了两个函数,一个是 MyFunc 用于安装部分,另一个是 un.MyFunc 用于卸载部分,但他们做的是同一件事。