nsis

更新时间:2023-10-26 14:14

NSIS(Nullsoft Scriptable Install System)是一个开源的 Windows 系统下安装程序制作程序。它提供了安装卸载系统设置、文件解压缩等功能。这如其名字所指出的那样,NSIS 是通过它的脚本语言来描述安装程序的行为和逻辑的。NSIS 的脚本语言和通常的编程语言有类似的结构和语法,但它是为安装程序这类应用所设计的。

简介

NSIS (Nullsoft Scriptable Install System) 是一个专业开源的制作 windows 安装程序的工具。

特点

1、开销小,一个完整功能的安装程序仅需要 34k 的额外开销。

2、支持大多数 Windows 平台,包括:Windows 10,Windows 8,Widows 7,Windows NT,Windows 2000,Windows XP,Windows 2003

3、支持三大压缩算法:ZLib,BZip2, LZMA

4、支持脚本

5、支持多语言

6、支持安装界面定制

7、提供可扩展的插件接口

8、支持网络安装、补丁

9、支持无人值守的安装模式

10、此外,NSIS的license允许任何用途免费使用。

脚本结构

(下称 nsi 脚本)主要包含安装程序属性、页面、区段、函数。

属性用来定义安装程序的行为和界面风格,这些属性大部分是编译时刻属性,即不能在运行时刻改变。

页面是指安装程序的向导页面。

示例:

Page license

Page components

Page directory

Page instfiles

UninstPage uninstConfirm

UninstPage instfiles

区段是对应某种安装/卸载选项的处理逻辑,该段代码仅当用户选择相应的选项才被执行。

卸载程序

示例:

SectionEnd

SectionEnd

在区段中可以使用很多指令用来完成诸如解压缩文件、读写注册表、创建目录、创建快捷方式等任务。

但最常用的指令是 SetOutPath 和 File。前者用于指定目的位置,后者用于指定文件。

示例:

SetOutPath

SectionEnd

区段名的修饰符“/o”表示该区段默认不选上,“-”表示隐藏区段(匿名区段也是隐藏区段),“!”表

示需要粗体显示的区段。

SectionIn 表示该区段和安装类型之间的关系:SectionIn insttype_index [RO]

RO 修饰符表示不可修改。

子区段用于包含多个区段:

SubSection [/e] Caption [subsection_name index output]

修饰符“/e”用于该子区段的所有区段是否默认展开。

函数包含了模块化的安装逻辑,在 nsi 脚本中函数分为两种:用户自定义函数回调函数

用户自定义函数仅当是 Call 指令调用时才被执行。

如果函数体中没有abort语句,则安装程序执行完了用户自定义函数,继续运行 Call 语句和指令。

用户自定义函数的语法如下:

Function <函数名>

# some commands

FunctionEnd

函数的调用则使用以下语法:

Call <函数名>

可见无论是函数的定义还是函数的调用都没有参数传递

通常 nsi 的参数传递是通过堆栈操作 Pop,Push 和 20 个寄存器变量 $0~$9、~ 进行的。

也可以通过全局变量完成参数传递。

如:

Var input ;

Var output ;

Section bla

Call square

SectionEnd

Function square

output = input^2

FunctionEnd

回调函数则是由在特定的时间点触发的程序段。常用的回调函数如 .onInit:

Function .onInit

Abort

gogogo:

FunctionEnd

NSIS 对于安装逻辑定义以下回调函数:

.onGUIInit

.onInit

.onInstFailed

.onInstSuccess

. onGUIEnd

.onMouseOverSection

.onRebootFailed

.onSelChange

.onUserAbort

.onVerifyInstDir

NSIS 对于卸载逻辑定义以下回调函数:

un.onGUIInit

un.onInit

un.onUninstFailed

un.onUninstSuccess

un.onGUIEnd

un.onRebootFailed

un.onUserAbort

版本

v2.45 2012.10.01

1、集成了网络上能够收集到的所有插件及应用示例;

2、集成了 VNISEdit v2.03 简体中文版 和 NotePad2 v3.1 简体中文版两个脚本编辑器,并能方便地切换;

3、集成了NSIS 文件夹压缩器、Resource Hacker、Zip2Exe、Ini2Nsi等实用工具;

4、附带了 NSIS用户手册和 NSIS图文教程集锦。

语法解说

注释

单行注释用井号“#”或分号“;”,跨行注释用可以用“C/C++”中注释语法。

9.2 数据类型

数字

数字常量可以用十进制、十六进制(0x为前缀)、八进制(0为前缀)表示。

颜色用类似 HTML 的中 RGB 表示法,但去 井号“#”。

字符串

字符串常量

美元符号、常用转意字符换行、回车、制表符的nsi语法表示分别为:$$,$ ,$ ,$

续行符

nsi 脚本用行尾的反斜杠“\u201d表示下一行和当前行逻辑上是同一行。

默认文件

如果在makensis同目录下有nsisconf.nsh文件,该文件会被自动包含,除非编译时指定/NOCONFIG选项。

标号

nsi 使用 GOTO 语句和 IfErrors、MessageBox、IfFileExists 及 StrCmp 进行程序控制流表示,标号是这些语句的目标语句。

标号定义的语法:标号:语句

标号必须定义在函数和区段中,其作用范围仅限于定义它的区段或函数。以点号“.”开头的标号是全局标号。

相对跳转

nsi 脚本常常使用相对跳转表示条件分枝,其语法是 [+-][1-9],加号表示从当前位置往前跳转,减号则表示从当前位置往后跳转。

