NSIS简介

1. 简介

NSIS是一款帮助开发者创建Windows安装包的工具,NSIS通过NSIS脚本语言(NSIS Script)来配置安装过程中的信息,通过灵活的脚本方式,NSIS可以实现从最简单的文件拷贝包制作,到需要读写注册表、配置环境变量、以及网络安装等复杂的安装包制作。

2. NSIS脚本

NSIS脚本是一种简单的脚本语言,这种脚本语言主要面向安装包的制作,可以使用任何一种文本编辑器进行编写。

NSIS脚本中的每一行是一个命令,如果命令行过长,可以使用一个反斜杠’\’转到下一行,这两行在编译过程中会被视为一行处理,例如:

Messagebox MB_OK  | MB_ICONINFORMATION \
"This is a sample that shows how to use line breaks for larger commands in NSIS scripts"

当在字符串中添加一个双引号”时,可以使用转义符号 $\”或者使用另外一种引号如`或者 ‘,二者都可以作为字符串的符号。

NSIS脚本文件的后缀是 .nsi, 头文件使用 .nsh后缀,通过头文件和脚本文件可以合理组织脚本语言(例如可以将公用的脚本放在头文件中,并使用 !include 引入)

!include Sections.nsh

3. NSIS脚本结构

一个NSIS脚本文件包括 安装属性(Installer Attributes)、区段(Sections)和函数(Functions),此外还可以使用编译命令来对编译过程进行控制。

3.1 安装属性

安装属性决定了安装包的行为以及安装包运行的风格和UI等内容。通过修改属性可以配置安装过程中出现的显示信息。

3.2 安装页

一个非静默安装的安装包一般会包含许多向导页面一步步引导用户完成安装过程,可以通过设置Page命令来显示或者隐藏向导页面,一般来说典型的安装页面包括:

  1. Page License
  2. Page components
  3. Page directory
  4. Page instfiles
  5. UnistPage uninstConfirm
  6. UninstPage instfiles

下面给出几张安装过程的页面:

License页面

Component页面

Directory页面

3.3 区段(Sections)

在我们安装程序的过程中可以选择安装不同的部分,例如在安装Office套件的过程中,可以选择只安装word、excel而不去安装其他软件,当我们勾选安装部分之后,NSIS对应的脚本就会执行,这其中的每一项对应脚本文件中的一个区段。区段的名称会显示在安装选项中,例如上面所说安装Office的脚本类似于下面这种方式:

Section "Microsoft Word"
... 具体的word安装代码
SectionEnd

Section "Microsoft Excel"
... 具体的excel安装代码
SectionEnd

Section "Microsoft PowerPoint"
... 具体的powerpoint安装代码
SectionEnd

Section "Microsoft OneNote"
... 具体的onenote安装代码
SectionEnd

此外在卸载程序的过程中也会出现区段,区段的名称已un.开头,例如:

Section "un.Uninstaller Section"
SectionEnd

区段中使用的代码和安装属性中使用的代码有很大的不同,区段中的代码是在用户计算机上执行的,这些命令主要用来解压文件、读取和写入注册表、创建文件夹、创建快捷方式等。在区段中最重要的一个基本命令是 SetOutPath,用来将文件解压到指定的目录中。

3.4 函数

函数式可供调用的脚本块,函数主要分为两种类型:

  1. 用户自定义函数
  2. 回调函数

用户自定义的函数可以在区段或者其他函数中通过Call命令来调用,用户自定义的函数在调用它们的过程中被执行。

回调函数会被安装程序自动调用(在某个事件发生的时候:例如在安装过程开始的时候)回调函数在NSIS脚本中是可选的。经常使用的一个函数式.onInit,这个函数会在安装过程开始的时候被调用,例如可以做一个欢迎的画面:

Function .onInit
  MessageBox MB_YESNO "This will install My Program. Do you wish to continue?" IDYES gogogo
    Abort
  gogogo:
FunctionEnd

3.5 脚本的编写方式

在脚本编写过程中可以使用StrCmp、IntCmp、IfErrors、Goto等来实现条件执行(类似C语言中的if…else)和循环执行(类似C语言中的while),但是可以通过 脚本库中提供的LogicLib来简单的编写代码,要是用LogicLib需要在脚本文件中包含头文件 !include LogicLib.nsh

变量的书写方式:

可以使用Var命令来定义变量,变量都是全局的变量,可以在区段和函数中使用,定义变量的方式如下:
Var BLA ;定义了一个BLA的变量
Section bla
StrCpy $BLA “123” ;使用BLA变量,将它赋值为123
Seciton End

在脚本编写过程中,脚本自身提供一个堆栈,可以通过Push将变量压入堆栈中,使用Pop可以弹出栈顶变量。

另外脚本语言提供了20个已经注册的全局变量,我们可以直接使用而不需要声明,这20个变量类似于(0R0),可以使用堆栈配合这些变量使用,在使用它们之前把它们原来的值压入堆栈,使用之后再恢复它们原来的值,例如下面这个函数:

Function bla

  Push $R0
  Push $R1

    ...code...

  Pop $R1
  Pop $R0

FunctionEnd

可以使用MessageBoxes或者DetailPrint来获取脚本中变量的值,从而帮助调试脚本程序。

3.6 脚本的执行

当用户运行安装程序或者卸载程序的时候,定义在脚本文件中的页面区段代码(Sections)会被按定义在脚本中的顺序执行。除此之外如果定义了回调函数,那么在某些时候这些函数会被调用执行。

3.7 编译命令

在编译霍城中可以使用编译命令,编译命令中另一个常用的部分是宏(Macros),宏定义了一系列的执行动作,可以在脚本的其他地方调用,当编译脚本时这些宏被执行。

NSIS 用户手册 新闻、信息、支持、例子、指南等可以到 http://nsis.sf.net 查看。 快速链接: FAQ - 常见问题列表 NSIS Wiki - 例子、函数、指南、插件、软件等等 Forum - 发表你的问题或进行 NSIS 相关讨论 版权所有 (C) 1999-2009 贡献者 第一章: 介绍 NSIS 关于 NSIS 主要特性 特性列表 第二章: 教程: 基础知识 介绍 脚本文件 脚本结构 安装程序属性 页面 区段 函数 脚本的工作方式 逻辑代码结构 变量 调试脚本 脚本的执行 编译器命令 编译器 新式用户界面(Modern UI) 插件 更多 第三章: 命令行的用法 MakeNSIS 的使用 选项 注意事项 环境变量 例子 安装程序的使用 公共选项 卸载程序特殊选项 例子 第四章: 脚本参考 脚本文件格式 变量 用户变量 Var 其他可写的变量 常量 在字符串里使用常量 标记 相对跳转 页面 次序关系 页面选项 回调 Page UninstPage PageEx PageExEnd PageCallbacks 区段 区段命令 AddSize Section SectionEnd SectionIn SectionGroup SectionGroupEnd 卸载区段 函数 函数命令 Function FunctionEnd 回调函数 安装回调 .onGUIInit .onInit .onInstFailed .onInstSuccess .onGUIEnd .onMouseOverSection .onRebootFailed .onSelChange .onUserAbort .onVerifyInstDir 卸载回调 un.onGUIInit un.onInit un.onUninstFailed un.onUninstSuccess un.onGUIEnd un.onRebootFailed un.onSelChange un.onUserAbort 安装程序属性 常规属性 AddBrandingImage AllowRootDirInstall AutoCloseWindow BGFont BGGradient BrandingText Caption ChangeUI CheckBitmap CompletedText ComponentText CRCCheck DetailsButtonText DirText DirVar DirVerify FileErrorText Icon InstallButtonText InstallColors InstallDir InstallDirRegKey InstProgressFlags InstType LicenseBkColor LicenseData LicenseForceSelection LicenseText MiscButtonText Name OutFile RequestExecutionLevel SetFont ShowInstDetails ShowUninstDetails SilentInstall SilentUnInstall SpaceTexts SubCaption UninstallButtonText UninstallCaption UninstallIcon UninstallSubCaption UninstallText WindowIcon XPStyle 编译器标记 AllowSkipFiles FileBufSize SetCompress SetCompressor SetCompressorDictSize SetDatablockOptimize SetDateSave SetOverwrite 版本信息 VIAddVersionKey VIProductVersion 指令 基本指令 Delete Exec ExecShell ExecWait File Rename ReserveFile RMDir SetOutPath 注册表、INI 文件指令 DeleteINISec DeleteINIStr DeleteRegKey DeleteRegValue EnumRegKey EnumRegValue ExpandEnvStrings FlushINI ReadEnvStr ReadINIStr ReadRegDWORD ReadRegStr WriteINIStr WriteRegBin WriteRegDWORD WriteRegStr WriteRegExpandStr 常规用途指令 CallInstDLL CopyFiles CreateDirectory CreateShortCut GetDLLVersion GetDLLVersionLocal GetFileTime GetFileTimeLocal GetFullPathName GetTempFileName SearchPath SetFileAttributes RegDLL UnRegDLL 流程控制指令 Abort Call ClearErrors GetCurrentAddress GetFunctionAddress GetLabelAddress Goto IfAbort IfErrors IfFileExists IfRebootFlag IfSilent IntCmp IntCmpU MessageBox Return Quit SetErrors StrCmp StrCmpS 文件指令 FileClose FileOpen FileRead FileReadByte FileSeek FileWrite FileWriteByte FindClose FindFirst FindNext 卸载程序指令 WriteUninstaller 混合指令 GetErrorLevel GetInstDirError InitPluginsDir Nop SetErrorLevel SetRegView SetShellVarContext Sleep 字符串操作指令 StrCpy StrLen 堆栈支持 Exch Pop Push 整数支持 IntFmt IntOp 重新启动指令 Reboot SetRebootFlag 安装记录指令 LogSet LogText 区段管理 SectionSetFlags SectionGetFlags SectionSetText SectionGetText SectionSetInstTypes SectionGetInstTypes SectionSetSize SectionGetSize SetCurInstType GetCurInstType InstTypeSetText InstTypeGetText 用户界面指令 BringToFront CreateFont DetailPrint EnableWindow FindWindow GetDlgItem HideWindow IsWindow LockWindow SendMessage SetAutoClose SetBrandingImage SetDetailsView SetDetailsPrint SetCtlColors SetSilent ShowWindow 多语言指令 LoadLanguageFile LangString LicenseLangString 多语言 语言选择 LangDLL 插件 RTL 语言 插件 DLLs 使用插件命令 手动调用插件 静默安装程序、卸载程序 第五章: 编译时的命令 编译时的命令 !include !addincludedir !addplugindir !appendfile !cd !delfile !echo !error !execute !packhdr !system !tempfile !warning !verbose 预定义 ${__FILE__} ${__LINE__} ${__DATE__} ${__TIME__} ${__TIMESTAMP__} 范围预定义 ${__GLOBAL__} ${__SECTION__} ${__FUNCTION__} ${__PAGEEX__} ${__UNINSTALL__} 读取环境变量 $%envVarName% 条件编译 !define !undef !ifdef !ifndef !if !ifmacrodef !ifmacrondef !else !endif !insertmacro !macro !macroend !searchparse !searchreplace 附录 A: 新式用户界面(Modern UI) 附录 B: DLL/TLB 库的安装 介绍 库的安装 介绍 参数 选项 LIBRARY_X64 LIBRARY_SHELL_EXTENSION LIBRARY_COM LIBRARY_IGNORE_VERSION 注意事项 例子 取消共享 DLL 共享 DLL 库的卸载 介绍 参数 选项 LIBRARY_X64 LIBRARY_SHELL_EXTENSION LIBRARY_COM 例子 Visual Basic 6 运行库 附录 C: 常用脚本 获取 Internet Explorer 版本 判断 .NET Framework 是否已安装? 判断 Macromedia Flash Player 是否已安装? 连接到 Internet 获取安装程序文件名 禁止多个安装程序实例 更多 Appendix D: 常用信息 错误级别 添加卸载信息到添加/删除程序面板 使用 System.dll 插件来调用一个外部 DLL 把安装详细信息导出到文件 如何读取 REG_MULTI_SZ 值 附录 E: 常用头文件 文件函数头文件 介绍 Locate GetSize DriveSpace GetDrives GetTime GetFileAttributes GetFileVersion GetExeName GetExePath GetParameters GetOptions GetOptionsS GetRoot GetParent GetFileName GetBaseName GetFileExt BannerTrimPath DirState RefreshShellIcons 文本函数头文件 介绍 LineFind LineRead FileReadFromEnd LineSum FileJoin TextCompare TextCompareS ConfigRead ConfigReadS ConfigWrite ConfigWriteS FileRecode TrimNewLines 文字函数头文件 介绍 WordFind WordFindS WordFind2X WordFind2XS WordFind3X WordFind3XS WordReplace WordReplaceS WordAdd WordAddS WordInsert WordInsertS StrFilter StrFilterS VersionCompare VersionConvert 附录 F: 更新纪录和发行说明 2.44 更改日志 主要更改 次要更改 2.43 发行说明 更改日志 次要更改 实用程序和插件 翻译 Plug-in API 构建系统 2.42 发行说明 更改日志 主要更改 次要更改 翻译 构建系统 2.41 更改日志 次要更改 翻译 构建系统 2.40 更改日志 主要更改 次要更改 翻译 2.39 更改日志 主要更改 次要更改 2.38 更改日志 主要更改 次要更改 Modern UI 翻译 2.37 更改日志 主要更改 次要更改 实用程序和插件 翻译 构建系统 2.36 发行说明 更改日志 主要更改 Modern UI nsDialogs 次要更改 实用程序和插件 翻译 构建系统 2.35 更改日志 主要更改 次要更改 实用程序和插件 2.34 发行说明 更改日志 主要更改 次要更改 实用程序和插件 翻译 构建系统 2.33 发行说明 更改日志 主要更改 次要更改 实用程序和插件 翻译 构建系统 2.32 发行说明 更改日志 主要更改 次要更改 实用程序和插件 翻译 构建系统 2.31 发行说明 更改日志 次要更改 实用程序和插件 翻译 构建系统 2.30 发行说明 更改日志 主要更改 次要更改 实用程序和插件 翻译 构建系统 2.29 发行说明 更改日志 主要更改 次要更改 实用程序和插件 翻译 构建系统 2.28 更改日志 主要更改 次要更改 实用程序和插件 翻译 构建系统 2.27 发行说明 更改日志 主要更改 次要更改 构建系统 2.26 发行说明 更改日志 主要更改 次要更改 新/更改的命令 实用程序和插件 翻译 构建系统 2.25 更改日志 主要更改 次要更改 新/更改的命令 实用程序和插件 翻译 构建系统 2.24 更改日志 主要更改 次要更改 新/更改的命令 实用程序和插件 翻译 构建系统 2.23 更改日志 次要更改 实用程序和插件 构建系统 2.22 发行说明 更改日志 次要更改 新/更改的命令 翻译 构建系统 2.21 更改日志 主要更改 次要更改 新/更改的命令 翻译 构建系统 2.20 更改日志 次要更改 翻译 构建系统 2.19 更改日志 次要更改 新/更改的命令 插件 翻译 2.18 更改日志 次要更改 翻译 2.17 更改日志 次要更改 翻译 2.16 发行说明 更改日志 主要更改 新/更改的命令 次要更改 翻译 构建系统 2.15 更改日志 新/更改的命令 次要更改 翻译 构建系统 2.14 发行说明 更改日志 主要更改 次要更改 2.13 发行说明 更改日志 主要更改 新/更改的命令 次要更改 实用程序和插件 翻译 构建系统 2.12 更改日志 主要更改 新/更改的命令 次要更改 实用程序和插件 翻译 构建系统 2.11 发行说明 更改日志 主要更改 新/更改的命令 次要更改 实用程序和插件 翻译 构建系统 2.10 更改日志 主要更改 次要更改 翻译 构建系统 2.09 更改日志 主要更改 新/更改的命令 次要更改 翻译 构建系统 2.08 发行说明 更改日志 主要更改 次要更改 构建系统 2.07 发行说明 更改日志 主要更改 新/更改的命令 次要更改 Include Files 实用程序和插件 翻译 2.06 更改日志 主要更改 新/更改的命令 次要更改 实用程序和插件 2.05 发行说明 更改日志 新/更改的命令 次要更改 2.04 更改日志 主要更改 次要更改 2.03 发行说明 更改日志 主要更改 新/更改的命令 次要更改 2.02 更改日志 主要更改 新/更改的命令 次要更改 实用程序和插件 2.01 发行说明 更改日志 主要更改 新/更改的命令 次要更改 实用程序和插件 2.0 发行说明 更改日志 Changes from 1.98 Changes from RC4 2.0 Release Candidate 4 更改日志 主要更改 次要更改 实用程序和插件 2.0 Release Candidate 3 更改日志 次要更改 实用程序和插件 2.0 Release Candidate 2 更改日志 次要更改 实用程序和插件 2.0 Release Candidate 1 发行说明 更改日志 主要更改 实用程序和插件 2.0 Beta 4 发行说明 更改日志 主要更改 新/更改的命令 次要更改 实用程序和插件 2.0 Beta 3 2.0 Beta 2 2.0 Beta 1 2.0 Beta 0 2.0 Alpha 7 2.0 Alpha 6 2.0 Alpha 5 2.0 Alpha 4 2.0 Alpha 3 2.0 Alpha 2 2.0 Alpha 1 2.0 Alpha 0 旧版本 附录 G: 构建 NSIS 常规构建 在 Windows 上构建 在 POSIX 上构建 每日构建 附录 H: 致谢名单 程序员 资源设计师 翻译人员 文档编写者 附录 I: 许可协议 版权 适用许可协议 zlib/libpng 许可协议 bzip2 许可协议 通用公共许可证 版本1.0 LZMA 压缩模块特殊例外声明 附录 J: 简体中文用户手册说明 致谢 NSIS 交流 NSIS 相关网站 翻译反馈 免责声明
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值