数字表示跳转的语句条数。

示例:

Goto +4

Goto +3

Goto -3

安装

1、确定安装的功能和界面元素

2、编写 NSIS 脚本

3、使用 NSIS 提供的 makensis 或者 makensisw 程序,将步骤 2 编写的脚本编译成可执行的安装程序

4、调试安装程序,如果有问题退到第二步重复

5、随着 NSIS 的流行,有一些第三方的 NSIS 脚本开发环境出现了,如 HMNISEdit,Venis IX。

前者是完全开源的,后者仅对个人和非商业用途免费。在这些集成开发环境下,步骤2,3可以方便的组合在一起。

指令

nsi 脚本的编译器指令主要指仅在编译时刻执行的命令。

这些命令主要用来包含文件、条件化编译、定义常量、定义宏等。

定义常量和宏是编译器指令最主要应用。

定义常量的示例:

定义宏的示例:

!macro MyFunc UN

Function

Call

DetailPrint

FunctionEnd

变量定义

nsi 脚本的变量定义用 Var 关键字,后跟变量名,变量是全局的并且是大小写不敏感的。变量引用时需要加上前缀“$”。

除了用户自定义的变量外,nsi 脚本中与定义寄存器变量 $0~$9、~ 用于参数传递,以及系统变量用于特定用途。

这些变量主要有:

,,, 这些变量都是可写的。

,,,,,,$ TEMP,

,,,,,$ RECENT,

,,,,,,$ APPDATA,

,,,,$ ADMINTOOLS,

,,,。

nsi 脚本中可用于调试的系统函数有 MessageBoxes、DetailPrint、Dumpstate。

组成部分

Modern UI 是感观上模仿最新的 Windows 系统的界面风格,它由欢迎页面、结束页面和其他向导页面构成。

页面

向导页面是 NSIS 安装程序中最重要的界面元素,在 nsi 脚本中可以使用 NSIS 内置页面或者定制界面,通过脚本可以指定页面的顺序、显示样子和行为。Page指令用来定义安装程序中的页面,UninstPage用来定义,此外PageEx指令提供类是功能,但提供更多选项。页面的顺序和它在nsi脚本中出现的次序一致。

示例:

Page license

Page components

Page directory

Page instfiles

UninstPage uninstConfirm

UninstPage instfiles

规定安装程序首先显示license页面,然后显示components选择页面,接着显示安装目录选择页面。

不同的页面有不同的选项:

License page 有 LicenseText、LicenseData、LicenseForceSelection;

Components selection 页面有 ComponentText;

Directory selection 页面有 DirText、DirVar (仅能在 PageEx 中使用)、DirVerify;

Un/Installation log 页面有 DetailsButtonText、CompletedText;

Uninstall confirmation 页面有 DirVar (仅能在 PageEx 中使用)、UninstallText。

对于内置的 Page,NSIS 支持三个回调函数用于定制界面和验证,对于自定义页面 NSIS 支持两个回调函数。

Page 指令语法:

Page license|components|directory|instfiles|uninstConfirm) [pre_function] [show_function] [leave_function]

或者:

Page custom [creator_function] [leave_function] [caption]

示例:

Page instfiles

Function skipLicense

Abort

no:

FunctionEnd

Function stayInLicense

Abort

no:

FunctionEnd

Function customPage

GetTempFileName

File /oname= customPage.ini

InstallOptions::dialog

Pop

done:

FunctionEnd

UninstPage 指令语法

UninstPage custom [creator_function] [leave_function] [caption]

UninstPage (license|components|directory|instfiles|uninstConfirm) [pre_function] [show_function] [leave_function]

PageEx 语法

PageEx 使用嵌套结构,比如:

PageEx license

LicenseData readme.rtf

PageCallbacks licensePre licenseShow licenseLeave

PageExEnd

常用指令

nsi 大致可以分为基本指令、注册表及 ini 操作指令、通用指令、流程控制指令、文件操作指令、卸载指令、字符串处理指令、多语言支持指令、重启指令。

以下是常用的基本指令:

(1) Delete

Delete [/REBOOTOK] file

(2) Exec

Exec command

(3) ExecShell

ExecWait

ExecWait command

示例:

(4) File

File [/nonfatal] [/a] ([/r] [/x file|wildcard [...]] (file|wildcard) [...] | /oname=file.dat infile.dat)

/r选项用作递归模式,/x用于排出文件

示例:

File something.exe

File /a something.exe

File *.exe

File /r *.dat

File /r data

File /oname= emp.dat somefile.ext

File /r /x CVS myproject

File /r /x *.res /x *.obj /x *.pch source

(5) Rename

Rename [/REBOOTOK] source_file dest_file

(6) RMDir

RMDir [/r] [/REBOOTOK] directory_name

插件

nsi 支持插件,通过插件可以方便的扩展 NSIS 安装程序的功能。

NSIS 插件是用 C++、Delphi 等语言编写的 dll,在 nsi 脚本中调用 nsi 中的函数使用如下语法:

示例1

执行makensis.exe命令,显示该命令用法。

示例2

显示对话框

插件策略

默认情况下 NSIS 在其安装目录的子目录 Plugins 中搜索插件,用户可以使用 !addplugindir 指定增加插件的目录位置。

免责声明
隐私政策
用户协议
目录 22
0{{catalogNumber[index]}}. {{item.title}}
{{item.title}}