NSIS 用户手册

新闻、信息、支持、例子、指南等可以到 http://nsis.sf.net 查看。

快速链接:
FAQ - 常见问题列表
NSIS Wiki - 例子、函数、指南、插件、软件等等
论坛 - 发表你的问题或讨论 NSIS

版权所有 (C) 1999-2015 Nullsoft, Inc.

  • 第一章：介绍 NSIS
    • 关于 NSIS
    • 主要特性
    • 特性列表
    • Unicode 的安装程序
  • 第二章：指南：基础
    • 介绍
    • 脚本文件
    • 脚本结构
      • 安装程序属性
      • 页面
      • 区段
      • 函数
      • 脚本的工作方式
        • 逻辑代码结构
        • 变量
        • 调试脚本
      • 脚本执行
      • 编译器命令
    • 编译器
    • 新式用户界面 (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.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
        • ManifestDPIAware
        • ManifestSupportedOS
        • 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
        • Unicode
      • 版本信息
        • VIAddVersionKey
        • VIProductVersion
        • VIFileVersion
    • 指令用法说明
      • 基本指令
        • 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
        • FileReadUTF16LE
        • FileReadByte
        • FileReadWord
        • FileSeek
        • FileWrite
        • FileWriteByte
        • FileWriteUTF16LE
        • FileWriteWord
        • 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 语言
    • 插件 DLL
      • 使用插件命令
      • 禁止插件卸载
      • 手动调用插件
    • 静默安装、卸载
  • 第五章：编译时命令
    • 编译器工具命令
      • !include
      • !addincludedir
      • !addplugindir
      • !appendfile
      • !cd
      • !delfile
      • !echo
      • !error
      • !execute
      • !packhdr
      • !system
      • !tempfile
      • !warning
      • !verbose
    • 预定义
      • ${__COUNTER__}
      • ${__FILE__}
      • ${__FILEDIR__}
      • ${__LINE__}
      • ${__DATE__}
      • ${__TIME__}
      • ${__TIMESTAMP__}
      • ${NSIS_VERSION}
      • ${NSIS_PACKEDVERSION}
      • ${U+1}...${U+10FFFF}
      • 范围预定义
        • ${__GLOBAL__}
        • ${__SECTION__}
        • ${__FUNCTION__}
        • ${__PAGEEX__}
        • ${__UNINSTALL__}
        • ${__MACRO__}
    • 读取环境变量
      • $%envVarName%
    • 条件编译
      • !define
      • !undef
      • !ifdef
      • !ifndef
      • !if
      • !ifmacrodef
      • !ifmacrondef
      • !else
      • !endif
      • !insertmacro
      • !macro
      • !macroend
      • !searchparse
      • !searchreplace
  • 附录 A：新式用户界面
  • 附录 B：DLL/TLB 库的安装
    • 简介
    • 库的安装
      • 说明
      • 参数
      • 选项
      • 注意事项
      • 例子
    • 库的卸载
      • 说明
      • 参数
      • 选项
      • 例子
    • Visual Basic 6 Runtimes
  • 附录 C：常用脚本
    • 获取上级目录
    • 修剪新行(去除回车换行)
    • 获取命令行参数
    • 在字串里查找
    • 获取 Windows 版本
    • 获取 Internet Explorer 版本
    • 判断 .NET Framework 是否已安装
    • 判断 Macromedia Flash Player 是否已安装
    • 连接到 Internet
    • 获取安装程序文件名
    • 禁止多个安装程序实例
    • 更多的
  • 附录 D：常用信息
    • 错误级别
    • 添加卸载信息到添加删除面板
    • 使用 System.dll 来调用一个外部 DLL
    • 把安装详细信息导出到文件
    • 如何读取 REG_MULTI_SZ 值
  • 附录 E：常用头文件
    • 文件函数
      • 介绍
      • Locate
      • GetSize
      • DriveSpace
      • GetDrives
      • GetTime
      • GetFileAttributes
      • GetFileVersion
      • GetExeName
      • GetExePath
      • GetParameters
      • GetOptions
      • GetRoot
      • GetParent
      • GetFileName
      • GetBaseName
      • GetFileExt
      • BannerTrimPath
      • DirState
      • RefreshShellIcons
    • 文本函数
      • 介绍
      • LineFind
      • LineRead
      • FileReadFromEnd
      • LineSum
      • FileJoin
      • TextCompare
      • ConfigRead
      • ConfigWrite
      • FileRecode
      • TrimNewLines
    • 句子函数
      • 介绍
      • WordFind
      • WordFindS
      • WordFind2X
      • WordFind2XS
      • WordFind3X
      • WordFind3XS
      • WordReplace
      • WordReplaceS
      • WordAdd
      • WordAddS
      • WordInsert
      • WordInsertS
      • StrFilter
      • StrFilterS
      • VersionCompare
      • VersionConvert
    • 逻辑函数库
      • 介绍
      • 基本语句
      • 表达式
      • 例子
    • 常用函数库
      • 介绍
      • 字串处理函数
        • Find
        • FindI
        • FindLast
        • FindLastI
        • StrStr
        • StrStrI
        • StrRStrI
        • TrimLine
        • TrimLineEx
        • Replace
        • ReplaceEx
        • VerCmp
        • StrCase
        • StrToHex
        • ConvertANSIToUTF8
        • ConvertUTF8ToANSI
      • 文件、磁盘处理函数
        • GetParent
        • GetChild
        • GetFileExt
        • DumpLog
        • AppendFile
        • DelFileByLog
        • RMDir
        • ForEachFile
        • ForEachFileEx
        • SearchFile
        • IsWritable
        • GetVolume
        • TrimDir
        • FileTimeCmp
        • GetFileSize
        • CompactPathEx
        • RenameExtension
        • RelativePathTo
        • PathCanonicalize
        • RemoveArgs
        • CheckFileEncoding
      • 注册表处理函数
        • CopyReg
        • ReadRegBin
        • ReadRegMultiStr
        • WriteRegBin
        • WriteRegStrW
        • SHCopyKey
        • SHRegGetPath
        • GetRegKeyCount
        • GetRegValueCount
      • 杂项函数
        • CloseApp
        • IsWinNT
        • GetComputerName
        • GetInstallerName
        • GetLocaleInfo
        • GetWinName
        • GetUserName
        • RefreshIcon
        • ClearDetail
        • GetDllVersion
        • LoadImage
        • DeleteObject
        • DestroyCursor
        • DestroyIcon
        • MessageBox
        • WriteEnvStr
        • DeleteEnvStr
        • GetWallpaper
        • SetWallpaper
        • GetWallpaperOptions
        • SetWallpaperOptions
        • EnableTheming
        • GetCurrentThemeName
      • 区段函数
        • StartRadioButtons
        • RadioButton
        • EndRadioButtons
        • EndRadioButtons2
  • 附录 F：更新记录和发行说明
  • 附录 G：构建 NSIS
    • 常规
    • 在 Windows 上构建
    • 在 POSIX 上构建
    • 每日构建
  • 附录 H：致谢名单
    • 程序员
    • 贡献者
    • 资源制作者
    • 翻译者
    • 文档编写者
  • 附录 I：NSIS 许可协议


NSIS 简介

上一页 | 目录 | 下一页

第一章：NSIS 简介

  • 关于 NSIS
  • 主要特性
  • 特性列表

上一页 | 目录 | 下一页


关于 NSIS

1.1 关于 NSIS

在用户使用你的应用程序之前首先会体验到你的安装程序。慢慢悠悠的或不成功的软件安装是很恼人的问题。一个快速友好的安装程序是展示你的软件产品品质的一部分。

NSIS (Nullsoft Scriptable Install System) 是 Windows 下的一个工具，它允许程序员来创建这样的安装程序。它发布于一个开源的协议并且对于任何使用者来说都是完全免费的。

NSIS 创建的安装程序能够安装、卸载、设置系统设置、解压文件等等。因为它基于脚本文件，你可以完全的控制安装程序的每一部分。脚本语言支持变量、函数、字串操作，就像一个普通的程序语言一样——但是设计来创建安装程序。即使有那么多的特性，NSIS 仍然是最小的安装程序系统。在默认选项下，它仅增加了 34KB 的开销。


主要功能

1.2 主要功能

很小的额外开销

NSIS 具有体积小、速度快和高效率的特点。当其它安装程序动辄需要几百 KB 或好几 MB 的安装程序数据，而一个具有完整功能的 NSIS 安装程序仅占用了 34 KB 的额外开销。

兼容所有主流的 Windows 操作系统

你可以创建兼容于 Windows 95、Windows 98、Windows ME、Windows NT、Windows 2000、Windows XP 和 Windows Server 2003 的安装程序。

独特的压缩方法

你可以在这三种 (ZLib、BZip2、LZMA) 完整的压缩方法中选择其一。新的 LZMA 压缩具有比其它通用压缩方法更好的效果。而且你不需要大块的外壳释放文档模块或其它的应用程序。该压缩方式已经包含在那 34KB 的额外开销里。

基于脚本

不像其它的安装系统仅能基于文件列表和注册表操作来创建安装程序，NSIS 有一个强大的脚本语言。该脚本语言设计来专门制作安装程序并有可以帮助你执行任何安装任务的命令。你可以很容易的添加自定义逻辑和处理不同的升级、版本检测等。在 NSIS Wiki 你可以找到更多。

在一个安装程序里支持多语言

一个安装程序可以支持多语言界面。本身已经包含超过 40 种翻译，但是你也可以创建你自己的语言文件。RTL(从右至左)语言比如阿拉伯语和希伯来语也得到完整的支持。

许多特性和对目标系统的检测

脚本语言提供的命令使你可以在目标系统上使用。从简单的功能比如创建文件夹和注册表编辑到文本、二进制文件修改，修改环境变量和重启系统。使用提供的插件你甚至可以使用 Windows API。

自定义对话和界面

你可以创建自定义的向导页面来获取用户的输入或结合配置选项。NSIS 包含了一个典型界面和新式向导界面，但是你也可以创建自己的界面。

插件系统

NSIS 可以由能和安装程序对话的插件来扩展。他们可以由 C、C++、Delphi 或其他语言并且可以用来执行安装任务或扩展安装程序界面。使用这些插件你只需要一行代码。插件也可以像其它安装数据一样被压缩并且仅在你使用它们的功能的时候被包含进来。

支持网络安装，给文件打补丁

NSIS 的发行包含了一系列插件使你可以从因特网下载文件、连接因特网、对存在的文件打补丁等。

方案综合、不同的发布和自动建立

NSIS 编译器有强大的预处理器。这使你很容易的整合多个方案到单个安装程序或自动的产生安装程序构造。你也可以产生不同的版本比如精简版和完全版。

容易且人性化的易读文件格式

NSIS 脚本格式和用于界面对话的格式是容易的、人性化的且易读的，所以你可以使用你喜欢的编辑器来编辑你的文件。


特性列表

1.3 特性列表

  • 生成包含可执行安装程序的外壳；
  • 支持 ZLIB、BZIP2 和 LZMA 数据压缩 (文件可个别压缩或同时)；
  • 支持卸载 (安装程序可以生成卸载程序)；
  • 可自定义的用户界面 (对话、字体、背景、文本、检测标记、图像等等)；
  • 典型和新式向导界面；
  • 完整的多语言，支持一个安装程序有多个语言。自带超过 35 种语言翻译，但是你也可以建立你自己的；
  • 页面系统：你可以添加标准向导页面或自定义页面；
  • 用户可以选择安装组件，树形组件列表；
  • 多个安装配置 (通常为最小、典型、完全) 和自定义配置；
  • 安装程序自我验证使用 CRC32 校验和；
  • 除了压缩的安装数据大小只需要很小的程序头 (默认为 34KB)；
  • 可以显示文本或 RTF 格式的许可协议；
  • 可以通过注册表检测目标目录；
  • 易用的插件系统 (大多数插件用于创建自定义对话、因特网连接、HTTP 下载、文件打补丁、调用 Win32 API 等等) 已经包含；
  • 安装程序可以达到 2GB 最高限制；
  • 可选性的静默安装模式用于自动安装；
  • 预处理器支持定义符号、宏、条件编辑、标准预定义；
  • 有意思的类似于 PHP 和汇编的编程体验 (包含用户变量、堆栈、流程控制等等)；
  • 安装程序有它们自己的 VM，使你书写的代码可以支持：
    • 文件解压 (可配置的覆盖参数)
    • 文件、目录复制、重命名、删除、搜索
    • 调用插件 DLL
    • DLL/ActiveX 控件注册、解注册
    • 可执行外部程序 (外部执行并带有等待选项)
    • 创建快捷方式
    • 注册表读取、设置、查询、删除
    • INI 文件读取、写入
    • 常规文本文件读取、写入
    • 强大的字串和整数处理
    • 基于类名或标题判断窗口
    • 用户界面操作 (字体、文本设置)
    • 发送 Window 消息
    • 通过消息框或自定义页面与用户交流
    • 分支、比较等等
    • 错误检测
    • 支持重启，包括重启后删除或重命名文件
    • 安装程序行为命令 (比如显示、隐藏、等待等等)
    • 在脚本可以使用用户函数
    • 对用户的动作回调函数
  • 对任何用户完全免费，请看许可协议。
  • 更多


Unicode 的安装程序

1.4 Unicode 的安装程序

从 MakeNSIS V3.0 开始，您便可以选择通过设置 Unicode 属性来创建Unicode的安装程序。这些安装程序不能在Windows95/98/ME下工作，但他们允许你在任何支持 Unicode 语言的系统下显示您的安装程序。

当构建一个 Unicode 的安装程序时，NSIS变量可以保存 Unicode 字符（0000-FFFF）。并且不需要修改现有的脚本。如果你想读/写Unicode文件，具体的说明请查看FileReadUTF16。


指南: 基础

第二章：指南：基础

  • 介绍
  • 脚本文件
  • 脚本结构
    • 安装程序属性
    • 页面
    • 区段
    • 函数
    • 脚本工作方式
    • 脚本的执行
    • 编译器命令
  • 编译器
  • 新式用户界面
  • 插件
  • 更多


介绍

2.1 介绍

你所下载或购买来的软件，大多带有安装程序。安装程序能够复制及/或更新文件、写入注册表键值、写入设置信息。创建快捷方式等等。所有这些操作都将自动为用户完成。用户所要做的仅仅是补充一些必须信息，剩下的则全部由安装程序来完成。用户通过安装向导，作出适当的选择并等待安装的完成。安装完成后，留给用户的任务仅是运行软件。用户不必担心是否忘记了某些操作，因为一切所需的步骤都已由安装程序安排妥当了。

NSIS 是开发者用来创建如此安装程序的工具。NSIS 允许你创建任何事情，从最基本的只需复制文件的安装程序，到含有诸如写注册表主键、设置环境变量、从 Internet 下载最新版本的程序、定制配置文件等大量复杂任务的安装程序。NSIS 具有极高的灵活性，而其脚本语言也易于学习。

NSIS 将所有的文件及安装脚本编译为一个可执行文件，所以你可以轻松的进行发布。NSIS 自身仅添加 34KB 代码到数据中 (在默认设置下)。NSIS 因为其功能强大的脚本语言以及丰富的外部插件支持，在使用最小的消耗的同时拥有了大量的功能选项。


脚本文件

2.2 脚本文件

要创建 NSIS 安装程序，首先要写一个 NSIS 脚本。NSIS 脚本仅仅是一个包含了特殊语法的文本文件，你可以用任何的文本编辑器来编辑。推荐使用可以显示行数的文本编辑器，因为当发生错误时 NSIS 使用行数来指出错误所在。更推荐使用带有语法高亮显示的编辑器，你可以在 NSIS Wiki 下载到。

在 NSIS 脚本里每一行都作为一个命令处理，如果这一行太长的话你可以使用“\”来分隔，编译器会自动地把下一行接到上一行来作为完整的一行，而不是看作新的行。例如：

Messagebox MB_OK|MB_ICONINFORMATION \
"本样例演示了在 NSIS 脚本里如何对长的命令进行断行处理"

如果在字串里需要使用双引号，你应该使用 $\" 来避免误解，或者使用另外的不引起歧义的引号比如 ` 或 '。

关于脚本格式更详细的请看脚本文件格式。

脚本文件的默认扩展名是 .nsi，头文件为 .nsh。头文件可以通过把它划分为一个或多个代码块来帮你编排你的脚本，你也可以在头文件里加入功能函数或宏，并且在多个安装程序里包含头文件，这样可以更容易的升级你的程序，并且使你的脚本很容易的让人看懂。要把一个头文件包含在你的脚本里你可以使用 !include。 这样就可以仅使用名字包含位于 NSIS 目录下的 Include 目录下的头文件。例如：

!include Sections.nsh


脚本结构

2.3 脚本结构

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

2.3.1 安装程序属性

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

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

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

2.3.2 页面

一个非静默安装程序需要向导页面来指导用户运行安装程序，你可以通过 Page 命令 (或更多高级设置如 PageEx)。来设定哪个页面显示。一个典型的设置像这样：

Page license
Page components
Page directory
Page instfiles
UninstPage uninstConfirm
UninstPage instfiles

对于安装程序，典型的页面设置应该显示许可协议页面，允许选择要安装的组件，允许选择要安装的目录，最后安装选择的组件。对于卸载程序，应该显示卸载确认页面，然后执行卸载。

2.3.3 区段

在一个普通的安装包里用户需要安装许多东西。例如在 NSIS 分配安装包里你可以选择安装源码、附加插件、脚本样例或其他。里面的每个组件都有它自己的代码块，当用户选择了安装该组件，那么安装程序就会执行对应的代码。在脚本里，这些代码称为区段。每个可见的区段都可以作为一个组件给用户选择是否安装，在这里我们暂不讨论不可见的区段。你可以只使用一个区段来构建安装包，但是如果你想要使用组件页来让用户选择可选的组件，那你就需要使用多个区段。

卸载程序也可以有多个区段。卸载程序区段名前要加上前缀“un.”。例如：

Section "安装区段"
SectionEnd

Section "un.卸载区段"
SectionEnd

使用在段里的指令和安装程序属性指令不一样，他们在用户电脑运行环境里执行。这些指令可以解压文件读取和写入注册表、INI 文件或普通文件，创建目录，创建快捷方式和更多功能。你可以在指令找到更多。

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

例：

Section "我的程序"
  SetOutPath $INSTDIR
  File "我的程序.exe"
  File "自述.txt"
SectionEnd

关于区段更详细的信息请看区段。

2.3.4 函数

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

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

回调函数可以在某些定义事件之前被调用比如当安装程序开始运行时。回调是可选的。例如你想欢迎用户使用你的安装程序你可以定义一个名为 .onInit 的函数。NSIS 编译器会由它的名字知道它是一个回调函数并且会在安装程序开始时调用它。

Function .onInit
  MessageBox MB_YESNO "即将安装“我的程序”，要继续吗？" IDYES gogogo
    Abort
  gogogo:
FunctionEnd

Abort 在回调函数里有特殊含义。每个回调函数都有它自己的含义，详细情况请查看回调函数。 在上面的例子中 Abort 告诉安装程序停止初始化安装并立即退出。

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

2.3.5 脚本的工作方式

2.3.5.1 逻辑代码结构

条件判断或执行代码循环可以使用 StrCmp、IntCmp、IfErrors、Goto 和其它来实现，但是还有更方便直观的方式来实现。LogicLib 提供了很多简单的宏来做条件或联合逻辑判断，这些语法在附录做了解释，并且这些语法很像其它的初学者和高级用户熟悉的语言。

例如，对变量值的判断应该像这样：

StrCmp $0 '某值' 0 +3
  MessageBox MB_OK '$$0 等于某值'
  Goto done
StrCmp $0 '某其他值' 0 +3
  MessageBox MB_OK '$$0 等于某其他值'
  Goto done
# else
  MessageBox MB_OK '$$0 等于 "$0"'
done:

然而，如果使用 LogicLib 的话代码将更具有可读性并更容易理解，当然也更容易维护。看起来就像下面的代码：

${If} $0 == '某值'
  MessageBox MB_OK '$$0 等于某值'
${ElseIf} $0 == '某其他值'
  MessageBox MB_OK '$$0 等于某其他值'
${Else}
  MessageBox MB_OK '$$0 等于 "$0"'
${EndIf}

也可以用 Switch 来实现相同的效果。像下面的那样：

${Switch} $0
  ${Case} '某值'
    MessageBox MB_OK '$$0 等于某值'
    ${Break}
  ${Case} '某其他值'
    MessageBox MB_OK '$$0 等于某其他值'
    ${Break}
  ${Default}
    MessageBox MB_OK '$$0 等于 "$0"'
    ${Break}
${EndSwitch}

支持多个条件判断。下面的例子当 $0 和 $1 为空的时候通知用户：

${If} $0 == ''
${AndIf} $1 == ''
  MessageBox MB_OK|MB_ICONSTOP '两个都为空！'
${EndIf}

LogicLib 不需要格外的跳转标记，当然也没有了标记同名的冲突，并且当代码改动的时候不再需要每次都修改相对跳转。

LogicLib 也可以使用简单的循环，下面的例子将会从 0 到 5 循环：

StrCpy $R1 0
${While} $R1 < 5
  IntOp $R1 $R1 + 1
  DetailPrint $R1
${EndWhile}

${For} $R1 1 5
  DetailPrint $R1
${Next}

StrCpy $R1 0
${Do}
  IntOp $R1 $R1 + 1
  DetailPrint $R1
${LoopUntil} $R1 >= 5

要使用 LogicLib 必须要包含如下头文件

!include LogicLib.nsh

更多的例子请看 LogicLib.nsi。

2.3.5.2 变量

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

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

Var BLA ;声明变量

Section bla

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

SectionEnd

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

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

在调用函数后，变量包含原来的值。需要注意使用多个变量时的次序 (后进先出)：

Function bla

  Push $R0
  Push $R1

    ...代码...

  Pop $R1
  Pop $R0

FunctionEnd

2.3.5.3 调试脚本

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

2.3.6 脚本的执行

当用户运行安装程序或卸载程序，页面将按照脚本中定义的次序显示。当到了安装页面的时候将执行选中的区段 (组件) 并按照在脚本中定义的次序执行。如果没有显示组件选择页面那么所有的区段都会执行除了在脚本里显式禁止。

除了区段里的代码，还有一些在回调函数里的代码也会被执行，而且可能会在区段之前就执行了。比如 .onInit 回调函数就最先被执行，或者在页面显示过程中执行某些页面回调函数。

2.3.7 编译器命令

编译器命令会在你编译时在你的电脑上执行。他们可以用于条件编辑、包含头文件、运行一个应用程序、改变工作目录和更多。最常见的用法是定义，定义是编译时的常量，你可以定义你的产品版本号并在你的脚本里使用。例如：

!define VERSION "1.0.3"
Name "我的程序 ${VERSION}"
OutFile "我的程序安装 - ${VERSION}.exe"

关于定义更详细的信息请看条件编译。

另一个常见的命令是宏。宏用于在编译时插入代码，依赖于定义并使用定义的值。一个关于宏的例子是升级 DLL，你可以用来升级一个 DLL 文件。宏的命令在编译时会插入。这样你只需要写一个通用的代码并只需要作为小的更改就可以多次的使用。例如：

!macro MyFunc UN
Function ${UN}MyFunc
  Call ${UN}DoRegStuff
  ReadRegStr $0 HKLM Software\我的程序 键名
  DetailPrint $0
FunctionEnd
!macroend
!insertmacro MyFunc ""
!insertmacro MyFunc "un."

宏帮助你避免在安装部分和卸载部分写重复的代码。上面两个 !insertmacro 插入了两个函数，一个是 MyFunc 用于安装部分，另一个是 un.MyFunc 用于卸载部分，但他们做的是同一件事。

更多信息请看编译时命令。


编译器

2.4 编译器

在你制作安装程序时创建了你的脚本后所要做的第二件事就是编译你的脚本。MakeNSIS.exe 就是 NSIS 编译器。它会载入你的脚本，解析并创建你的安装程序。

要编译你需要在你的 .nsi 文件上点右键并选择“Compile NSIS Script”或“Compile NSIS Script (Choose Compressor)”。这样将会使用 MakeNSISw 来引导并调用 MakeNSIS 来编译你的脚本。MakeNSISw 将会给出 MakeNSIS 的输出并在一个可见的窗口里显示出来，你可以复制、测试安装程序、浏览和更多。如果你在右键弹出菜单里没有找到编译 NSI 的选项可能是你在安装 NSIS 时没有选择外壳扩展，你可以从 Windows 命令行里使用 MakeNSIS.exe 或者重新安装 NSIS 并选择安装外壳扩展。

编译器会检查你的脚本并给出警告或错误。如果发生了错误 (例如需要两个参数而你只给了一个) 编译器将会退出并给出一个包含错误行数的错误信息显示。对于非关键性错误编译器将会给出一个警告 (例如在一个脚本里有两个 DirText 命令)。如果你的脚本没有任何错误则编译器将会输出你要发布的安装程序。

NSIS 支持不同的压缩器方案 zlib 和 bzip2。zlib 非常快并且在资源消耗方面非常有效率。bzip2 通常在制作大的安装程序时有可观的效果，但是需要更多的内存并且有一点慢。要设置压缩器请使用 SetCompressor。

你也可以在 Linux、BSD 或 Mac OS X 服务器上面编译安装程序。详细信息请看构建 NSIS。


新式用户界面(Modern UI)

2.5 新式用户界面(Modern UI)

一个流行的 NSIS 用户界面就是新式用户界面，它有着像最近的 Windows 版本一样的界面。新式界面不仅仅是一个自定义的资源文件，它拥有更多的新界面基础。它的特点在于有白色的顶部来描述当前步骤、在组件选择页面有一个描述区域、一个欢迎页面、一个安装结束页面并可允许用户选择运行安装的应用程序或是重新启动电脑及更多功能。

更多的信息，请查看 Modern UI 说明文档和 Modern UI 例子。


插件

2.6 插件

NSIS 支持可从脚本里调用的插件。插件是由一些 C、C++、Delphi 或其它程序语言写的 DLL 文件，可以提供基于 NSIS 的更多增强型代码。

一个插件的调用像这样：

DLL名::函数名 "参数1" "参数2" "参数3"

每一个插件的函数由它的参数有它自己的要求，一些不需要，一些则需要足够的参数。例子：

nsExec::ExecToLog '"${NSISDIR}\makensis.exe" /CMDHELP'
InstallOptions::dialog "$PLUGINSDIR\test.ini"
NSISdl::download http://download.nullsoft.com/winamp/client/winamp291_lite.exe $R0

NSIS 可识别的插件会列表于编译器输出的顶部。NSIS 会在 NSIS 目录下的 Plugins 目录里查找插件并且会列出所有可用的函数。你也可以使用 !addPluginDir 来告诉 NSIS 在另外的目录里查找插件。

NSIS 发布时已经包含了很多的插件。nsDialogs 是一个受欢迎的插件，它允许你建立自定义的页面，并与 NSIS 页面命令结合 (看页面)。开始菜单插件提供了一个可允许用户选择一个开始菜单目录的页面。这里还有许多不同用途的大量插件，查看 Contrib 目录里的帮助文件和例子。你也可以在线查找另外的插件：NSIS Wiki。

你也可以创建你自己的插件。基础的插件编写例子你可以查看 NSIS 安装文件夹的 Examples\Plugin，可以在其中找到 C、C++ 和 Delphi 头文件。包括插件的源代码你也可以在源代码包里找到。


更多

2.7 更多

本手册说明了基本的 NSIS 特点，要得到关于 NSIS 更多的东西，你还要花点时间读完本手册。


命令行的使用

第三章：命令行的使用

  • MakeNSIS 的使用
    • 选项
    • 注意事项
    • 环境变量
    • 例子
  • 安装程序的使用
    • 公共选项
    • 卸载程序特别选项
    • 例子


MakeNSIS 的使用

3.1 MakeNSIS 的使用

NSIS 的安装程序通过使用 'MakeNSIS' 程序来把 (.NSI) 脚本编译成可执行的安装程序。NSIS 开发工具包已经安装在你的电脑里，你只需要简单的在资源管理器的 .nsi 文件上点击鼠标右键，然后选择“编译”。

如果你想在命令行里使用 MakeNSIS，MakeNSIS 命令的语法为：

makensis [选项 | 脚本.nsi | - [...]]

3.1.1 选项

  • /LICENSE 显示一个许可页面。
  • /V 开关及后面跟随的 0 ~ 4 数字设定了输出。0=无输出，1=仅错误，2=警告和错误，3=信息、警告和错误，4=全部输出。
  • /O 开关及后面跟随的记录文件告诉编译器输出记录到记录文件而不是屏幕。
  • /PAUSE 使得 Makensis 在退出前暂停，当直接从 Windows 执行时非常有用。
  • /NOCONFIG 禁止包含 [makensis.exe 路径]\nsisconf.nsh。没有这个参数的话，安装程序默认从 nsisconf.nsi 读取设置。
  • /CMDHELP 输出基本的命令用法信息 (如果指定了命令)，或所有命令 (如果未指定命令)。
  • /HDRINFO 输出 Makensis 编译的选项信息。
  • /NOCD 禁止把当前目录更改到 .nsi 文件。
  • 使用 /D 开关一次或多次将会把符号添加到全局定义列表 (请看 !define)。
  • 使用 /X 开关一次或多次将会执行你随后指定的代码。例如："/XAutoCloseWindow false"。
  • 对脚本名指定一个破折号 (-) 将会通知 Makensis 把标准输入作为源来使用。

3.1.2 注意事项

  • 参数是按照次序来处理的。makensis /Ddef script.nsi 和 makensis script.nsi /Ddef 是不同的。
  • 如果指定了多个脚本，他们将会被连接起来当为一个脚本来处理。

3.1.3 环境变量

makensis 会使用一些跟编译器相关的环境变量以方便创建安装程序的时候使用。这包括：

  • NSISDIR、NSISCONFDIR - 放置 NSIS 数据和配置文件的目录。NSISDIR 用来设置脚本定义的 ${NSISDIR}。更多信息请看 4.2.3 节。
  • APPDATA (Windows 平台) 或 HOME (其它平台) - 个人用户配置文件的目录。

3.1.4 例子

基本用法：

makensis.exe myscript.nsi

安静模式：

makensis.exe /V1 myscript.nsi

强行设置压缩器：

makensis.exe /X"SetCompressor /FINAL lzma" myscript.nsi

改变脚本的行为：

makensis.exe /DUSE_UPX /DVERSION=1.337 /DNO_IMAGES myscript.nsi

参数次序：

makensis /XSection sectioncontents.nsi /XSectionEnd


安装程序的使用

3.2 安装程序的使用

生成的安装程序和卸载程序接受一些命令行的参数。这些参数可以让用户在安装过程中对安装程序作部分控制。

3.2.1 公共选项

  • /NCRC 禁止 CRC 检测，除非在脚本里强制使用了 CRCCheck。
  • /S 静默运行安装程序或卸载程序。更多信息请参看 4.12 章。
  • /D 指定默认的安装目录 ($INSTDIR)，可以越过 InstallDir 和 InstallDirRegKey。这个参数必须是最后一个参数并且不能带任何引号即使路径带有空格。

3.2.2 卸载程序特殊选项

  • _?= 指定 $INSTDIR。这也会阻止卸载程序把它自己复制到临时文件夹再运行。这将可以使用 ExecWait 来运行卸载程序并等待它完成。这个参数必须是最后一个参数并且不能带任何引号即使路径带有空格。

3.2.3 例子

installer.exe /NCRC

installer.exe /S

installer.exe /D=C:\Program Files\NSIS

installer.exe /NCRC /S /D=C:\Program Files\NSIS

uninstaller.exe /S _?=C:\Program Files\NSIS

# 静默卸载旧版本并等待它完成后才继续
ExecWait '"$INSTDIR\uninstaller.exe" /S _?=$INSTDIR'


脚本参考

第四章：脚本参考

  • 脚本文件格式
  • 变量
    • 用户变量
    • 其他可写的变量
    • 常量
    • 在字串里使用常量
  • 标记
  • 相对跳转
  • 页面
    • 次序
    • 页面选项
    • 回调
    • Page
    • UninstPage
    • PageEx
    • PageExEnd
    • PageCallbacks
  • 区段
    • 区段命令
    • 卸载区段
  • 函数
    • 函数命令
    • 回调函数
  • 安装程序属性
    • 常规属性
    • 编译器标记
    • 版本信息
  • 指令用法说明
    • 基本指令
    • 注册表、INI 文件指令
    • 常规用途指令
    • 流程控制指令
    • 文件指令
    • 卸载程序指令
    • 混合指令
    • 字串操作指令
    • 堆栈支持
    • 整数支持
    • 重启指令
    • 安装记录指令
    • 区段管理
    • 用户界面指令
    • 多语言指令
  • 多语言
    • 语言的选择
    • LangDLL 插件
    • RTL 语言
  • 插件 DLL
    • 使用插件命令
    • 禁止插件卸载
    • 手动调用插件
  • 静默安装、卸载


脚本文件格式

4.1 脚本文件格式

一个 NSIS 脚本文件 (.nsi) 就是一个包含了脚本代码的文本文件。

命令

命令行为 命令 [参数] 这样的格式。

File "我的文件"

注释

以 ; 或 # 开始的行为注释。你可以在命令后面添加注释。你也可以使用 C 规范的注释来注释一行或多行。

; 注释
# 注释

/*
注释
注释
*/

Name /* 注释 */ mysetup

File "我的文件" ;注释

如果参数需要由 ; 或 # 开头，你可以用双引号把它括起来。

插件

要调用一个插件，使用“插件::命令 [参数]”。更多的信息请查看插件 DLL。

nsExec::Exec "我的文件"

数字

对于数字参数，使用十进制 (数字) 或十六进制 (以 0x 开头的，比如：0x01235AB)，或八进制 (以 0 开头且无 x)。

颜色被设置为十六进制 RGB 形式，像 HTML 那样但是没有 # 开头。

IntCmp 1 0x1 lbl_equal

SetCtlColors $HWND CCCCCC

字串

要使用一个包含空格的字串，需要用引号括起来:

MessageBox MB_OK "Hi 你好！"

引号仅有的作用就是当他们开始时包含一个参数。他们可以是单引号、双引号或向后的单引号。

你可以使用 $\ 来跳过引号的解析：

MessageBox MB_OK "I'll be happy" ; 把一个 ' 放在字串里
MessageBox MB_OK '并且他对我说："你好"' ; 把一个 " 放在字串里
MessageBox MB_OK `并且他对我说："'我'将会遇到麻烦！"` ; 这里把 ' 和 " 都放到了字串里
MessageBox MB_OK "$\"来自智者的引号$\"，智者说道。" ; 这里演示了跳过引号的解析

要在字串里使用回车、换行、Tab 等，请使用 $\r、$\n、$\t 等。更多信息...

变量

变量以 $ 开头。用户变量应该 (不是必须) 事先被声明并且区分大小写。

Var MYVAR

StrCpy $MYVAR "变量值"

更多信息...

长命令

要把命令扩充为多行，需要在行尾使用反斜杠 (\) ，下一行会被自动连接到上一行的尾部。例如：

CreateShortCut "$SMPROGRAMS\NSIS\ZIP2EXE 工作区.lnk" \
    "$INSTDIR\source\zip2exe\zip2exe.dsw"

MessageBox MB_YESNO|MB_ICONQUESTION \
    "你想删除文件夹中的所有文件吗？\
    (如果你想保留您创建的文件，请点否。)" \
    IDNO NoRemoveLabel

配置文件

如果在 NSIS 的配置目录下存在 nsisconf.nsh，那么它里面的代码默认将会被包含在任何脚本里 (除非你使用了 /NOCONFIG 命令参数)。在 Window 平台下配置目录就是 makensis.exe 所在的目录，其它平台下根据安装时的设置有所不同而默认为 $PREFIX/etc/。你可以在运行时替换它，更多信息请看 3.1.3 节。


变量

4.2 变量

所有的变量都是全局的并且可以用于区段和函数。需要注意的是，在默认情况下变量被限制在 1024 字节。要扩大这个限制你需要重新构建一个使用了更大 NSIS_MAX_STRLEN 值的 NSIS 或使用特别版本。

4.2.1 用户变量

$变量名

用户变量可以用 Var 命令来声明。你可以用这些变量来保存值，用于字串操作等等。

4.2.1.1 Var

[/GLOBAL] 变量名

声明一个用户变量。变量名允许的字符：[a-z][A-Z][0-9] 和 '_'。所有定义的变量都是全局的，即使在区段或函数内定义。要使它表达更清楚一些，区段或函数内定义的变量必须使用 /GLOBAL 标记。在区段和函数之外不需要 /GLOBAL 标记。

Var example

Function testVar
  Var /GLOBAL example2

  StrCpy $example "example value"
  StrCpy $example2 "another example value"
FunctionEnd

4.2.2 其他已注册的变量

$0、$1、$2、$3、$4、$5、$6、$7、$8、$9、$R0、$R1、$R2、$R3、$R4、$R5、$R6、$R7、$R8、$R9

这些变量可以像用户变量一样使用，但常用于公用函数或宏。你不需要声明这些变量，所以当你在公用代码里使用他们的时候不能有任何名字冲突。当在公用代码里使用的时候，推荐你使用堆栈保存和恢复他们原来的数据。这些变量也可以在插件里传递，因为他们可以被 DLL 插件读取和写入。

$INSTDIR

安装目录 ($INSTDIR 可以使用 StrCpy、ReadRegStr、ReadINIStr 等等来更改。例如在 .onInit 函数里可以用来做高级的检测安装定位)。

注意在卸载程序代码里，$INSTDIR 为卸载程序所在的目录而不是在安装程序里所指定的目录。例如，你把卸载程序放在 $WINDIR 里并且用户没有移动它，那么在卸载程序里 $INSTDIR 就等于 $WINDIR。如果你要把卸载程序放到到另外的位置，那么你应该先把安装程序的 $INSTDIR 值写入注册表或其它容易保存的地方，然后在卸载程序里读取该值并赋值给卸载程序里的 $INSTDIR。

$OUTDIR

当前输出路径 (通过 SetOutPath 设定或通过 StrCpy、ReadRegStr、ReadINIStr 等等)

$CMDLINE

安装程序的命令行输入。命令行的格式如下面之一所示：

  • "完整路径\安装程序.exe" 参数 参数 参数
  • 安装程序.exe 参数 参数 参数
  • 对于解析“参数”部分，参阅常用函数附录的 GetParameters。如果在命令行里指定了 /D= (用来跳过安装路径的选择)，那么 /D= 后面的参数将不会被保存在 $CMDLINE (前面的可以保存)。

$LANGUAGE

当前使用的语言标识符。例如，英语是 1033。你可以在 .onInit 里更改。

4.2.3 常量

常量通常用在 InstallDir 属性里。

需要注意的是一些新的常量并不是在所有的 OS 上都是正常的。例如 $CDBURN_AREA 仅在 Windows XP 及以上系统中才正常。如果在 Windows 98 中使用将会得到空值。除非特别提示，否则该常量都是在所有 OS 上有效的。

$PROGRAMFILES

程序文件目录 (通常为 C:\Program Files，但是运行时会检测)。

$COMMONFILES

公用文件目录。这是应用程序共享组件的目录 (通常为 C:\Program Files\Common Files，但是运行时会检测)。

$DESKTOP

Windows 桌面目录 (通常为 C:\Users\Administrator\Desktop 或 C:\Documents and Settings\Administrator\桌面，但是运行时会检测)。该常量的内容 (所有用户或当前用户) 取决于 SetShellVarContext 设置。默认为当前用户。

$EXEDIR

安装程序运行时的位置。(从技术上来说你可以修改该变量，但并不是一个好想法)。

$EXEFILE

安装程序可执行文件的文件名。

$EXEPATH

安装程序可执行文件完整路径。

${NSISDIR}

包含 NSIS 安装目录的符号定义标记。常用于在你想调用在 NSIS 目录下的资源时，例如：图标、界面……

在 Window 平台等于 makensis 所在的目录而在其它平台则在编译时决定 (信息请看 INSTALL 文件)。你可以在编译前通过修改 NSISDIR 环境变量来改变默认的设置。更多信息请看 3.1.3 节。

$WINDIR

Windows 目录 (通常为 C:\WINDOWS 或 C:\WINNT，但在运行时会检测)

$SYSDIR

Windows 系统目录 (通常为 C:\WINDOWS\system 或 C:\WINNT\system32，但在运行时会检测)

$TEMP

系统临时目录 (通常为 C:\Documents and Settings\Administrator\Local Settings\Temp，但在运行时会检测)

$STARTMENU

开始菜单目录 (常用于添加一个开始菜单项，使用 CreateShortCut)。该常量的内容 (所有用户或当前用户) 取决于 SetShellVarContext 设置。默认为当前用户。

$SMPROGRAMS

开始菜单程序目录 (当你想定位“$STARTMENU\程序”时可以使用它)。该常量的内容 (所有用户或当前用户) 取决于 SetShellVarContext 设置。默认为当前用户。

$SMSTARTUP

开始菜单程序/启动 目录。该常量的内容 (所有用户或当前用户) 取决于 SetShellVarContext 设置。默认为当前用户。

$QUICKLAUNCH

在 IE4 活动桌面及以上的快速启动目录。如果快速启动不可用，仅仅返回和 $TEMP 一样。

$DOCUMENTS

文档目录。一个当前用户典型的路径形如 C:\Documents and Settings\Administrator\My Documents。这个常量的内容 (所有用户或当前用户) 取决于 SetShellVarContext 设置。默认为当前用户。

该常量在 Windows 95 且 Internet Explorer 4 没有安装时无效。

$SENDTO

该目录包含了“发送到”菜单快捷项。

$RECENT

该目录包含了指向用户最近文档的快捷方式。

$FAVORITES

该目录包含了指向用户网络收藏夹、文档等的快捷方式。这个常量的内容 (所有用户或当前用户) 取决于 SetShellVarContext 设置。默认为当前用户。

该常量在 Windows 95 且 Internet Explorer 4 没有安装时无效。

$MUSIC

用户的音乐文件目录。这个常量的内容 (所有用户或当前用户) 取决于 SetShellVarContext 设置。默认为当前用户。

该常量仅在 Windows XP、ME 及以上才有效。

$PICTURES

用户的图片目录。这个常量的内容 (所有用户或当前用户) 取决于 SetShellVarContext 设置。默认为当前用户。

该常量仅在 Windows 2000、XP、ME 及以上才有效。

$VIDEOS

用户的视频文件目录。这个常量的内容 (所有用户或当前用户) 取决于 SetShellVarContext 设置。默认为当前用户。

该常量仅在 Windows XP、ME 及以上才有效。

$NETHOOD

该目录包含了可能存在于我的网络位置、网上邻居文件夹的链接对象。

该常量在 Windows 95 且 Internet Explorer 4 和活动桌面没有安装时无效。

$FONTS

系统字体目录。

$TEMPLATES

文档模板目录。这个常量的内容 (所有用户或当前用户) 取决于 SetShellVarContext 设置。默认为当前用户。

$APPDATA

应用程序数据目录。当前用户路径的检测需要 Internet Explorer 4 及以上。所有用户路径的检测需要 Internet Explorer 5 及以上。这个常量的内容 (所有用户或当前用户) 取决于 SetShellVarContext 设置。默认为当前用户。

该常量在 Windows 95 且 Internet Explorer 4 和活动桌面没有安装时无效。

$LOCALAPPDATA

本机应用程序数据目录。

该常量仅在 Windows 2000 或以上系统有效。

$PRINTHOOD

该目录包含了可能存在于打印机文件夹的链接对象。

该常量在 Windows 95 和 Windows 98 上无效。

$INTERNET_CACHE

Internet Explorer 的临时文件目录。

该常量在 Windows 95 和 Windows NT 且 Internet Explorer 4 和活动桌面没有安装时无效。

$COOKIES

Internet Explorer 的 Cookies 目录。

该常量在 Windows 95 和 Windows NT 且 Internet Explorer 4 和活动桌面没有安装时无效。

$HISTORY

Internet Explorer 的历史记录目录。

该常量在 Windows 95 和 Windows NT 且 Internet Explorer 4 和活动桌面没有安装时无效。

$PROFILE

用户的个人配置目录。一个典型的路径如 C:\Documents and Settings\Administrator。

该常量在 Windows 2000 及以上有效。

$ADMINTOOLS

一个保存管理工具的目录。这个常量的内容 (所有用户或当前用户) 取决于 SetShellVarContext 设置。默认为当前用户。

该常量在 Windows 2000、ME 及以上有效。

$RESOURCES

该资源目录保存了主题和其他 Windows 资源 (通常为 C:\Windows\Resources，但在运行时会检测)。

该常量在 Windows XP 及以上有效。

$RESOURCES_LOCALIZED

该本地的资源目录保存了主题和其他 Windows 资源 (通常为 C:\Windows\Resources\1033，但在运行时会检测)。

该常量在 Windows XP 及以上有效。

$CDBURN_AREA

一个在烧录 CD 时储存文件的目录。

该常量在 Windows XP 及以上有效。

$HWNDPARENT

父窗口的十进制窗口句柄。

$PLUGINSDIR

该路径是一个临时目录，当第一次使用一个插件或一个调用 InitPluginsDir 时被创建。该文件夹当安装程序退出时会被自动删除。这个文件夹的用意是用来保存给 InstallOptions 使用的 INI 文件、启动画面位图或其他插件运行需要的文件。

4.2.4 在字串里使用常量

$$

转义，用来表示 $。

$\r

用来表示一个回车 (\r)。

$\n

用来表示新的一行 (\n)。

$\t

用来表示一个制表符 (\t)。


标记

4.3 标记

标记是 Goto 指令的目标，或各种分支指令 (比如 IfErrors、MessageBox、IfFileExists 和 StrCmp) 的目标。标记必须存在于一个区段或函数里。标记是局限于该范围里的，这意味着这些指令只能访问和它们同处于一个区段或函数的标记。要声明一个标记很简单：

MyLabel:

标记不能以 -、+、!、$ 或 0-9 开头。当给多个需要指定标记的指令指定了标记，不要忘了使用空字串 ("") 或 0 来表示下一个指令 (表示无 Goto 跳转)。一个标记以句点 (.) 开头时表示这是一个全局的标记，你可以从任何区段或函数直接跳转到它上面 (但是你不能从一个安装程序跳转到一个卸载程序的全局标记，反之亦然)。


相对跳转

4.4 相对跳转

和标记不一样，相对跳转就如其名一样，相对于被调用的地方。在任何你可用到标记的地方你也都可以相对跳转。相对跳转由数字标定。+1 跳转到下一条指令 (默认的步进)，+2 会跳过一条指令也并且从当前指令转到第二条指令，-2 将往后跳两条指令，+10 将会跳过 9 条指令，从当前指令跳到第十条指令。

一条指令就是在安装程序运行时可以被执行的所有命令。MessageBox、Goto、GetDLLVersion、FileRead、SetShellVarContext 都是指令。AddSize、Section、SectionGroup、SectionEnd、SetOverwrite (和所有处于编译器标记)、Name、SetFont、LangString 都不是指令，因为它们在编译时就被执行。

例子:

 Goto +2
   MessageBox MB_OK "你将看不到这个信息框"
 MessageBox MB_OK "上一条信息被略过，这条信息才会被显示"

 Goto +4
 MessageBox MB_OK "随后的这条信息将会被略过"
 Goto +3
 MessageBox MB_OK "你将不会看到这个信息框"
 Goto -3
 MessageBox MB_OK "完成"

需要注意的是宏指令并不是真正意义上的一条指令，在编译时会被展开为若干条指令，所以你不能用相对跳转来跳过一条宏指令。下面的示例演示了相对跳转并没有真正跳过插入的宏 (仅仅是跳过了宏里的第一条指令)，还是会显示一个消息框。

!macro relative_jump_test
  MessageBox MB_OK "第一条宏语句"
  MessageBox MB_OK "第二条宏语句"
!macroend

Goto +2
!insertmacro relative_jump_test


页面

4.5 页面

每个 (非静默安装) NSIS 安装程序都有一个页面设置。每个页面可以是一个 NSIS 内建页面或者一个由用户函数 (看 InstallOptions 例子) 创建的自定义页面。

使用这些脚本你可以控制这些页面的次序、外观、作用。你可以略过页面、颜色绘为白色、强制用户停留在某个页面直到特定条件成立、显示一个说明文档页面、给输入显示一个自定义页面或者更多的功能。在这部分你将学到如何控制上面提到的功能。

关于页面有两个基本的命令，Page 和 UninstPage。前一个为添加一个页面到安装程序，后一个为添加一个页面到卸载程序。在他们两个命令的前面你可以用 PageEx 命令给他们添加一个页面且包括一些选项。PageEx 可以使你给添加的指定页面设置选项而不是使用 PageEx 之外设置的默认设置。

4.5.1 次序

页面的次序由 Page、UninstPage 和 PageEx 出现在脚本里的次序决定。例如：

 Page license
 Page components
 Page directory
 Page instfiles
 UninstPage uninstConfirm
 UninstPage instfiles

该代码告诉 NSIS 第一个显示的是许可页面，然后是组件选择页面，然后是目录选择页面，最后是区段被执行的安装记录页面，就像老式的安装程序那样。卸载程序将首先显示卸载确认页面然后是卸载执行记录。

你可以把同一个页面类型多次指定。

由于需要向后兼容老的 NSIS 脚本，如果没有使用到安装程序页面命令，那么随后的这些安装程序页面将会被添加：许可 (如果指定了 LicenseText 和 LicenseData)、组件选择 (如果指定了 ComponentText 并且有一个以上非隐藏的区段)、目录选择 (如果指定了 DirText) 和安装记录。当没有使用到卸载程序页面命令，那么随后的卸载程序页面将会被添加：卸载确认页面 (如果指定了 UninstallText) 和卸载记录。不过这个方法是不赞成的，强烈推荐的是把脚本转换为使用页面命令，因为你可以使用新的标准语言字串。

4.5.2 页面选项

每个页面都有它自己唯一的数据设置来定义外观和作用。这一段叙述了每种页面使用的数据和怎么样来设置。回调函数将在下一部分说明而不在本段处理。

下面的这个列表列出了某个页面类型受什么样的命令影响。除非特别提及，否则这些命令都可以在 PageEx 区块内外使用。如果在一个 PageEx 区块内部使用那么他们仅仅对由 PageEx 设置的当前页面产生影响，否则他们将被设为其他所有页面的默认值。

许可页面

  • LicenseText
  • LicenseData
  • LicenseForceSelection

组件选择页面

  • ComponentText

目录选择页面

  • DirText
  • DirVar - 仅能在 PageEx 里使用
  • DirVerify

卸载、安装记录页面

  • DetailsButtonText
  • CompletedText

卸载确认页面

  • DirVar - 仅能在 PageEx 里使用
  • UninstallText

要设置页面标题请使用 Caption。

4.5.3 回调

每个内建的页面都有三个回调函数。一个预置函数、一个显示创建函数和一个离开函数。预置函数在页面被创建之前被直接的调用，显示函数在页面被创建后且在显示之前被直接调用，离开函数在用户按下下一页按钮之后并且在页面离开之前被直接调用。

  • 预置函数允许你使用 Abort 来跳过该页面。
  • 显示函数允许你使用 CreateFont、SetCtlColors、SendMessage 和其他来调整页面的用户界面。
  • 离开函数允许你使用 Abort 来强制用户停留在当前页面。

一个自定义的页面仅有两个回调函数，一个是必须的创建页面，另一个离开函数的作用就和内建页面的离开函数一样。

举例：

 Page license skipLicense "" stayInLicense
 Page custom customPage "" "：自定义页面"
 Page instfiles

 Function skipLicense
   MessageBox MB_YESNO "你想略过许可页面吗？" IDNO no
     Abort
   no:
 FunctionEnd

 Function stayInLicense
   MessageBox MB_YESNO "你想停留在许可页面吗？" 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 错误：$\r$\n$R1"
   done:
 FunctionEnd

4.5.4 Page

custom [创建函数] [离开函数] [标题] [/ENABLECANCEL]
  或
内置的页面类型 [预置函数] [显示函数] [离开函数] [/ENABLECANCEL]

要添加一个安装程序页面，请看上面关于相对于自定义页面的内建页面和关于回调函数的段。

内置的页面类型：

  • license - 许可协议页面
  • components - 组件选择页面
  • directory - 安装目录选择页面
  • instfiles - 安装执行页面
  • uninstConfirm - 卸载确认页面

最后一个页面的取消按钮会被禁用来防止混乱。要允许这种行为请使用 /ENABLECANCEL。

4.5.5 UninstPage

custom [创建函数] [离开函数] [标题] [/ENABLECANCEL]
  或
内置的页面类型 [预置函数] [显示函数] [离开函数] [/ENABLECANCEL]

要添加一个卸载程序页面，请看上面关于相对于自定义页面的内建页面和关于回调函数的段。

内置的页面类型请参考 Page。

4.5.6 PageEx

[un.](custom|uninstConfirm|license|components|directory|instfiles)

添加一个安装程序页面或一个卸载程序页面 (如果使用了 un. 前缀)。每一个 PageEx 必须和 PageExEnd 配合使用。在一个 PageEx 区块你可以对这个页面进行特殊的设置，这些设置不会被其他页面使用。没有被设置的选项将使用 PageEx 外部区块的的设置或者当什么都没有指定时使用默认设置。要对页面设置子标题使用 Caption 或 SubCaption。要对一个使用 PageEx 的页面设置回调函数请使用 PageCallbacks。请看上面关于相对于自定义页面的内建页面的段。

使用举例：

 PageEx license
   LicenseText "说明"
   LicenseData readme.rtf
 PageExEnd

 PageEx license
   LicenseData license.txt
   LicenseForceSelection checkbox
 PageExEnd

4.5.7 PageExEnd

结束一个 PageEx 区块。

4.5.8 PageCallbacks

([创建函数] [离开函数]) | ([预置函数] [显示函数] [离开函数])

对一个使用 PageEx 定义的页面设置回调函数，仅能在 PageEx 区块里使用。请看上面关于回调函数的段。

PageEx license
  PageCallbacks licensePre licenseShow licenseLeave
PageExEnd


区段

4.6 区段

每一个 NSIS 安装程序包含一个或多个区段。所有的这些区段都使用下面的这些命令来创建、修改和结束。

  • 每一个区段包含零个或多个指令。
  • 区段是安装程序执行的实体，并且如果设置了 ComponentText，那么用户就可以选择禁止或允许每一个可见的区段。
  • 如果一个区段名为 “Uninstall” 或以“un.”为前缀，那么它就是一个卸载程序区段。

4.6.1 区段命令

4.6.1.1 AddSize

大小_KB

告诉安装程序当前的区段需要一个额外的 “大小_KB” KB 磁盘空间。仅在一个区段里有效 (在区段外或函数里无效)。

Section
AddSize 500
SectionEnd

4.6.1.2 Section

[/o] [([!]|[-])区段名] [区段索引输出]

开始并且打开一个新的区段。如果区段名为空、遗漏或者以一个 - 开头，那么它将是一个隐藏的区段，用户也不能选择禁止它。如果一个区段名为“Uninstall”或以“un.”为前缀，那么它就是一个卸载程序区段。如果指定了区段索引输出，该参数将被定义 (!defined) 为区段索引 (然后可以对它使用 SectionSetText 等)。如果区段名以一个 ! 开头，那么该区段的显示名称将以粗体字显示。如果指定了 /o 开关，则该区段默认为不选。

Section "-隐藏区段"
SectionEnd

Section # 隐藏区段
SectionEnd

Section "!描黑区段"
SectionEnd

Section /o "可选区段"
SectionEnd

Section "某些安装" SEC_IDX
SectionEnd

4.6.1.3 SectionEnd

该命令关闭当前打开的区段。

4.6.1.4 SectionIn

安装类型索引 [安装类型索引] [RO]

该命令指定当前区段默认为哪一种安装类型 (详细信息看 InstType) 允许的状态入口。可以指定多个 SectionIn 命令 (它们会被组合起来)。如果指定 RO 作为一个参数，则该区段将被设为只读区段，意味着用户不能去改变它的状态。

InstType "完全"
InstType "最小化"

Section "区段 1"
SectionIn 1 2
SectionEnd

Section "区段 2"
SectionIn 1
SectionEnd

4.6.1.5 SectionGroup

[/e] 区段组名 [区段组名索引输出]

该命令插入一个区段组。区段组必须以 SectionGroupEnd 来关闭，并且可以包含一个或多个区段。如果区段组名称以一个 ! 开头，则区段组名称以粗体字显示。如果指定了 /e，该区段组的所有区段默认将被展开。如果指定区段组索引输出，该参数将被定义 (!defined) 为区段索引 (然后可以对它使用 SectionSetText 等)。如果名字以“un.”为前缀，则该区段组为卸载程序区段组。

SectionGroup "区段组"
Section "区段 1"
SectionEnd
Section "区段 2"
SectionEnd
SectionGroupEnd

4.6.1.6 SectionGroupEnd

关闭一个以 SectionGroup 打开的区段组。

4.6.2 卸载区段

一个特别的名为 “Uninstall” 的区段只能是被创建用于产生一个卸载程序。该区段应该用来从系统里移除由安装程序安装的所有文件、注册表健等等。这里有一个简单的卸载区段例子：

Section "Uninstall"
  Delete $INSTDIR\Uninst.exe ; 删除自己 (看下面的解释为什么可以这样)
  Delete $INSTDIR\myApp.exe
  RMDir $INSTDIR
  DeleteRegKey HKLM SOFTWARE\myApp
SectionEnd

第一个 Delete 指令是可以正常执行的 (删除卸载程序本身)，因为执行卸载程序的时候它会复制一个副本到系统临时目录并执行副本来完成卸载。

需要注意的是在卸载程序的代码里，$INSTDIR 包含了卸载程序所在的位置。你不需要在安装程序里给该变量重复赋值。


函数

4.7 函数

函数类似于区段因为他们可以包含零个或多个指令。用户函数不会被安装程序直接调用，而必须在区段里使用 Call 指令来调用。而当一个必然事件发生时回调函数将由安装程序调用。

函数必须在区段或其他函数之外声明。

4.7.1 函数命令

4.7.1.1 Function

[函数名]

开始并打开一个新的函数。常规函数名以 . 开头的 (例如 ".Whatever") 作为回调函数保留。函数名以 un. 开头的函数将会被创建在卸载程序里。因此，普通安装区段和函数不能调用卸载函数，而卸载区段和卸载函数也不能调用普通安装程序的函数。

Function func
  # 一些命令
FunctionEnd

Section
  Call func
SectionEnd

4.7.1.2 FunctionEnd

该命令关闭当前打开的函数。

4.7.2 回调函数

你可以创建特殊名称的回调函数。这些函数将会由安装程序在安装时需要某些用途时调用。下面是当前可用的回调函数列表：

4.7.2.1 安装回调

4.7.2.1.1 .onGUIInit

该回调将会在第一个页面被载入并且显示安装程序对话框前被调用，允许你来调整用户界面。

例子：

 !include "WinMessages.nsh"

 Function .onGUIInit
   # 1028 是标志文本控件的 ID
   GetDlgItem $R0 $HWNDPARENT 1028
   CreateFont $R1 "Tahoma" 10 700
   SendMessage $R0 ${WM_SETFONT} $R1 0
   # 设置背景颜色为白色，文本颜色为红色
   SetCtlColors $R0 FFFFFF FF0000
 FunctionEnd
4.7.2.1.2 .onInit

该回调将会在当安装程序接近完成初始化时调用。如果 .onInit 函数调用了 Abort，则安装程序立即退出。

这里有两个例子说明了怎么使用：

 Function .onInit
   MessageBox MB_YESNO "即将安装。继续？" IDYES NoAbort
     Abort ; 使得安装程序退出。
   NoAbort:
 FunctionEnd

或：

 Function .onInit
   ReadINIStr $INSTDIR $WINDIR\wincmd.ini Configuration InstallDir
   StrCmp $INSTDIR "" 0 NoAbort
     MessageBox MB_OK "未找到 Windows Commander，未能取得安装路径。"
     Abort ; 使得安装程序退出。
   NoAbort:
 FunctionEnd
4.7.2.1.3 .onInstFailed

该回调函数当在安装失败后用户点击“取消”按钮时被调用 (如果安装程序不能释放任何文件，或安装脚本使用了 Abort 命令)。

例子：

  Function .onInstFailed
    MessageBox MB_OK "祝您下次好运。"
  FunctionEnd
4.7.2.1.4 .onInstSuccess

该回调当安装成功且正当安装窗口关闭前 (如果 AutoCloseWindow 或 SetAutoClose 被设为 false 时可能在用户点击“关闭”之后) 调用。

例子：

  Function .onInstSuccess
    MessageBox MB_YESNO "恭喜，运行正常。查看说明文档？" IDNO NoReadme
      Exec notepad.exe ; 查看说明文档或其他。
    NoReadme:
  FunctionEnd
4.7.2.1.5 .onGUIEnd

该回调正当安装程序窗口关闭之后被调用。需要时用来释放任何与用户界面有关的插件。

4.7.2.1.6 .onMouseOverSection

该回调只要鼠标在树形区段选择框上移动时就被调用。这可以使你给每个区段设置一个样本描述。鼠标停留所在的当前区段 ID 已被临时的保存，为 $0。

例子：

  Function .onMouseOverSection
    FindWindow $R0 "#32770" "" $HWNDPARENT
    GetDlgItem $R0 $R0 1043 ; 描述项 (必须添加到界面)

    StrCmp $0 0 "" +2
      SendMessage $R0 ${WM_SETTEXT} 0 "STR:第一个区段描述"

    StrCmp $0 1 "" +2
      SendMessage $R0 ${WM_SETTEXT} 0 "STR:第二个区段描述"
  FunctionEnd
4.7.2.1.7 .onRebootFailed

该回调函数当 Reboot 指令失败时被调用。WriteUninstaller、plug-ins、File 和 WriteRegBin 不能用于该回调函数。

例子：

 Function .onRebootFailed
   MessageBox MB_OK|MB_ICONSTOP "重启失败，请手动重启。" /SD IDOK
 FunctionEnd
4.7.2.1.8 .onSelChange

当在组件选择页面选项被改变时被调用。常用于使用 SectionSetFlags 和 SectionGetFlags。

4.7.2.1.9 .onUserAbort

该回调当用户点击“取消”按钮且安装尚未失败时被调用。如果该函数调用 Abort，则安装将不退出。

例子：

 Function .onUserAbort
   MessageBox MB_YESNO "退出安装？" IDYES NoCancelAbort
     Abort ; 使得安装程序不退出。
   NoCancelAbort:
 FunctionEnd
4.7.2.1.10 .onVerifyInstDir

该回调对于你的安装程序来说可以允许代为控制安装路径是否有效。每次用户更改安装路径的时候这段代码都会被调用一次，所以不要在这里使用 MessageBox 等傻指令。如果该函数调用 Abort，则 $INSTDIR 的路径被认为无效。

例子：

  Function .onVerifyInstDir
    IfFileExists $INSTDIR\Winamp.exe PathGood
      Abort ; 如果 $INSTDIR 不是 Winamp 路径，则不让用户安装在这里
    PathGood:
  FunctionEnd

4.7.2.2 卸载回调

4.7.2.2.1 un.onGUIInit

该回调将会在第一个页面被载入并且显示卸载程序对话框前被调用，允许你来调整卸载程序的界面。

例子请看 .onGUIInit。

4.7.2.2.2 un.onInit

该回调将会在当卸载程序接近完成初始化时调用。如果 un.onInit 函数使用了 Abort ，则卸载程序立即退出。注意如果需要时该函数可以验证和/或修改 $INSTDIR。

这里有两个例子说明了怎么使用：

  Function un.onInit
    MessageBox MB_YESNO "即将卸载。继续？" IDYES NoAbort
      Abort ; 使得卸载程序退出。
    NoAbort:
  FunctionEnd

或：

  Function un.onInit
    IfFileExists $INSTDIR\myfile.exe found
      Messagebox MB_OK "卸载路径不正确"
      Abort
    found:
  FunctionEnd
4.7.2.2.3 un.onUninstFailed

该回调函数当在卸载失败后用户点击“取消”按钮时被调用 (如果使用了 Abort 命令或其它失败的命令)。

例子：

  Function un.onUninstFailed
    MessageBox MB_OK "祝你下次好运。"
  FunctionEnd
4.7.2.2.4 un.onUninstSuccess

该回调当卸载成功且正当卸载程序窗口关闭前 (如果 SetAutoClose 被设为 false 时可能在用户点击“关闭”之后) 调用。

例子：

  Function un.onUninstSuccess
    MessageBox MB_OK "恭喜，已经移除。"
  FunctionEnd
4.7.2.2.5 un.onGUIEnd

该回调正当卸载程序窗口关闭之后被调用。需要时用来释放任何与用户界面有关的插件。

4.7.2.2.6 un.onRebootFailed

该回调函数当 Reboot 指令失败时被调用。WriteUninstaller、plug-ins、File 和 WriteRegBin 不能用于该回调函数。

例子：

 Function un.onRebootFailed
   MessageBox MB_OK|MB_ICONSTOP "重启失败，请手动重启。" /SD IDOK
 FunctionEnd
4.7.2.2.7 un.onUserAbort

该回调当用户点击“取消”按钮且卸载尚未失败时被调用。如果该函数调用 Abort，则卸载程序将不退出。

例子：

  Function un.onUserAbort
    MessageBox MB_YESNO "退出卸载？" IDYES NoCancelAbort
      Abort ; 使得卸载程序不能退出。
    NoCancelAbort:
  FunctionEnd


安装程序属性

4.8 安装程序属性

4.8.1 常规属性

下面的所有命令都是调整安装程序属性的。这些属性控制安装程序的外观和函数、包括哪个页面出现在安装程序里、在每个页面的每个部分显示什么文本、安装程序的名称、使用什么样的图标、默认安装目录、取消什么样的文件还有更多。注意这些属性可以在除了区段和函数以外的任何地方设置。

描黑并加下划线的为默认值

4.8.1.1 AddBrandingImage

(left|right|top|bottom) (宽|高) [填充]

在安装程序顶部、底部、左边、右边添加一个标志图像。它的大小将由指定的宽/高、安装程序的宽/高和安装程序字体确定。最终的大小不一定就是你需要的，请看输出命令来得到实际大小。因为这取决于安装程序字体，所以你应该在 AddBrandingImage 前使用 SetFont。默认的填充值为 2。

AddBrandingImage left 100
AddBrandingImage right 50
AddBrandingImage top 20
AddBrandingImage bottom 35
AddBrandingImage left 100 5

4.8.1.2 AllowRootDirInstall

true|false

控制是否允许安装在驱动器根目录，或者共享网络。把它设为 true 可以改变这个安全行为，此安全行为可以防止用户选择 C:\ 或 \\Server\Share 来作为安装 (或卸载) 目录。对于另外的可定制的目录选择页面，请看 .onVerifyInstDir。

4.8.1.3 AutoCloseWindow

true|false

设置当安装完成的时候窗口是否自动关闭。该属性可以不理会一个使用了 SetAutoClose 的区段。

4.8.1.4 BGFont

[字体名称 [字体高度 [字体宽度] [/ITALIC] [/UNDERLINE] [/STRIKE]]]

指定用于背景渐变显示文本的字体。要设置颜色请使用 BGGradient。如果没有指定参数，则使用默认的字体。默认字体为粗斜体的 Times New Roman。

4.8.1.5 BGGradient

[off|(顶部颜色 底部颜色 [文本颜色|notext])]

指定是否使用一个渐变的背景窗口。如果为 off，安装程序将不显示背景窗口，如果无指定参数，则使用默认的黑蓝渐变，或者指定顶部颜色或底部颜色来得到一个渐变的背景。顶部颜色和底部颜色使用 RRGGBB 格式 (十六进制，就像 HTML 那样，但略去了 #，因为 # 用于注释)。你也可以指定“文本颜色”，该颜色会显示 Name 所指定的名称在左上角，或者你不需要文本时使用 notext 来关闭文本显示。

4.8.1.6 BrandingText

/TRIM(LEFT|RIGHT|CENTER) 文本

设置显示在安装程序窗口底部的文本 (默认为“Nullsoft Install System vX.XX”)。如果设为空字串 ("") 则使用默认值；设为 " " (一个空格) 则显示空白。如果你不知道哪个适合你，那就保留默认值吧，这样可以使每个人知道你使用的 NSIS 版本。使用 /TRIMLEFT、/TRIMRIGHT 或 /TRIMCENTER 来裁剪控制大小到字串大小。

接受变量。如果使用了变量，使用的变量应该在 .onInit 被初始化。

4.8.1.7 Caption

标题

当使用一个外部的 PageEx 区块：设置安装程序标题条文本。当使用了 Name 指令指定了名称时默认为“$(^Name) 安装”。你可以把它替换为“我的安装程序”或其他。如果你指定为空字串 ("")，则使用默认值 (你也可以指定为 " " 来使用一个空白字串)。

当使用一个内部的 PageEx 区块：设置当前页面的子标题。

接受变量。如果使用了变量，使用的变量应该在 .onInit 被初始化。

4.8.1.8 ChangeUI

对话框 ui_file.exe

使用 ui_file.exe 里相同资源 ID 的一个对话框替换对话框 (IDD_LICENSE、IDD_DIR、IDD_SELCOM、IDD_INST、IDD_INSTFILES、IDD_UNINST 或 IDD_VERIFY)。你也可以指定 all 作为一个对话框，当你想从同一个 UI 文件里一次载入替换全部 7 个对话框时。一些 UI 的例子请看位于 NSIS 目录下的 Contrib\UIs。

  • IDD_LICENSE 必须包含 IDC_EDIT1 (RICHEDIT 控件)。
  • IDD_DIR 必须包含 IDC_DIR (编辑框)、IDC_BROWSE (按钮) 和 IDC_CHECK1 (选择框)。
  • IDD_SELCOM 必须包含 IDC_TREE1 (SysTreeView32 控件)、和 IDC_COMBO1 (组合框)。
  • IDD_INST 必须包含 IDC_BACK (按钮)、IDC_CHILDRECT (静态控制其他所有对话大小)、IDC_VERSTR (静态文本框)、IDOK (按钮) 和 IDCANCEL (按钮)。如果该对话框有一个图像控件 (静态 SS_BITMAP 样式)，那么它将被用于 SetBrandingImage 作为默认值。
  • IDD_INSTFILES 必须包含 IDC_LIST1 (SysListView32 控件)、IDC_PROGRESS (msctls_progress32 控件) 和 IDC_SHOWDETAILS (按钮)。
  • IDD_UNINST 必须包含 IDC_EDIT1 (编辑框)。
  • IDD_VERIFY 必须包含 IDC_STR (静态文本框)。
ChangeUI all "${NSISDIR}\Contrib\UIs\sdbarker_tiny.exe"

4.8.1.9 CheckBitmap

bitmap.bmp

指定一个位图为用于组件选择页面树形列表选择框的图像。

该位图应该为 96×16 像素大小，不能多于 8 位位深 (256 色) 且包括六个用于不同状态 (次序为：鼠标点击反白边缘、未选时、已选时、子区段未选时、未选且只读、已选且只读) 的 16×16 图像。使用粉红色为覆盖颜色 (该区域实际时为透明)。

4.8.1.10 CompletedText

文本

当指定了参数时替换在安装结束时的默认文本 ("完成")。否则，使用默认值。

接受变量。如果使用了变量，使用的变量必须在文本输出之前初始化。

4.8.1.11 ComponentText

[文本 [子文本] [子文本2]]

用来更改组件选择页面的默认文本。

文本：控件上的文本，到安装图标的右边。

子文本：安装类型选择控件的文本。

子文本2：安装类型选择控件下面、组件列表左边的文本。

如果字串为空 ("") 则使用默认文本。

接受变量。如果使用了变量，使用的变量必须在创建组件选择页面之前被初始化。

4.8.1.12 CRCCheck

on|off|force

指定安装前安装程序是否对自身执行一个 CRC。注意，如果用户使用了 /NCRC 命令行参数，且你没有指定 force 参数时，不会执行 CRC，这样有可能导致用户安装一个损坏的安装程序。

4.8.1.13 DetailsButtonText

显示详情文本

指定参数时替换默认详细信息按钮文本“显示详情”，未指定参数时使用默认值。

接受变量。如果使用了变量，使用的变量必须在安装页面 (instfiles) 之前被初始化。

4.8.1.14 DirText

[文本] [子文本] [浏览按钮文本] [浏览对话框文本]

用来更改目录选择页面的默认文本。

文本：控件上面的文本，右延至安装图标。

子文本：在目录选择框架上的文本。

浏览按钮文本：浏览按钮上的文本。

浏览对话框文本：在点击“浏览”按钮后“浏览目录”对话框上的文本。

如果字串为空 ("") 则使用默认文本。

接受变量。如果使用了变量，使用的变量必须在创建目录选择页面之前被初始化。

4.8.1.15 DirVar

用户变量 (目录输入输出)

指定用哪个变量来保存所选的目录。该变量也会保存默认值。这样可以很方便的建立两个不同的目录选择页面而不需要频繁的读取、写入 $INSTDIR。默认的变量为 $INSTDIR。它只能用于 PageEx 来确定目录变量和 uninstConfirm 页面。

Var ANOTHER_DIR
PageEx directory
  DirVar $ANOTHER_DIR
PageExEnd

Section
  SetOutPath $INSTDIR
  File "a file.dat"
  SetOutPath $ANOTHER_DIR
  File "another file.dat"
SectionEnd

4.8.1.16 DirVerify

auto|leave

如果使用了 DirVerify leave，则当安装目录无效或磁盘空间不够用时下一步按钮将会被禁止并且你可以在离开函数里使用 GetInstDirError 来读取被设置的标记。

PageEx directory
  DirVerify leave
  PageCallbacks "" "" dirLeave
PageExEnd

4.8.1.17 FileErrorText

文件错误文本

替换当文件不能写入时显示的默认文本。该文本可以包含一个代表文件名的 $0 ($0 会被临时更改为该值)。例如："文件 $0$\r$\n不能写入$\r$\n祝你下次好运。"。

接受变量。如果使用了变量，使用的变量必须在使用 File 指令之前被初始化。

4.8.1.18 Icon

[路径\]图标文件.ico

设置安装程序的图标。在图标文件里的每一个图标将会被包含在安装程序里。注意，如果你添加了卸载程序，那么图标文件里的和卸载程序图标文件对应的每一个图标必须有相同的尺寸大小和颜色位深。图标文件里的次序也要匹配。例如，如果安装程序图标文件有三个图标，第一个图标为 32×32 像素 8bpp，第二个图标为 16×16 像素 8bpp，第三个图标为 8×8 像素 8bpp，那么卸载程序图标文件必须也有三个图标，且这三个图标的大小、颜色位深和次序都要相同。要指定卸载程序的图标请使用 UninstallIcon。

4.8.1.19 InstallButtonText

安装按钮文本

如果指定了参数，则会把默认的“安装”按钮文本替换为你指定的文本。

接受变量。如果使用了变量，使用的变量必须在安装按钮显示之前被初始化。

4.8.1.20 InstallColors

/windows | (前景色 背景色)

设置安装信息屏幕颜色 (默认为 00FF00 000000)。使用 RRGGBB 格式 (十六进制，就像 HTML 那样，但略去了 #，因为 # 用于注释)。注意如果指定了 /windows 作为唯一的参数，将使用默认的 Windows 颜色。

4.8.1.21 InstallDir

默认安装目录

设定默认的安装目录。查看变量一节得到可用于该字串的变量 (尤其是 $PROGRAMFILES)。注意该字串中最后一个 \ 后面的部分会被保留，当用户在安装时选择“浏览”并取得新的目录字串时，该部分会自动附加在后面 (要禁止该行为你需要在目录字串后面添加一个额外的 \ ，但是你要使用引号把目录字串括起来以避免被认为是断行处理)。如果没有起作用的话，还是使用浏览按钮吧。

4.8.1.22 InstallDirRegKey

根键 子键 键名

该属性让安装程序去检测一注册表里的一个字串，如果该字串可用那么把它用来作为安装目录。如果预置了该属性，当指定的注册表键可用时它会越过 InstallDir 指定的字串，否则使用默认的 InstallDir 指定值。查询注册表时，该命令将自动截去引号 (如 "C:\Program Files\poop" "%1"，可得到 C:\Program Files\poop)。如果该字串以 .exe 结尾，它还会自动移去字串里的文件名部分 (如 C:\Program Files\poop\poop.exe ，将得到 C:\Program Files\poop )。对于更多高级的安装目录配置，可在 .onInit 函数里设定 $INSTDIR。[译者注：事实上它还可以自动截取如 "C:\Program Files\poop\poop.exe" "%1" 而得到 C:\Program Files\poop，这样你只要知道了某个程序关联的文件类型，就可以直接用它获得该程序的安装目录。比如 InstallDirRegKey HKCR "FlashGet.Document\shell\open\command" "" 即可获得网际快车的安装目录。]

语言字串和变量不能用于 InstallDirRegKey。

InstallDirRegKey HKLM Software\NSIS ""
InstallDirRegKey HKLM Software\ACME\Thingy InstallLocation

4.8.1.23 InstProgressFlags

[标记 [...]]

有效的标记值为 smooth (平滑进度条) 或 colored (把进度条着色为 InstallColors 设定的颜色)。例如：InstProgressFlags (默认老式 Windows 外观)， InstProgressFlags smooth (新式平滑外观)， InstProgressFlags smooth colored (新式平滑外观并着色)。注意：当安装程序运行在 Windows XP 且使用了新式主题时 smooth 或 colored 都不能与 XPStyle on 共用。

4.8.1.24 InstType

安装类型名称 | /NOCUSTOM | /CUSTOMSTRING=字串 | /COMPONENTSONLYONCUSTOM

把一个安装类型添加到安装类型列表里，或禁止自定义安装类型。最多可以增加到 32 类，每一个类型都需要指定安装类型名称。如果以 un. 作前缀那么它就是一个卸载程序安装类型。你可以使用在运行时可以处理的用户变量而不是难以改变的代码来作为安装类型名称，这样你可以动态的改变安装类型的名称。另一个在运行时更改 InstType 名称的方法是 InstTypeSetText 命令。所不同的是使用 InstTypeSetText 你可以保留你自己宝贵的用户变量。第一个类型为默认类型 (通常为“常规”)。每一个类型都是已编号的，从 1 开始。查看 SectionIn 可以知道这些编号怎么使用。如果指定了 /NOCUSTOM 开关，那么“自定义”类型就会被禁止，那么用户就必须选择一个已经定义的安装类型。作为选择，如果指定了 /CUSTOMSTRING 开关，那么该开关的参数将会替代“自定义”安装类型文本。作为选择，如果指定了 /COMPONENTSONLYONCUSTOM 标记，那么组件列表仅在选择了“自定义”安装类型的时候才显示。

安装类型名称接受变量。如果使用了变量，使用的变量必须在创建组件页面之前被初始化。

4.8.1.25 LicenseBkColor

颜色 | /gray | /windows

设置许可协议数据的背景颜色。颜色使用 RRGGBB 格式 (十六进制，就像 HTML 那样，但略去了 #，因为 # 用于注释)。默认为 /gray。你也可以使用 /windows 来使用 Windows 操作系统定义的颜色。

4.8.1.26 LicenseData

许可文件.(txt|rtf)

指定一个用户读取许可协议的文本文件或 RTF 文件。如果没有许可协议需要显示那么可以忽略它。注意该文件必须是 DOS 文本格式(\r\n)。要定义多语言许可协议请使用 LicenseLangString。

如果你使用 RTF 文件来显示许可协议推荐使用写字板来编辑 RTF 文件而不是使用微软的 Word。使用写字板可以得到更小的文件。

你可以使用 LicenseLangString 来给每一种语言显示一个许可协议。

4.8.1.27 LicenseForceSelection

(checkbox [接受文本] | radiobuttons [接受文本] [拒绝文本] | off)

指定显示的许可协议是否必须被接受。可以使用单选框或互斥按钮的形式。默认情况下“下一步”按钮是禁止的并且只能在钩选了单选框选择了正确的互斥按钮后才可以进入下一步。如果指定了 off 则默认情况下“下一步：按钮是可用的。

LicenseForceSelection checkbox
LicenseForceSelection checkbox "我接受"
LicenseForceSelection radiobuttons
LicenseForceSelection radiobuttons "我接受"
LicenseForceSelection radiobuttons "我接受" "我不接受"
LicenseForceSelection radiobuttons "" "我不接受"
LicenseForceSelection off

4.8.1.28 LicenseText

[文本 [按钮文本]]

用来更改许可协议页面的默认文本。

文本：控件上方的文本，右延至安装图标。

按钮文本：“我同意”按钮上的文本。

如果字串为空 ("") 则使用默认文本。

接受变量。如果使用了变量，使用的变量必须在创建许可协议页面之前被初始化。

4.8.1.29 ManifestDPIAware

notset|true|false

声明该安装程序的DPI感知。一个DPI感知的应用程序不会被DWM（DPI虚拟化）缩放，使文本永远不会模糊。 NSIS不能扩展所使用的组件页面上的树控件中的位图，另外一些插件也可能有兼容问题，所以要确保您测试您的安装在不同的DPI设置下是否显示正确。

请参阅 MSDN 关于DPI的应用程序的更多信息。

4.8.1.30 ManifestSupportedOS

none|all|WinVista|Win7|Win8|Win8.1|Win10|{GUID} [...]

声明该安装程序与指定的Windows版本（S）兼容。这增加了在应用程序清单的兼容性部分一个 SupportedOS 项。 Win7、Win8、 Win8.1的默认列表可能会被更新（包括未来新的Windows版本）。因为兼容性的原因， RequestExecutionLevel 将默认设置为 none。

更多的行为变化您可以阅读 MSDN。

4.8.1.31 MiscButtonText

[上一步文本 [下一步文本] [退出按钮文本] [关闭按钮文本]]

替换这四个 (上一步、下一步、退出、关闭) 按钮的默认文本。如果留空参数，将使用默认值代替。

接受变量。如果使用了变量，使用的变量必须在 .onInit 被初始化。

4.8.1.32 Name

名称 [双与名称]

设置安装程序的名称。名称通常用来显示产品的名称比如“我的程序”。如果在名称里有一个或多个与符号 (&)，把第二个参数设为与第一个相同，有 & 的地方使用两个 & 来表示。例如你的产品名称为“foo & bar2000”，那么使用：

 Name "foo & bar2000" "foo && bar2000"

如果你的安装程序名称里有 & 符号并且对名称使用了一个 LangString，那么你还需要创建另一个含有双 & 字符的名称作为第二个参数。

接受变量。如果使用了变量，使用的变量必须在 .onInit 被初始化。

4.8.1.33 OutFile

[路径\]安装程序.exe

指定 MakeNSIS 要写入安装程序的输出文件。仅仅是 MakeNSIS 要写入的文件，它不会对安装程序的内容有任何影响。

4.8.1.34 RequestExecutionLevel

none|user|highest|admin

指定在 Windows Vista 下安装程序需要的执行级别。该值将被内嵌到安装/卸载程序的 XML manifest 中，告诉 Vista (也可能未来版本的 Windows) 安装程序需要什么样的权限级别。user 不需要管理员组权限，只要求普通用户权限级别。highest 要求当前用户的有效最高权限级别，所以 Windows 将提示用户确认以提升权限。该提示可能要求用户的密码。admin 要求管理员权限级别，Windows 同样会提示用户。设为默认值 none 将会保持 manifest 为空，并由 Windows 来判断执行级别。Windows Vista/7 能自动识别 NSIS 安装程序并决定所需理员权限。因此，none 和 admin 实际上具有相同效果。

建议每一个应用程序一定要标记所需的执行级别，至少微软推荐这样做。未标记的安装程序将运行于兼容模式。这种模式下暂时解决方案是自动将创建在当前用户开始菜单的快捷方式移动到所有用户的开始菜单。不需要给系统文件夹安装文件或者写入本机注册表 (HKLM) 的安装程序应指定 user 执行级别。

在 MSDN 上可以找到更多关于此主题的信息。关键词有：UAC、requested execution level、vista manifest 和 vista security。

4.8.1.35 SetFont

[/LANG=语言ID] 字体名 字体大小

设置安装程序字体大小。请记住你选择的字体在用户的机器上也要有，不要使用只有你自己有的字体。

如果你想对每一个语言设置不同的字体，使用 /LANG 开关。例如：

 SetFont /LANG=${LANG_ENGLISH} "English Font" 9
 SetFont /LANG=${LANG_FRENCH} "French Font" 10

名称为 ^Font 和 ^FontSize 的两个常量语言字串包含了每种语言对应的字体和字体大小。

4.8.1.36 ShowInstDetails

hide|show|nevershow

设置是否显示安装详细信息。你可以设为 hide 来隐藏详细信息但用户可以查看，show 用来默认显示详细信息，nevershow 可以阻止用户查看任何信息。注意区段里可以使用 SetDetailsView 来更改它的设置。

4.8.1.36 ShowUninstDetails

hide|show|nevershow

设置是否显示卸载详细信息。你可以设为 hide 来隐藏详细信息但用户可以查看，show 用来默认显示详细信息，nevershow 可以阻止用户查看任何信息。注意区段里可以使用 SetDetailsView 来更改它的设置。

4.8.1.36 SilentInstall

normal|silent|silentlog

指定安装程序是否静默安装。如果它为 silent 或 silentlog，所有标记为 SF_SELECTED 的区段都会被安装而不做提示 (你可以使用 SectionSetFlags 来设定区段的标记)，安装程序本身没有任何屏幕输出 (而脚本仍可以显示某些特定的输出，使用 MessageBox 的 /SD 参数来指定静默安装时默认的返回值)。注意如果设置为 normal 且用户运行时使用了 /S (区分大小写) 命令行参数时就相当于 SilentInstall 设置为 silent 一样。注意：也可以看 LogSet。

更多信息请查看 4.12 节。

4.8.1.39 SilentUnInstall

normal|silent

指定卸载程序是否静默安装。如果它为 silent，卸载区段会被运行而不做提示，卸载程序本身没有任何屏幕输出 (而脚本仍可以显示某些特定的输出，使用 MessageBox 的 /SD 参数来指定静默安装时默认的返回值)。注意如果设置为 normal 且用户运行时使用了 /S (区分大小写) 命令行参数时就相当于 SilentUnInstall 设置为 silent 一样。注意：也可以看 LogSet。

更多信息请查看 4.12 节。

4.8.1.40 SpaceTexts

[需要空间文本 [可用空间文本]]

如果指定了参数，将会取代安装所需空间和可用空间文本(默认为“所需空间：”和“可用空间：”)。如果指定为 none 则不会显示空间提示文本。

接受变量。如果使用了变量，使用的变量必须在创建组件选择页面之前被初始化。

4.8.1.41 SubCaption

[页面代号 子标题]

取代每一个安装程序页面 (0="：许可协议"，1="：安装选项"，2="：安装目录"，3="：正在安装"，4="：安装完成") 的子标题。如果指定了空字串 ("")，将使用默认值 (你也可以指定 " " 来使用一个空白字串)。

你也可以在一个 PageEx 区块内部使用 Caption 来设置一个子标题 (或取代默认值)。

接受变量。如果使用了变量，使用的变量必须在相关页面创建之前被初始化。

4.8.1.42 UninstallButtonText

文本

替换卸载程序上默认为“卸载”的按钮文本。如果无指定参数，将使用默认的文本。也可以看 WriteUninstaller (替换 UninstallEXEName)。

接受变量。如果使用了变量，使用的变量必须在卸载按钮显示之前被初始化。

4.8.1.43 UninstallCaption

标题

设置卸载程序标题条上显示的文本。默认情况下，它为由 Name 命令指定的“卸载名称”。你可以取代它为“我的应用程序卸载”或其他。如果指定了空字串 ("")，将使用默认值 (你也可以指定 " " 来使用一个空白字串)。

接受变量。如果使用了变量，使用的变量必须在 un.onInit 被初始化。

4.8.1.44 UninstallIcon

[路径\]图标.ico

设置卸载程序的图标。这个图标文件必须和安装程序的图标结构一致。关于这个限制的更多信息请看 Icon。

4.8.1.45 UninstallSubCaption

页面代号 子标题

取代每一个卸载程序页面 (0="：卸载确认"，1="：正在卸载"，2="：卸载完成") 的子标题。如果指定了空字串 ("")，将使用默认值 (你也可以指定 " " 来使用一个空白字串)。

你也可以在一个 PageEx 区块内部使用 Caption 来设置一个子标题 (或取代默认值)。

接受变量，如果使用了变量，使用的变量必须在相关的页面创建之前被初始化。

4.8.1.46 UninstallText

文本 [子文本]

指定卸载程序确认页面上的文本。

文本：控件上方的文本

子文本：下面卸载定位的文本

接受变量，如果使用了变量，使用的变量必须在创建卸载确认页面之前被初始化。

4.8.1.47 WindowIcon

on|off

设置是否显示安装程序的图标。

4.8.1.48 XPStyle

on|off

设置是否把 XP 外观添加到安装程序里。当运行在 Windows XP 时一个 XP 外观使得安装程序控件使用新的 XP 样式。这个设定也会影响卸载程序。

4.8.2 编译器标记

下面的命令可以告诉编译器如何去创建代码和压缩数据。这些命令在脚本的任何地方都有效，并且影响着该命令下的每一行 (直到被另一个命令覆盖)。

例如，在下面的脚本，blah.dat将永远不会被覆盖。

${If} $0 == 0
  SetOverwrite on
${Else}
  SetOverwrite off
${EndIf}
File blah.dat # overwrite is always off here!

相反，以下blah.bat将会被使用

${If} $0 == 0
  SetOverwrite on
  File blah.dat
${Else}
  SetOverwrite off
  File blah.dat
${EndIf}

4.8.2.1 AllowSkipFiles

on|off

该命令指定用户是否可以略过文件。如果 SetOverwrite 设为 on (默认) 且当安装程序打开一个文件往里边写入东西失败时一个用户可以选择略过文件。如果使用了 off 则不会显示允许用户略过文件的忽略按钮，这样用户只能选择退出安装程序 (退出按钮) 或重试打开该文件写入 (重试按钮)。如果使用了 on 则用户可以选择跳过文件 (同时置一个错误标记 - 看 SetOverwrite)。

4.8.2.2 FileBufSize

缓冲大小_MB

该命令设置编译器内部文件缓冲大小。该命令允许你通过限制一个所给的文件一次性读入内存的多少来控制编译器的内存的使用。因为编译器需要输入和输出，所以文件缓冲时需要使用两倍指定的内存大小。该命令不会限制需要另一组内存大小的压缩器缓冲，也不会限制编译器另外的内部缓冲，因为这两个缓冲正常情况下无论如何也不能达到 1MB。指定一个很小的数字可能会降低执行效率。指定过大的数字可能会耗尽系统的资源并迫使编译器退出编译处理。该默认值为 32MB。

4.8.2.3 SetCompress

auto|force|off

该命令设置由安装程序使用来决定数据是否应该被压缩的压缩标记。典型的 SetCompress 标记将影响它后面的命令，并且脚本文件中的最后一个 SetCompress 命令也决定了是否压缩安装信息区段和卸载数据。如果压缩标记为 auto，那么仅当压缩后大小小于未压缩时文件才会被压缩。如果压缩标记为 force，则始终使用压缩。如果压缩标记为 off，则不使用压缩 (这样可以加快编译速度)。

注意该选项当使用了固实压缩方式后无效。

4.8.2.4 SetCompressor

[/SOLID] [/FINAL] zlib|bzip2|lzma

该命令设置了安装程序压缩文件、数据使用的压缩算法。该命令只能在区段、函数之外或在任何数据被压缩之前使用。不同的压缩方式不能在同一个安装程序里用来压缩不同的文件。建议在脚本的开始处使用这个命令来尽可能避免编译错误。

支持三种压缩方式：ZLIB，BZIP2 和 LZMA。

ZLIB (默认值) 使用收缩算法，是一个快速简单的方法。默认的压缩级别它消耗大约 300KB 内存。

BZIP2 通常比 ZLIB 的压缩率好，但是稍微慢了一点并且内存的使用也多一点。默认的压缩级别它消耗大约 4MB 内存。

LZMA 是一个压缩率比较理想的新式压缩方式。它的解压速度非常快(在 2GHz 的 CPU 上能达到 10-20MB/s 的速度)，但是压缩速度很慢。解压时内存的使用量是字典的大小加上一些 KB，默认值为 8MB。

如果使用了/FINAL ，则后来调用的 SetCompressor 都会被忽略。

如果使用了/SOLID 的话，所有的数据将被压缩在一个区块里，这样可以提高压缩率。

4.8.2.5 SetCompressorDictSize

字典大小以 MB 为单位

设置使用 LZMA 压缩器时的字典大小 (默认为 8MB)。

4.8.2.6 SetDatablockOptimize

on|off

该命令决定编译器是否优化数据区块。数据区块的优化首先由编译器检查要添加到数据区块的数据是否已经存在了，如果已存在，只需要简单的作为引用来添加 (会保留一小部分大小)。非常强烈的推荐保留该选项为 on。

4.8.2.7 SetDateSave

on|off

该命令设置了由 File 命令使用的保存文件日期、时间标记来决定是否保留最后上次写入文件的日期和时间，它可以在安装时储存下来。有效的开关为 on 和 off。默认为 on。

4.8.2.8 SetOverwrite

on|off|try|ifnewer|ifdiff|lastused

该命令设置了由 File 命令使用的覆盖标记来决定目标文件已存在时是否覆盖。如果覆盖标记为 on，则目标文件被覆盖 (这个是默认值)。如果覆盖标记为 off，则已存在的文件不会被覆盖。如果覆盖标记为 try，文件仅当可以被覆盖时 (就是说假如文件不能写入，它会自动略过而不需要用户决定) 才会覆盖目标文件。如果覆盖标记为 ifnewer，则仅当已存在的文件比新文件旧时才会覆盖目标文件。如果覆盖标记为 ifdiff，则仅当已存在的文件比新文件旧或新时才会覆盖目标文件。注意在 ifnewer 或 ifdiff 模式下，目标文件的日期都会被设为新文件的日期，而不管 SetDateSave 是怎么设置的。

SetOverwrite off
File program.cfg # 配置文件将不会覆盖
SetOverwrite on

4.8.2.9 Unicode

true|false

生成一个 Unicode 安装程序。

4.8.3 版本信息

4.8.3.1 VIAddVersionKey

 [/LANG=语言ID] 键名 值

在文件属性的版本表格里添加一个字段。既可以是由系统提供的的一个字段也可以是一个用户定义的字段。随后的这些字段由系统提供：

  • ProductName
  • Comments
  • CompanyName
  • LegalCopyright
  • FileDescription
  • FileVersion
  • ProductVersion
  • InternalName
  • LegalTrademarks
  • OriginalFilename
  • PrivateBuild
  • SpecialBuild

这些字段名称由目标系统翻译，而用户自定义的字段则无翻译。

VIAddVersionKey /LANG=${LANG_ENGLISH} "ProductName" "Test Application"
VIAddVersionKey /LANG=${LANG_ENGLISH} "Comments" "A test comment"
VIAddVersionKey /LANG=${LANG_ENGLISH} "CompanyName" "Fake company"
VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalTrademarks" "Test Application is a trademark of Fake company"
VIAddVersionKey /LANG=${LANG_ENGLISH} "LegalCopyright" "(C) Fake company"
VIAddVersionKey /LANG=${LANG_ENGLISH} "FileDescription" "Test Application"
VIAddVersionKey /LANG=${LANG_ENGLISH} "FileVersion" "1.2.3"

4.8.3.2 VIProductVersion

[版本字串_X.X.X.X]

在文件属性版本表格的顶部添加产品版本号。

VIProductVersion "1.2.3.4"

4.8.3.3 VIFileVersion

[version_string_X.X.X.X]

在文件属性版本表格的顶部添加文件版本。

VIFileVersion "1.2.3.4"


指令

4.9 指令

4.9.1 基本指令

NSIS 用于脚本的这些指令稍微的近似于 PHP 和汇编。它们没有真正的高级语言结构，但是他们的指令 (对于绝大部分) 却是高级的，并且你可以很容易的掌握 (比如你不用担心字串的连接等等)。基本上你有25个寄存器 (20个常规用途，5个特殊用途)，和一个堆栈。

4.9.1.1 Delete

[/REBOOTOK] 文件

从目标系统删除文件 (可以是文件或通配符，但必须指定一个完整的路径)。如果指定了 /REBOOTOK 并且该文件当前不可删除，则会在系统重启时删除该文件——如果该文件要在系统重启时删除，你还要设置一个重启的标记。如果找到的文件不能被删除则会置一个错误标记。但该错误标记不是为尝试删除一个不存在的文件设置的。

Delete $INSTDIR\somefile.dat

4.9.1.2 Exec

命令

执行一个指定的程序并且立即继续安装。注意指定的文件必须存在于目标系统而不是编译的系统。$OUTDIR 用于指定工作路径。如果该命令不能被运行则会置一个错误标记。注意，如果该命令包含有空格，你要用引号来把他们包括起来。例如：Exec '"$INSTDIR\command.exe" 参数'。如果你不用引号括起来则在 Windows 9X 下不正常或丢失参数。

Exec '"$INSTDIR\someprogram.exe"'
Exec '"$INSTDIR\someprogram.exe" some parameters'

4.9.1.3 ExecShell

动作 命令 [参数] [SW_SHOWNORMAL | SW_SHOWMAXIMIZED | SW_SHOWMINIMIZED | SW_HIDE]

使用 Windows 的外壳关联来执行一个指定的程序。注意“动作”通常为 open、print 等等，也可以是一个空字串来使用默认动作。参数和显示类型是可选项。$OUTDIR 用于指定工作路径。如果该命令不能被运行则会置一个错误标记。

ExecShell "open" "http://nsis.sf.net/"
ExecShell "open" "$INSTDIR\readme.txt"
ExecShell "print" "$INSTDIR\readme.txt"

4.9.1.4 ExecWait

命令 [用户变量(返回代码)]

执行一个指定的程序并且等待运行处理结束。更多信息请查看 Exec。当程序执行返回一个非零错误代码，或者当产生错误时如果没有指定“用户变量 (返回代码)” 则 ExecWait 会置一个错误标记。如果指定了“用户变量 (返回代码)”，ExecWait 会把变量设为返回代码 (并且仅当产生错误时置一个错误标记；如果产生错误则该用户变量的内容为未指定)。注意，如果该命令包含有空格，你要用引号来把他们包括起来。例如：Exec '"$INSTDIR\command.exe" 参数'。如果你不用引号括起来则在Windows 9X 下不正常或丢失参数。

ExecWait '"$INSTDIR\someprogram.exe"'
ExecWait '"$INSTDIR\someprogram.exe"' $0
DetailPrint "程序返回了 $0"

4.9.1.5 File

[/nonfatal] [/a] ([/r] [/x 文件|通配符 [...]] (文件|通配符) [...] | /oname=输出路径\文件名 输入路径\文件名)

释放文件到当前输出路径 ($OUTDIR)。

  • 注意输出文件名是 $OUTDIR\文件名。
  • 如果使用了 /oname=X 开关，则输出文件会变为 $OUTDIR\X。当使用了 /oname= 开关时只能指定一个文件，且输出的文件名可以使用变量 (或完整路径如 $SYSDIR\whatever.dll)。如果输出名称包含了空格，你需要用双引号把参数括起来，包括 /oname，就像下面例子显示的那样。
  • 支持通配符。
  • 如果使用了 /r 开关，匹配的文件将会在子目录里被递归的搜索。如果目录名匹配则所有包含的内容都会被递归添加，目录结构也会被保持。
  • 使用 /x 开关可以用来来排除文件或目录。
  • 如果使用了 /a 开关，则被添加的文件的属性将会保持。
  • 如果覆盖模式被设定为 try 并且文件不能覆盖，那么 File 命令将会置一个错误标记，或者如果覆盖模式被设定为 on 并且文件不能覆盖并用户选择了忽略时，也会放置一个错误标记。
  • 如果使用了 /nonfatal 开关且当文件未找到时使用警告来代替错误。
File something.exe
File /a something.exe
File *.exe
File /r *.dat
File /r data
File /oname=$TEMP\temp.dat 某文件.ext
File "/oname=$TEMP\带 空 格 的 名 称.dat" 某文件.ext
File /nonfatal "一个可能不存在的文件"
File /r /x CVS 我的工程\*.*
File /r /x *.res /x *.obj /x *.pch source\*.*

4.9.1.6 Rename

[/REBOOTOK] 源文件 目标文件

把“源文件”重命名为“目标文件”。你可以用它来把用户系统里的任何地方的一个文件移动到用户系统里的任何地方，你也可以在一些驱动器上把一个目录移动到某些地方。目标文件必须不存在否则移动失败 (除非你使用了 /REBOOTOK)。如果指定了 /REBOOTOK，并且当文件不能移动时 (比如，目标文件已存在)，则该文件在系统重启后才被移动到目标。如果文件在重启后才被移动，则会放置一个重启的标记。当文件不能被重命名时 (并且没有使用 /REBOOTOK) 或者原文件不存在时，会放置一个错误标记。

如果没有指定绝对路径则使用当前路径代替。当前路径可以使用 SetOutPath 指令来设置。如果你没有使用 SetOutPath 那么当前路径为 $EXEDIR。

Rename $INSTDIR\file.ext $INSTDIR\file.dat

4.9.1.7 ReserveFile

[/nonfatal] [/r] [/x file|wildcard [...]] 文件 [文件...]

把文件保存在稍后使用的数据区块。文件将按照在脚本里出现的次序依次添加到压缩的数据区块。因为函数不必要按照它们出现在脚本里的次序调用，因此如果你把文件添加到一个早期就调用但却放在脚本最后的函数的时候，早期需要的文件需要解压出来，那么当文件很多的时候就需要很长的时间去解压这些文件。.onInit 就是这样的一个函数。它总是在安装程序初始化的时候被调用，如果你把这个函数放在了脚本的最后，这个函数所需要的文件之前还有很多文件，那么当你解压这些需要的文件的时候安装程序就需要大量的时间才能载入。这就是为什么这个命令很有用的原因，这个命令能加快安装程序的载入，使用这个命令后它可以把早期需要的文件添加到数据区块的顶端而不是让 NSIS 把压缩的数据区块从顶端搜索到底部后才把这些文件解压出来。

相关参数说明请查看 File。

4.9.1.8 RMDir

[/r] [/REBOOTOK] 目录名

删除指定的目录 (完整路径)。没有 /r 参数时只有在目录为空时才会被删除。如果指定了 /r，则目录会被递归删除，所以在指定目录下的所有文件和目录均被删除。如果指定了 /REBOOTOK，任何当前不能删除的文件或目录将会在重启后被删除——如果文件或目录需要在重启时被删除，会放置一个重启的标记。当文件或目录不能被删除时放置一个错误的标记。

RMDir $INSTDIR
RMDir $INSTDIR\data
RMDir /r /REBOOTOK $INSTIDR
RMDir /REBOOTOK $INSTDIR\DLLs

需要注意的是当前的工作目录不能删除。当前的工作目录由 SetOutPath 设定。例如，下面的例子里将不能删除该目录。

SetOutPath $TEMP\dir
RMDir $TEMP\dir

而下面的例子可以删除该目录。

SetOutPath $TEMP\dir
SetOutPath $TEMP
RMDir $TEMP\dir

4.9.1.9 SetOutPath

输出路径

设置输出路径 ($OUTDIR) 且当路径不存在时创建 (需要时会递归创建)。必须为全路径名，通常都使用 $INSTDIR。

SetOutPath $INSTDIR
File program.exe

4.9.2 注册表、INI 文件指令

在下面所有的注册表指令里你可以使用一个空字串 ("") 来作为某个子健默认项，该默认项在注册表编辑器里显示为“(默认)”。

如果要处理的 INI 文件的路径没有指定，则使用 Windows 目录来代替。

4.9.2.1 DeleteINISec

INI文件 区段

从“INI文件”里删除整个区段“区段”。如果该区段不能被删除，会放置一个错误的标记。但是如果该区段找不到时则不会放置错误标记。

WriteINIStr $TEMP\something.ini section1 something 123
WriteINIStr $TEMP\something.ini section1 somethingelse 1234
WriteINIStr $TEMP\something.ini section2 nsis true
DeleteINISec $TEMP\something.ini section1

4.9.2.2 DeleteINIStr

INI文件 区段 字串

从“INI文件”里的“区段”区段删除“字串”字串。如果该字串不能被删除，会放置一个错误的标记。但是如果该字串找不到时则不会放置错误标记。

WriteINIStr $TEMP\something.ini section1 something 123
WriteINIStr $TEMP\something.ini section1 somethingelse 1234
DeleteINIStr $TEMP\something.ini section1 somethingelse

4.9.2.3 DeleteRegKey

[/ifempty] 根键 子键

删除一个注册表键。如果指定了 /ifempty，则该注册表键仅当它无子键时才会被删除 (否则，整个注册表键将被删除)。有效的根键值在后面的 WriteRegStr 列出。如果该键不能被删除 (或如果它不存在) 则会放置一个错误的标记。

DeleteRegKey HKLM "Software\我的公司\我的软件"
DeleteRegKey /ifempty HKLM "Software\可能拥有子键的键"

4.9.2.4 DeleteRegValue

根键 子键 键名

删除一个注册表键值。有效的根键值在后面的 WriteRegStr 列出。如果该键值不能被删除 (或如果它不存在) 则会放置一个错误的标记。

DeleteRegValue HKLM "Software\我的公司\我的软件" "some value"

4.9.2.5 EnumRegKey

用户变量(输出) 根键 子键 索引

查询“根键\子键”第“索引”号注册表的键并输出到变量。有效的根键值在后面的 WriteRegStr 列出。当指定的“根键\子键”没有任何键时会返回一个空字串，当产生一个错误时会返回空字串并放置一个错误标记。

StrCpy $0 0
loop:
  ClearErrors
  EnumRegKey $1 HKLM Software $0
  IfErrors done ;如果发生错误则提前结束
  IntOp $0 $0 + 1
  MessageBox MB_YESNO|MB_ICONQUESTION "$1$\n$\n显示更多？" IDYES loop
done:

4.9.2.6 EnumRegValue

用户变量(输出) 根键 子键 索引

查询“根键\子键”第“索引”号注册表的键值并输出到变量。有效的根键值在后面的 WriteRegStr 列出。当指定的“根键\子键”没有任何键值时会返回一个空字串，当产生一个错误时会返回空字串并放置一个错误标记。

StrCpy $0 0
loop:
  EnumRegValue $1 HKLM Software\Microsoft\Windows\CurrentVersion $0
  StrCmp $1 "" done
  IntOp $0 $0 + 1
  ReadRegStr $2 HKLM Software\Microsoft\Windows\CurrentVersion $1
  MessageBox MB_YESNO|MB_ICONQUESTION "$1 = $2$\n$\n显示更多？" IDYES loop
done:

4.9.2.7 ExpandEnvStrings

用户变量(输出) 字串

把字串里的环境变量展开到用户变量 $x。如果环境变量不存在则字串不会被替换。例如，你使用 %var% 而 var 不存在，输出还是 %var%。如果发生错误，该变量会被设为空值并放置一个错误标记。

ExpandEnvStrings $0 "WINDIR=%WINDIR%$\nTEMP=%TEMP%"

4.9.2.8 FlushINI

INI文件名

刷新 INI 文件缓冲。Windows 9x 会保持 INI 文件在内存里。该命令强制更改立即写入磁盘。当你自己编辑一个 INI 文件的时候可以使用它，删除、移动、复制，直到你使用 WriteINIStr、DeleteINISec 或 DeleteINStr 来更改它。

WriteINIStr $TEMP\something.ini test test test
FlushINI $TEMP\something.ini
Delete $TEMP\something.ini

4.9.2.9 ReadEnvStr

用户变量(输出) 名称

从环境字串“名称”读取值并把值赋给用户变量 $x。如果读取字串时有错误发生，该用户变量被设为空，并放置一个错误标记。

ReadEnvStr $0 WINDIR
ReadEnvStr $1 TEMP

4.9.2.10 ReadINIStr

用户变量(输出) INI文件 区段 项

从“INI文件”的“区段”区段读取“项”的值并把该值输出到用户变量。如果该项未找到时会放置一个错误标记且该用户变量被赋为空值。

ReadINIStr $0 $INSTDIR\winamp.ini winamp outname

4.9.2.11 ReadRegDWORD

用户变量(输出) 根键 子键 项

从注册表读取一个 32 位 DWORD 并输出到用户变量。有效的根键值在后面的 WriteRegStr 列出。如果 DWORD 不存在时会放置一个错误标记并把 $x 设为空字串。如果该值存在但不是 DWORD，则会作为字串类型读取并放置一个错误标记。

ReadRegDWORD $0 HKLM Software\NSIS VersionBuild

4.9.2.12 ReadRegStr

用户变量(输出) 根键 子键 项

从注册表读取一个字串值并输出到用户变量。有效的根键值在后面的 WriteRegStr 列出。如果字串不存在时会放置一个错误标记并把 $x 设为空字串。如果该值存在但是 DWORD，则会转换为字串类型并放置一个错误标记。

ReadRegStr $0 HKLM Software\NSIS ""
DetailPrint "NSIS 安装在：$0"

4.9.2.13 WriteINIStr

INI文件 区段 项 值

把“项”=“值”写入“INI文件”的“区段名”区段。如果 INI 文件不能写入则放置一个错误的标记。

WriteINIStr $TEMP\something.ini section1 something 123
WriteINIStr $TEMP\something.ini section1 somethingelse 1234
WriteINIStr $TEMP\something.ini section2 nsis true

4.9.2.14 WriteRegBin

根键 子键 项 值数据

该命令将会写一个区块的二进制数据到注册表。有效的根键值在后面的 WriteRegStr 列出。值数据为十六进制格式 (如 DEADBEEF01223211151)。如果该二进制数据不能写入注册表则放置一个错误的标记。如果注册表键不存在则会自动创建。“值数据”不能使用变量。

WriteRegBin HKLM "Software\我的公司\我的软件" "二进制值" DEADBEEF01223211151

4.9.2.15 WriteRegDWORD

根键 子键 项 值

该命令写一个 DWORD (32 位整数) 到注册表 (可以使用变量)。有效的根键值在后面的 WriteRegStr 列出。如果该 DWORD 不能写入注册表则会放置一个错误的标记。如果注册表键不存在则会自动创建。

WriteRegDWORD HKLM "Software\我的公司\我的软件" "DWORD 值" 0xDEADBEEF

4.9.2.16 WriteRegStr

根键 子键 项 值

把字串写入注册表。详细信息请查看 WriteRegExpandStr。

WriteRegStr HKLM "Software\我的公司\我的软件" "字符串值" "Dead Beef"

4.9.2.17 WriteRegExpandStr

根键 子键 项 值

把字串写入注册表。根键必须为下面列表之一：

  • HKCR 或 HKEY_CLASSES_ROOT
  • HKLM 或 HKEY_LOCAL_MACHINE
  • HKCU 或HKEY_CURRENT_USER
  • HKU 或 HKEY_USERS
  • HKCC 或 HKEY_CURRENT_CONFIG
  • HKDD 或 HKEY_DYN_DATA
  • HKPD 或 HKEY_PERFORMANCE_DATA
  • SHCTX 或 SHELL_CONTEXT

如果字串不能写入注册表则放置一个错误的标记。字串的类型为 REG_SZ 对应 WriteRegStr，或 REG_EXPAND_STR 对应 WriteRegExpandStr。如果注册表键不存在则会自动创建。

WriteRegExpandStr HKLM "Software\我的公司\我的软件" "可扩充字符串值" "%WINDIR%\notepad.exe"

4.9.3 常规用途指令

4.9.3.1 CallInstDLL

DLL文件 [/NOUNLOAD] 函数

从一个 NSIS 扩展动态链接库里调用一个函数。看 Examples\Plugin 的例子可以知道如何来创建。扩展动态链接库可以访问堆栈和变量。使用 /NOUNLOAD 来强制安装程序保持动态链接库不卸载。注意：要自动释放并调用 DLL 插件请使用插件命令而不是 CallInstDLL。

Push "参数"
Push "另一个参数"
CallInstDLL $INSTDIR\SomeDLL.dll SomeFunction

4.9.3.2 CopyFiles

[/SILENT] [/FILESONLY] 目标系统文件规范 目标路径 [文件大小_KB]

在正在安装的系统中把“目标系统文件”复制到“目标路径”。如果你想从安装媒体里复制，或从系统的一个地方复制到另一个地方，你可以使用 $EXEDIR 变量来代替安装程序目录。如果复制操作需要很长时间的话你可以看到 Windows 的复制文件窗口 (要禁止出现复制文件窗口使用 /SILENT)。最后的参数用来指定要复制的文件的大小 (单位为 KB)，使安装程序可以估计所需磁盘空间。当出错或用户退出 (仅当忽略了 /SILENT 时) 时，会放置一个错误标记。如果指定了 /FILESONLY 则仅复制文件。

这个指令应该使用完整的路径，使用相对路径将得到不可预料的结果。

CreateDirectory $INSTDIR\backup
CopyFiles $INSTDIR\*.dat $INSTDIR\backup

4.9.3.3 CreateDirectory

要创建的路径

创建 (递归创建) 指定的目录。当目录不能创建时会放置一个错误标记。

你也可以指定一个绝对路径。

CreateDirectory $INSTDIR\some\directory

4.9.3.4 CreateShortCut

快捷文件.lnk 目标文件 [参数 [图标文件 [图标索引号 [启动选项 [键盘快捷键 [描述]]]]]]

创建一个指向“目标文件”的快捷方式“快捷文件.lnk”，可以带“参数”参数。用于快捷方式的图标为“图标文件,图标索引号”；要使用默认图标的话把“图标文件”和“图标索引号”设为空字串。“启动选项”可以是它们之一：SW_SHOWNORMAL、SW_SHOWMAXIMIZED、SW_SHOWMINIMIZED 或一个空字串。“键盘快捷键”应该为 flag|c 格式且 flag 可以联合使用 (使用“|”)：ALT、CONTROL、EXT 或 SHIFT。c 为要使用的字符 (a-z、A-Z、0-9、F1-F24 等等)。注意在这些字串里不能含有空格。一个典型的例子为 "ALT|CONTROL|F8"。$OUTDIR 被用来作为工作目录。你可以在创建快捷方式之前使用 SetOutPath 来指定或更改。“描述” 为快捷方式的描述，或在 XP 下作为注释调用。当快捷方式不能创建的时候会放置一个错误标记 (例如路径 (链接路径或目标路径) 不存在或一些其它错误)。

CreateDirectory "$SMPROGRAMS\我的公司"
CreateShortCut "$SMPROGRAMS\我的公司\我的软件.lnk" "$INSTDIR\我的程序.exe" \
  "一些命令行参数" "$INSTDIR\我的程序.exe" 2 SW_SHOWNORMAL \
  ALT|CTRL|SHIFT|F5 "描述"

4.9.3.5 GetDLLVersion

文件名 用户变量(高位DWORD输出) 用户变量(低位DWORD输出)

从“文件名”DLL (或其他包含版本信息的可执行文件) 取得版本信息。成功时把版本信息高位 DWORD 和低位 DWORD 设为用户输出变量；失败时输出为空且置错误标记。下面的例子演示了读取一个 DLL 版本并可读的版本到 $0：

GetDllVersion "$INSTDIR\MyDLL.dll" $R0 $R1
IntOp $R2 $R0 / 0x00010000
IntOp $R3 $R0 & 0x0000FFFF
IntOp $R4 $R1 / 0x00010000
IntOp $R5 $R1 & 0x0000FFFF
StrCpy $0 "$R2.$R3.$R4.$R5"

4.9.3.6 GetDLLVersionLocal

内部文件 用户变量(高位DWORD输出) 用户变量(低位DWORD输出)

类似于 GetDLLVersion，但它仅用于获取安装程序内部文件的信息 (它实际上编译为两个 StrCpy 命令)。成功时把内部文件的版本信息高位 DWORD 和低位 DWORD 设为用户输出变量。

4.9.3.7 GetFileTime

文件名 用户变量(高位DWORD输出) 用户变量(低位DWORD输出)

获取“文件名”的最后写入时间。成功时把时间戳信息高位 DWORD 和低位 DWORD 输出到用户输出变量；失败时输出为空且置一个错误标记。

4.9.3.8 GetFileTimeLocal

内部文件 用户变量(高位DWORD输出) 用户变量(低位DWORD输出)

类似于 GetFileTime，但它仅用于获取安装程序内部文件的信息 (它实际上编译为两个 StrCpy 命令)。

4.9.3.9 GetFullPathName

[/SHORT] 用户变量(输出) 路径或文件

把指定的文件完整路径信息输出到用户变量。如果参数的部分路径未找到，则会放置一个错误位标记并清空输出变量。如果指定了 /SHORT，路经将会被转换为短文件名格式。

4.9.3.10 GetTempFileName

用户变量(输出) [基本路径]

把一个临时文件的名称输出到用户变量。该文件会自动创建，所以你可以随时的覆盖它。该临时文件的名称唯一。如果你希望这个临时文件创建在另一个目录而不是 Windows 临时目录的话指定一个“基本路径”给它。该临时文件需要在完成之后手动删除。

GetTempFileName $0
File /oname=$0 something.dat
# 其它一些关于 something.dat 的操作
Delete $0

4.9.3.11 SearchPath

用户变量(输出) 文件名

由第二个参数指定的文件名的全路径输出到用户变量。如果该文件不存在则会置一个错误位标记并清空输出的变量。使用 SearchPath() 来在系统目录里搜索文件。

4.9.3.12 SetFileAttributes

文件名 属性1|属性2|...

设置文件的属性。多从属性可用 | 隔开，有效的属性为：

  • NORMAL 或 FILE_ATTRIBUTE_NORMAL (你可以把该项缩写为 0)
  • ARCHIVE 或 FILE_ATTRIBUTE_ARCHIVE
  • HIDDEN 或 FILE_ATTRIBUTE_HIDDEN
  • OFFLINE 或 FILE_ATTRIBUTE_OFFLINE
  • READONLY 或 FILE_ATTRIBUTE_READONLY
  • SYSTEM 或 FILE_ATTRIBUTE_SYSTEM
  • TEMPORARY 或 FILE_ATTRIBUTE_TEMPORARY

如果文件的属性不能被设置则置一个错误的标记 (例如文件不存在，或者你没有足够的权限)。你只能进行属性设置，而不能移除属性，如果你想移除的话请使用 NORMAL。这样所有的属性都会被擦除，该命令不支持通配符。

4.9.3.13 RegDLL

DLL文件 [入口点名称]

载入指定的 DLL 并且调用 DllRegisterServer (或入口点名称，当指定之后)。当产生一个错误的时候会置一个错误标记 (例如不能载入 DLL，不能初始化 OLE，不能找到入口点，或者函数返回任何其它错误 ERROR_SUCCESS (=0))。

当某些要注册的 DLL 要依靠其它的位于同目录或 Windows 目录下的 DLL 时请用 SetOutPath 来设定当前目录。例如，如果 foo.dll 依靠位于 $INSTDIR 的 bar.dll 时用：

 SetOutPath $INSTDIR
 RegDLL $INSTDIR\foo.dll

4.9.3.14 UnRegDLL

DLL文件

载入指定的 DLL 并且调用 DllUnregisterServer。当产生一个错误的时候会置一个错误标记 (例如不能载入 DLL，不能初始化 OLE，不能找到入口点，或者函数返回任何其它错误 ERROR_SUCCESS (=0))。

4.9.4 流程控制指令

4.9.4.1 Abort

[用户信息]

取消安装，停止执行脚本，并且在状态显示里显示用户信息。注意：你可以用于回调函数来实现一些特殊功能。页面回调也可以用 Abort 来实现特殊目的。

Abort
Abort "不能安装"

4.9.4.2 Call

函数名 | :标记名 | 变量(输入)

调用 函数名 函数或调用 标记名 的标记，或者包含地址的一个变量。地址值可以由 GetCurrentAddress、GetFunctionAddress 或 GetLabelAddress 返回。当使用了 Return 指令后调用将返回。区段和函数可以自动结束于 Return 指令。卸载函数不能由安装区段或函数调用，反之亦然。

Function func
  Call :label
  DetailPrint "#1：这将只显示一次。"
label:
  DetailPrint "#2：这将在消息 #1 之前和之后显示。"
  Call :.global_label
FunctionEnd

Section
  Call func
  Return

.global_label:
  DetailPrint "#3：全局标签被调用。"
SectionEnd

4.9.4.3 ClearErrors

清除错误位标记。

ClearErrors
IfErrors 0 +2
  MessageBox MB_OK "这个消息框将始终不显示。"

4.9.4.4 GetCurrentAddress

用户变量(输出)

获取当前指令的地址 (GetCurrentAddress) 并且把它保存到用户输出变量。该用户变量可以传递到 Call 或 Goto。

Function func
  DetailPrint "函数"
  IntOp $0 $0 + 2
  Call $0
  DetailPrint "函数结束"
FunctionEnd

Section
  DetailPrint "区段"
  GetCurrentAddress $0
  Goto callFunc

  DetailPrint "返回区段"
  Return

callFunc:
  Call func
  DetailPrint "区段结束"
SectionEnd

4.9.4.5 GetFunctionAddress

用户变量(输出) 函数名

获取函数地址并且把它保存到用户输出变量。该用户变量可以传递到 Call 或 Goto。注意如果你 Goto 一个由 GetFunctionAddress 输出的地址，你的函数将不能返回 (当你 Goto 的函数要返回时，你应该立即返回)。

Function func
  DetailPrint "函数"
FunctionEnd

Section
  GetFunctionAddress $0 func
  Call $0
SectionEnd

4.9.4.6 GetLabelAddress

用户变量(输出) 标记

获取标记地址并且把它保存到用户输出变量。该用户变量可以传递到 Call 或 Goto。需要注意的是你可能仅能从你的函数里随标记调用该指令，但是你可以从任何地方调用它 (可能存在不稳定因素)。需要注意的是如果你调用 (Call) 了 GetLabelAddress 的输出，那么直到它返回时才会被执行 (明确或隐含在一个函数的结尾)，然后你将回到 Call 指令的状态。

label:
DetailPrint "标签"
GetLabelAddress $0 label
IntOp $0 $0 + 4
Goto $0
DetailPrint "完成"

4.9.4.7 Goto

要跳转的标记 | +偏移| -偏移| 用户变量(目标地址)

如果指定了标记，则跳转到“要跳转的标记:”。

如果指定了“+偏移”或“-偏移”，跳转会根据偏移指令相对的跳转。Goto +1 跳转到下一条指令，Goto -1 跳转到上一条指令，等等。

如果指定了用户变量，则跳转到绝对地址 (通常你可以从一个函数比如 GetLabelAddress 来取得该值)。编译器标记命令和 SectionIn 不是指令所以跳转对它们无效。

Goto label
Goto +2
Goto -2
Goto $0

4.9.4.8 IfAbort

退出时要跳转的标记 [不是退出时要跳转的标记]

如果调用退出时它将返回 true。这种情况可能发生在当一个文件不能创建 (或覆盖) 失败而用户选择退出时或者当用户手动退出时。该函数仅能在 instfiles 页面的离开函数里调用。

Page instfiles "" "" instfilesLeave

Function instfilesLeave
  IfAbort 0 +2
    MessageBox MB_OK "用户终止"
FunctionEnd

4.9.4.9 IfErrors

错误时跳转的标记 [没有错误时跳转的标记]

检测并清除错误标记，如果设了错误标记，则跳转到“错误时跳转的标记”，否则跳转到“没有错误时跳转的标记”。错误标记由其它指令在产生一个错误是设置的 (比如试图去删除一个正在使用的文件)。

ClearErrors
File file.dat
IfErrors 0 +2
  Call ErrorHandler

4.9.4.10 IfFileExists

要检测的文件 文件存在时跳转的标记 [文件不存在时跳转的标记]

检测“要检测的文件”是否存在 (可以用通配符，或目录)，并当文件存在时跳转到“文件存在时跳转”，否则跳转到“文件不存在时跳转”。如果你要检测目标是文件还是目录请使用 IfFileExists "目录\*.*"。

IfFileExists $WINDIR\notepad.exe 0 +2
  MessageBox MB_OK "记事本已安装"

4.9.4.11 IfRebootFlag

已设时跳转的标记 [未设时跳转的标记]

至少需要一个参数。检测重启标记，如果设置了重启标记则跳转到“已设时跳转”，否则跳转到“未设时跳转”。重启标记可以在 Delete 和 Rename，或手动设定的 SetRebootFlag 指令里设置。

IfRebootFlag 0 noreboot
  MessageBox MB_YESNO "需要重启以完成安装。你想现在重启吗？" IDNO noreboot
    Reboot
noreboot:

4.9.4.12 IfSilent

静默安装时跳转的标记 [非静默安装时跳转的标记]

至少需要一个参数。检测静默安装标记，如果安装程序是静默安装时跳转到“静默安装时跳转”，否则跳转到“非静默安装时跳转”。静默安装标记可以由 SilentInstall、SilentUninstall、SetSilent 和用户使用 /S 命令行启动来设置。

IfSilent +2
  ExecWait '"$INSTDIR\nonsilentprogram.exe"'

4.9.4.13 IntCmp

值1 值2 相等时跳转的标记 [值1小时跳转的标记] [值1大时跳转的标记]

比较两个整数“值1”和“值2”。如果值1和值2相等，则跳转到“相等时跳转的标记”，否则如果值1 < 值2，跳转到“值1小时跳转的标记”，否则如果值1 > 值2，跳转到“值1大时跳转的标记”。

IntCmp $0 5 is5 lessthan5 morethan5
is5:
  DetailPrint "$$0 == 5"
  Goto done
lessthan5:
  DetailPrint "$$0 < 5"
  Goto done
morethan5:
  DetailPrint "$$0 > 5"
  Goto done
done:

4.9.4.14 IntCmpU

值1 值2 相等时跳转的标记 [值1小时跳转的标记] [值1大时跳转的标记]

比较两个无符号整数“值1”和“值2”。如果值1和值2相等，则跳转到“相等时跳转的标记”，否则如果值1 < 值2，跳转到“值1小时跳转的标记”，否则如果值1 > 值2，跳转到“值1大时跳转的标记”。比较时作为无符号整数来比较。

4.9.4.15 MessageBox

消息框选项列表 消息框文本 [/SD 返回] [检测返回值 跳转到标记] [检测返回值2 跳转到标记2]

显示一个包含“消息框文本”的消息框。“消息框选项列表”必须为下面的一个或多个，多个使用 | 来隔开 (例如 MB_YESNO|MB_ICONSTOP)。

  • MB_OK - 显示 OK 按钮
  • MB_OKCANCEL - 显示 OK 和取消按钮
  • MB_ABORTRETRYIGNORE - 显示退出、重试、忽略按钮
  • MB_RETRYCANCEL - 显示重试和取消按钮
  • MB_YESNO - 显示是和否按钮
  • MB_YESNOCANCEL - 显示是、否、取消按钮
  • MB_ICONEXCLAMATION - 显示惊叹号图标
  • MB_ICONINFORMATION - 显示信息图标
  • MB_ICONQUESTION - 显示问号图标
  • MB_ICONSTOP - 显示终止图标
  • MB_TOPMOST - 使消息框在最前端显示
  • MB_SETFOREGROUND - 设置前景
  • MB_RIGHT - 右对齐文本
  • MB_RTLREADING - RTL 阅读次序
  • MB_DEFBUTTON1 - 默认为按钮 1
  • MB_DEFBUTTON2 - 默认为按钮 2
  • MB_DEFBUTTON3 - 默认为按钮 3
  • MB_DEFBUTTON4 - 默认为按钮 4

“检测返回值”可以为 0 (或空，或保留关闭)，或下列之一：

  • IDABORT - 退出按钮
  • IDCANCEL - 取消按钮
  • IDIGNORE - 忽略按钮
  • IDNO - 否按钮
  • IDOK - 确定按钮
  • IDRETRY - 重试按钮
  • IDYES - 是按钮

如果消息框的返回值为“检测返回值”，则安装程序执行跳转。

用 /SD 来指定一个上面列出的返回值当在安装程序静默安装时作为返回值。详细信息请查看 Section 4.12。

MessageBox MB_OK "简单消息框"
MessageBox MB_YESNO "真的吗？" IDYES true IDNO false
true:
  DetailPrint "是真的！"
  Goto next
false:
  DetailPrint "是假的"
next:
MessageBox MB_YESNO "真的吗？(静默安装时默认为是)" /SD IDYES IDNO false2
  DetailPrint "是真的 (或静默)！"
  Goto next2
false2:
  DetailPrint "是假的"
next2:

4.9.4.16 Return

从一个函数或区段返回。

Function func
  StrCmp $0 "立即返回" 0 +2
    Return
  # do stuff
FunctionEnd

Section
  Call func
  ;"Return" 将返回到这里
SectionEnd

4.9.4.17 Quit

使得安装程序立即退出。在调用 Quit 后，安装程序将退出 (且没有回调函数可以运行)。

4.9.4.18 SetErrors

设置错误标记。

SetErrors
IfErrors 0 +2
  MessageBox MB_OK "这个消息框将始终显示。"

4.9.4.19 StrCmp

字串1 字串2 相同时跳转的标记 [不相同时跳转的标记]

比较 (不区分大小写)“字串1”和“字串2”。如果两者相等，跳转到“相同时跳转的标记”，否则跳转到“不相同时跳转的标记”。

StrCmp $0 "字串" 0 +3
  DetailPrint '$$0 == "字串"'
  Goto +2
  DeteailPrint '$$0 != "字串"'

4.9.4.20 StrCmpS

字串1 字串2 相同时跳转的标记 [不相同时跳转的标记]

和 StrCmp 类似，不过区分大小写。

4.9.5 文件指令

4.9.5.1 FileClose

句柄

关闭一个由 FileOpen 打开的文件句柄。

4.9.5.2 FileOpen

用户变量(句柄输出) 文件名 打开模式

打开一个“文件名”的文件，并且把句柄设置为句柄输出变量。“打开模式” 为 r (只读)、w (写入，文件的所有内容将被清空) 或 a (附加，保持文件内容并附加写入) 其中之一。在所有的打开模式里，文件指针都置于文件起始位置。如果文件不能被打开，则句柄输出变量为空，并放置一个错误标记。

如果没有指定绝对路径则使用当前路径。当前路径由 SetOutPath 设置。如果之前没有使用 SetOutPath 则当前路径为 $EXEDIR。

FileOpen $0 $INSTDIR\file.dat r
FileClose $0

4.9.5.3 FileRead

句柄 用户变量(输出) [最大长度]

读取一个由 FileOpen 打开的文件的字串(ANSI 字符)。字符串读取到新行(或回车换行符)，或者空的宽字节字符，或者到最大字符串长度(如果已指定)。字串的最大长度被限定在1024字节之内。如果读取到了文件的结尾却没有有效的数据则输出字串被清空，并放置一个错误标记。

Unicode: 当DBCS文本支持，但转换输出被限制为UCS-2/ BMP，不支持编码代理对。系统默认的ANSI代码页（ACP）将在转换过程中使用。

ClearErrors
FileOpen $0 $INSTDIR\文件.dat r
IfErrors done
FileRead $0 $1
DetailPrint $1
FileClose $0
done:

4.9.5.4 FileReadUTF16LE

句柄 用户变量(输出) [最大长度]

此函数仅当构建 Unicode 安装程序时有效。

读取一个由 FileOpen 打开的文件的字符串 (UTF-16LE 字符)。字符串读取到新行 (或回车换行符)，或者空的宽字节字符，或者到最大字符串长度 (如果已指定)。默认情况字符串被限制在1024个字符 (可编译或下载更大 NSIS_MAX_STRLEN 的特殊构建版本)。如果读取到文件末尾且不再有有效数据，输出将为空，并设置错误标记。

ClearErrors
FileOpen $0 $INSTDIR\file.dat r
IfErrors done
FileReadUTF16LE $0 $1
DetailPrint $1
FileClose $0
done:

4.9.5.5 FileReadByte

句柄 用户变量(输出)

读取一个由 FileOpen 打开的文件的字节。读取的字节作为一个整数 (0-255) 保存在输出变量里。如果读取到文件末尾且不再有有效数据，输出将为空，并设置错误标记。

ClearErrors
FileOpen $0 $INSTDIR\文件.dat r
IfErrors done
FileReadByte $0 $1
FileReadByte $0 $2
DetailPrint "$1 $2"
FileClose $0
done:

4.9.5.6 FileReadWord

句柄 用户变量(输出)

此函数仅当构建 Unicode 安装程序时有效。

读取一个由 FileOpen 打开的文件的字符 (2字节)。字符以整数 (0-65535) 的方式保存在输出输出变量。如果读取到文件末尾且不再有有效数据，输出将为空，并设置错误标记。

ClearErrors
FileOpen $0 $INSTDIR\file.dat r
IfErrors done
FileReadWord $0 $1
FileReadWord $0 $2
DetailPrint "$1 $2"
FileClose $0
done:

4.9.5.7 FileSeek

句柄 偏移 [模式] [用户变量(新位置)]

定位一个由 FileOpen 打开的文件。如果“模式”忽略或指定为 SET，则文件指针定位到“偏移”。如果“模式”指定为 CUR，则文件指针向后移动 “偏移”。如果文件指定为 END，则指针定位到相对于文件结尾 EOF (End of file) 处。如果指定了最后一个参数“用户变量(新位置)”，则新文件位置将保存在该变量中。

ClearErrors
FileOpen $0 $INSTDIR\文件.dat r
IfErrors done
FileSeek $0 -5 END
FileRead $0 $1
DetailPrint $1
FileClose $0
done:

4.9.5.8 FileWrite

句柄 字串

写入一个字串到 FileOpen 打开的文件。如果写入时产生了错误，则置一个错误标记。

ClearErrors
FileOpen $0 $INSTDIR\文件.dat w
IfErrors done
FileWrite $0 "some text"
FileClose $0
done:

4.9.5.9 FileWriteByte

句柄 字符串

将解释为“字符串”的整数值写入到 FileOpen 打开的文件。当然你也可以直接输入整数值。下面的代码写入“回车符/换行符”到文件中。

FileWriteByte 文件句柄 "13" ;回车，相当于 $\r
FileWriteByte 文件句柄 "10" ;换行，相当于 $\n

如果写入时发生错误，将设置错误标记。注意：只使用整数的低位字节，例如写入256和写入0是一样的，等等。

4.9.5.10 FileWriteUTF16LE

句柄 字符串

此函数仅当构建 Unicode 安装程序时有效。

写入一个 Unicode (UTF-16LE) 字符串到 FileOpen 打开的文件。如果写入时发生错误，将设置错误标记。

ClearErrors
FileOpen $0 $INSTDIR\file.dat w
IfErrors done
FileWriteUTF16LE $0 "一些文字"
FileClose $0
done:

4.9.5.11 FileWriteWord

句柄 字符串

此函数仅当构建 Unicode 安装程序时有效。

将解释为“字符串”的整数值作为 WORD (2字节，范围：0-65535) 写入到 FileOpen 打开的文件。当然你也可以直接输入整数值。下面的代码写入“回车符/换行符”到文件中。

FileWriteWord 文件句柄 "13"
FileWriteWord 文件句柄 "10"

如果写入时发生错误，将设置错误标记。注意：只使用整数的低位字符，例如写入65536和写入0是一样的，等等。

4.9.5.12 FindClose

句柄

关闭一个由 FindFirst 打开的搜索。

4.9.5.13 FindFirst

用户变量(句柄输出) 用户变量(文件输出) 文件规范

对“文件规范”执行一个搜索，把第一个查找到的文件放置到“用户变量(文件输出)”。也可以把搜索的句柄放到“用户变量(句柄输出)”。如果未找到任何文件，则输出都被设为空，并且放置一个错误标记。比较好的用法是使用 FindNext 和 FindClose。需要注意的是“用户变量(文件输出)”不带有路径。

FindFirst $0 $1 $INSTDIR\*.txt
loop:
  StrCmp $1 "" done
  DetailPrint $1
  FindNext $0 $1
  Goto loop
done:

4.9.5.12 FindNext

句柄 用户变量(文件输出)

继续一个由 FindFirst 开始的搜索。句柄应该为 FindFirst 返回的值。如果搜索已完成(没有更多文件)，“用户变量(文件输出)” 将被设为空，并且置一个错误标记。需要注意的是“用户变量(文件输出)”不带有路径。

4.9.6 卸载程序指令

4.9.6.1 WriteUninstaller

[路径\]可执行文件名.exe

由指定的文件名(路径为可选项)写入卸载程序。仅在一个安装区段或函数里有效，并且你的脚本里必须有一个卸载区段。也可以参考卸载配置。你可以调用一次或多次来写入一个或多个卸载程序(副本)。

WriteUninstaller $INSTDIR\uninstaller.exe

4.9.7 混合指令

4.9.7.1 GetErrorLevel

变量(错误级别输出)

返回由 SetErrorLevel 设置的最后错误级别或者没有使用过时返回 -1。

GetErrorLevel $0
IntOp $0 $0 + 1
SetErrorLevel $0

4.9.7.2 GetInstDirError

用户变量(错误输出)

用于目录选择页面的离开函数。读取标记设置看 DirVerify leave 是否已使用。可能的值：

0：无错误

1：无效的安装目录

2：目标驱动器没有足够的空间

!include LogicLib.nsh
PageEx directory
  DirVerify leave
  PageCallbacks "" "" dirLeave
PageExEnd

Function dirLeave
  GetInstDirError $0
  ${Switch} $0
    ${Case} 0
      MessageBox MB_OK "安装文件夹有效。"
      ${Break}
    ${Case} 1
      MessageBox MB_OK "安装文件夹无效！"
      Abort
      ${Break}
    ${Case} 2
      MessageBox MB_OK "可用空间不足！"
      Abort
      ${Break}
  ${EndSwitch}
FunctionEnd

4.9.7.3 InitPluginsDir

初始化插件目录 ($PLUGINSDIR) 当之前没有初始化时，可以多次使用。

InitPluginsDir
File /oname=$PLUGINSDIR\image.bmp image.bmp

4.9.7.4 Nop

什么也不做

4.9.7.5 SetErrorLevel

错误级别

把安装程序或卸载程序的错误级别设为错误级别。更多信息请查看错误级别。

IfRebootFlag 0 +2
  SetErrorLevel 4

4.9.7.6 SetRegView

32|64|lastused

设置由注册表操作命令影响的注册表方式。在 Windows x64 上有两种方式。一个用于32位应用程序另一个用于x64应用程序。默认在 WOW64 情况下，运行在 x86 系统上的32位应用程序只能在32位方式下访问注册表。使用 SetRegView 64 可以让安装程序在64位方式下访问注册表键。

影响 DeleteRegKey、DeleteRegValue、EnumRegKey、EnumRegValue、ReadRegDWORD、ReadRegStr、WriteRegBin、WriteRegDWORD、WriteRegStr 和 WriteRegExpandStr。

不影响 InstallDirRegKey。可改为在 .onInit 函数中使用 ReadRegStr 读取注册表。

SetRegView 32
ReadRegStr $0 HKLM Software\Microsoft\Windows\CurrentVersion ProgramFilesDir
DetailPrint $0 # 输出 C:\Program Files (x86)
SetRegView 64
ReadRegStr $0 HKLM Software\Microsoft\Windows\CurrentVersion ProgramFilesDir
DetailPrint $0 # 输出 C:\Program Files

Function .onInit
  SetRegView 64
  ReadRegStr $INSTDIR HKLM Software\NSIS ""
  SetRegView 32
FunctionEnd

4.9.7.7 SetShellVarContext

current|all

设置 $SMPROGRAMS 的内容或其他命令解释程序目录。如果设为 current (默认值)，则使用当前用户的命令解释程序目录。如果设为 all，则使用所有用户的命令解释程序目录。所有用户目录可能不能被所有的操作系统支持。如果所有用户的目录找不到则使用当前用户代替。请考虑一个普通用户或游客是否有正确的权限在所有用户目录里操作。仅仅管理员才有完全的权限访问所有用户目录。你可以用 UserInfo 来查看用户身份。详细信息请查看 Contrib\UserInfo\UserInfo.nsi 例子。

注意事项：如果该指令用于安装程序，那么它只对安装程序有效，而如果它用于卸载程序，那么它仅对卸载程序有效，如果要两者都有效，你必须在安装程序和卸载程序里都使用。

SetShellVarContext current
StrCpy $0 $DESKTOP
SetShellVarContext all
StrCpy $1 $DESKTOP
MessageBox MB_OK $0$\n$1

4.9.7.8 Sleep

休眠时间(单位为毫秒)

在安装程序里暂停执行“休眠时间(单位为毫秒)”时间。“休眠时间(单位为毫秒)”可以是一个变量，例如 $0 或一个数字，比如 666。

DetailPrint "正在休眠..."
Sleep 3000
DetailPrint "返回继续运行"

4.9.8 字串操作指令

4.9.8.1 StrCpy

用户变量(目标) 字串 [最大长度] [起始偏移]

字串复制指令。注意“字串”可以包含另一个变量，或该用户变量会被设置 (可以用来连接字串等等)。如果指定了“最大长度” 则限定了要复制字串的最大长度 (如果“最大长度”是负数，则会从字串尾部截去“最大长度”的绝对值个字符)。如果指定了起始偏移，则字串偏移到该处作为起始 (如果“起始偏移”是负数，则会从尾部开始偏移)。

StrCpy $0 "a string"         ;$0 = "a string"
StrCpy $0 "a string" 3       ;$0 = "a s"
StrCpy $0 "a string" -1      ;$0 = "a strin"
StrCpy $0 "a string" "" 2    ;$0 = "string"
StrCpy $0 "a string" "" -3   ;$0 = "ing"
StrCpy $0 "a string" 3 -4    ;$0 = "rin"
;连接字串
StrCpy $0 "字串1"
StrCpy $0 "$0 + 字串2"       ;$0 = "字串1 + 字串2"

4.9.8.2 StrLen

用户变量(长度输出) 字串

获取字串的长度。

StrLen $0 "123456"            ;$0 = 6

4.9.9 堆栈支持

4.9.9.1 Exch

[用户变量 | 堆栈索引]

当不指定参数时，交换堆栈顶部的两个单元。当指定了一个参数并且是一个用户变量时，交换堆栈顶部的单元和该变量的值。当指定了一个参数并且是正整数时，Exch 将会交换堆栈顶部单元和根据参数从堆栈顶部偏移到指定单元的值。如果堆栈里没有足够的单元来完成交换时，会产生一个致命的错误 (来帮助你调试你的代码)。

Push 1
Push 2
Exch
Pop $0 # = 1

Push 1
Push 2
Push 3
Exch 2
Pop $0 # = 1

StrCpy $0 1
Push 2
Exch $0 # = 2
Pop $1 # = 1

4.9.9.2 Pop

用户变量(输出)

从堆栈里弹出一个字串到用户变量 $x。如果堆栈是空的，则会置一个错误标记。

Push 1
Pop $0 # = 1

4.9.9.3 Push

字串

把一个字串压入堆栈。该字串可随后从堆栈里弹出。

Push "a string"

4.9.10 整数支持

4.9.10.1 IntFmt

用户变量(输出) 格式 数字字串

用“格式”格式格式化“数字字串”中的数字，并把输出设为用户变量 $x。例如格式化字串包含 "%08X" "%u"。
这个指令其实就是 C++ 里的 wsprintf 函数，常用的格式为 %x - 十六进制数 (小写)、%X - 十六进制数 (大写) 、%d - 十进制数、%u - 无符号整数、%c 单个字符。

IntFmt $0 "0x%08X" 195948557
IntFmt $0 "%c" 0x41

4.9.10.2 IntOp

用户变量(输出) 值1 操作 [值2]

数字运算。操作定义为下列之一：

  • + —— “值1”加“值2”
  • - —— “值1”减“值2”
  • * —— “值1”乘“值2”
  • / —— “值1”除“值2”
  • % —— 由“值2”取“值1”的模
  • | —— “值1”和“值2”二进制“或”
  • & —— “值1”和“值2”二进制“与”
  • ^ —— “值1”和“值2”二进制“异或”
  • >> —— “值1”按位右移“值2”个位
  • << —— “值1”按位左移“值2”个位
  • ~ —— ~ 按位取反“值1” (例如 7 变为 4294967288)
  • ! —— 逻辑取反“值1” (例如 7 变为 0)
  • || —— “值1”和“值2”逻辑“或”
  • && —— “值1”和“值2”逻辑“与”
IntOp $0 1 + 1
IntOp $0 $0 + 1
IntOp $0 $0 << 2
IntOp $0 $0 ~
IntOp $0 $0 & 0xF

4.9.11 重启指令

4.9.11.1 Reboot

重启电脑。请小心使用该指令。如果失败，则 .onRebootFailed 函数会被调用。无论如何该指令都不会返回，就像 Quit。

MessageBox MB_YESNO|MB_ICONQUESTION "你希望重启系统吗？" IDNO +2
  Reboot

4.9.11.2 SetRebootFlag

true|false

设置重启标记为 true 或 false。该标记值可以由 IfRebootFlag 读取并作判断。

SetRebootFlag true
IfRebootFlag 0 +2
  MessageBox MB_OK "这个消息框将始终显示。"

4.9.12 安装记录指令

4.9.12.1 LogSet

on|off

设置安装记录到 $INSTDIR\install.log。在你调用该函数之前 $INSTDIR 必须有一个值否则该指令将无效。需要注意的是在编译的时候编译配置文件 (config.h) 必须设置 NSIS_CONFIG_LOG (默认未设置) 来支持该指令。关于重新编译 NSIS 的详细信息请查看构建 NSIS。

4.9.12.2 LogText

文本

如果启用了安装程序记录，插入“文本”文本到记录文件。

IfFileExists $WINDIR\notepad.exe 0 +2
  LogText "$$WINDIR\notepad.exe exists"

4.9.13 区段管理

4.9.13.1 SectionSetFlags

区段索引 区段标记

设置区段标记。标记为 32 位整数。第一位 (低位) 代表该区段当前是否选中，第二位代表该区段是否是一个区段组 (请不要修改这里除非你真的很了解)，第三位代表该区段是否是一个区段组的结尾 (同样，请不要修改)，第四位代表该区段文字是否描黑显示，第五位代表该区段是否是只读，第六位代表区段组是否自动展开，第七位代表区段组是部分选定的，第八位是部分选定区段组切换内部使用，第九位是用来反映区段名称更改。如果指定了超出范围的区段则会放置一个错误的标记。

应用的一个例子请看 one-section.nsi。

对于常用的宏和定义，查看 Include\Sections.nsh。

4.9.13.2 SectionGetFlags

区段索引 用户变量(输出)

获取该区段的标记。标记的描述请看上面。如果指定了超出范围的区段则会放置一个错误的标记。

4.9.13.3 SectionSetText

区段索引 区段文本

设置“区段索引”区段的描述。如果文本设为 "" 则该区段将会隐藏。如果指定了超出范围的区段则会置一个错误的标记。

4.9.13.4 SectionGetText

区段索引 区段文本

把“区段索引”区段的描述保存在输出变量。如果区段为隐藏，则保存的变量为空。如果指定了超出范围的区段则会置一个错误的标记。

4.9.13.5 SectionSetInstTypes

区段索引 安装类型

设置区段在安装类型中的默认启用状态。需要注意的是区段索引从零开始。“安装类型” 的每一位都是一个告诉该区段是否属于这个安装类型的标记。例如，如果你有 3 个安装类型并且你希望第一个区段包含在类型 1 和 3，则命令如下：

SectionSetInstTypes 0 5

因为 5 的二进制值为 00000101。如果指定了超出范围的区段则会放置一个错误的标记。

4.9.13.6 SectionGetInstTypes

区段索引 用户变量(输出)

获取一个区段的安装类型标记。如何处理输出的描述请看上面的关于 SectionSetInstTypes 的解释。如果指定了超出范围的区段则会放置一个错误的标记。

4.9.13.7 SectionSetSize

区段索引 新大小

设置某个区段的大小。需要注意的是索引从零开始。容量的单位为 KB 且仅支持整数。

4.9.13.8 SectionGetSize

区段索引 用户变量

获取区段的大小并把值保存在指定的用户变量里。需要注意的是索引从零开始。

4.9.13.9 SetCurInstType

安装类型索引

设置当前安装类型。“安装类型索引”介于 0 到 31 之间。如果使用了一个超出范围的安装类型不会放置一个错误标记。

4.9.13.10 GetCurInstType

用户变量

获取当前的安装类型并保存到变量里。如果选择了第一个类型，则变量值为 0，如果选择了第二个类型，则变量值为 1，依次类推。${NSIS_MAX_INST_TYPES} (默认为 32) 的值则意味着选择了自定义安装类型。

4.9.13.11 InstTypeSetText

安装类型索引 文本

设置指定的安装类型的文本。如果设置的文本为空则移除该安装类型。通过使用一个以前未使用的 “安装类型索引” 序号你可以创建一个新的安装类型。要在新的安装类型里添加、删除区段请看 SectionSetInstTypes。与 SectionIn 不同的是该索引从零开始，这意味着第一个安装类型索引为 0。

4.9.13.12 InstTypeGetText

安装类型索引 用户变量

获取指定的安装类型的文本。

4.9.14 用户界面指令

4.9.14.1 BringToFront

使安装程序窗口可见并把它带到其它窗口的最前端。如果一个应用程序已经执行且显示在安装程序的前面，BringToFront 将把安装程序带回到焦点。

近期的 Windows 版本限制了前景窗口的设置。如果在安装的时候用户正在运行其他的应用程序，也许会通知该用户使用一种不同的方式。

4.9.14.2 CreateFont

用户变量(句柄输出) 字体名 [高] [宽] [/ITALIC] [/UNDERLINE] [/STRIKE]

创建一个字体并把句柄保存在用户变量里。关于不同参数的更多信息请看 MSDN 关于 Win32 API 函数 CreateFont()。

你可以通过 ^Font 和 ^FontSize LangString 来获取当前使用的字体。

!include WinMessages.nsh
GetDlgItem $$0 $HWNDPARENT 1
CreateFont $1 "Times New Roman" "7" "700" /UNDERLINE
SendMessage $0 ${WM_SETFONT} $1 1

4.9.14.3 DetailPrint

信息

添加“信息”字串到安装程序的安装信息查看窗口。

DeteailPrint "这个消息将显示在安装窗口"

4.9.14.4 EnableWindow

窗口句柄(HWND) (1|0)

对指定的窗口或控件允许或禁止鼠标和键盘输入。可用的状态为 0 (禁止) 或 1 (允许)。

GetDlgItem $0 $HWNDPARENT 1
EnableWindow $0 0
Sleep 1000
EnableWindow $0 1

4.9.14.5 FindWindow

用户变量(窗口句柄输出) 窗口类名 [窗口标题] [父窗口句柄] [子窗口句柄]

查找一个窗口。类似于 Win32 FindWindowEx()。由窗口类名来查找 (和/或窗口标题，如果指定的话)。如果指定了“父窗口句柄”或“子窗口句柄”，则查找会受到限制。如果窗口类名或窗口标题指定为 ""，则它们将不能用于查找。如果窗口未找到，用户变量将返回 0 值。要实现旧式 FindWindow 行为，请和 SendMessage 一起使用。

FindWindow $0 "#32770" "" $HWNDPARENT
FIndWindow $0 "我的窗口类" "我的窗口标题"

4.9.14.6 GetDlgItem

用户变量(输出) 窗口句柄 控件ID

在指定的对话框上根据控件 ID 获得控件句柄。如果你想获得安装程序内部的控件句柄，请先使用 FindWindow 用户变量(窗口句柄输出) "#32770" "" $HWNDPARENT 来获取窗口句柄。

GetDlgItem $0 $HWNDPARENT 1 # 下一步、安装按钮

4.9.14.7 HideWindow

隐藏安装程序。

4.9.14.8 IsWindow

窗口句柄 是窗口时跳转的标记 [不是窗口时跳转的标记]

如果“窗口句柄”是一个窗口，则跳转到“是窗口时跳转的标记”，否则跳转到“不是窗口时跳转的标记”(如果指定了的话)。

GetDlgItem $0 $HWNDPARENT 1
IsWindow 0 +3
  MessageBox MB_OK "找到窗口"
  Goto +2
  MessageBox MB_OK "无窗口"

4.9.14.9 LockWindow

on|off

LockWindow on 会阻止主窗口在更改或更新时自动重绘。使用了 LockWindow off 之后使得应用了 LockWindow on 的窗口的所有控件可以自动重绘。这可以有效的避免页面的闪烁，因为现在是一组控件同时重绘而不是一个控件一个控件的重绘。个别的控件在老的电脑上也会闪烁。如果你在区段里使用了循环，你也可以用来阻止进度条来回闪动。

4.9.14.10 SendMessage

窗口句柄 消息 第一个消息参数 第二个消息参数 [用户变量(返回值)] [/TIMEOUT=毫秒]

发送消息到“窗口句柄”。如果指定了一个用户变量 $x 作为最后一个参数 (或在 /TIMEOUT 之前的最后一个参数)，SendMessage 的返回值将保存在该变量里。需要注意的是当指定“消息”时你只能用消息的整数值。如果你需要发送字串请使用“STR:字串”作为“第一个消息参数”或“第二个消息参数”。

  • WM_CLOSE 16
  • WM_COMMAND 273
  • WM_USER 1024

包含 WinMessages.nsh 来获得所有 Windows 消息定义。

要发送一个字串参数的话，在参数前面加入 STR:，例如："STR:一些字串" 。

使用“/TIMEOUT=毫秒”来指定持续时间，单位为毫秒。

!include WinMessages.nsh
FindWindow $0 "Winamp v1.x"
SendMessage $0 ${WM_CLOSE} 0 0

4.9.14.11 SetAutoClose

true|false

取代默认的窗口自动关闭标记 (由 AutoCloseWindow 指定，且对于卸载程序为 false)。指定 true 将使得安装程序在安装完成时立即关闭窗口，或者 false 来使它需要手动关闭。

4.9.14.12 SetBrandingImage

[/IMGID=对话里的ID项] [/RESIZETOFIT] 位图.bmp

把当前位图作为标志图像显示。如果没有指定 IMGID 则使用第一个找到的图像控件，或由 AddBrandingImage 建立的图像控件。需要注意的是位图必须预先存在于当前用户的机器上。可以先使用 File 指令把它释放。如果指定了 /RESIZETOFIT 则图像会自动改变尺寸到图像控件的大小。如果你使用了 AddBrandingImage 你可以得到它的大小，通过编译你的脚本并察看 AddBrandingImage 的输出，它会告诉你控件的大小。SetBrandingImage 在 .onInit 或 .onInit 调用的函数里无效。

4.9.14.13 SetDetailsView

show|hide

显示或隐藏详细信息，取决于你使用什么样的参数。它可以覆盖默认的由 ShowInstDetails 设定的详细信息察看属性。

4.9.14.14 SetDetailsPrint

none|listonly|textonly|both|lastused

为命令输出的状态信息设置一个显示模式。None 为不输出，listonly 仅在列表框显示，textonly 仅在状态条显示，both 则两者都显示 (默认)。对于释放很多小的文件，推荐使用 textonly (特别在 Win9X 下启用了平滑卷动)。

SetDetailsPrint none
File "secret file.dat"
SetDetailsPrint both

4.9.14.15 SetCtlColors

句柄 [/BRANDING] [文本颜色] [transparent|背景颜色]

对一个静态控件、编辑控件、按钮或一个对话框设置一个背景颜色和文本颜色。文本颜色 和 背景颜色 不能使用变量。使用 GetDlgItem 来获取控件的句柄。如果要使得控件透明你可以指定 transparent 作为背景颜色值。你也可以指定 /BRANDING 并带或不带文本颜色和背景颜色来使得控件完全灰白 (或其他你选择的颜色)。在 MUI 里用来显示标志牌。

FindWindow $0 "#32770" "" $HWNDPARENT
GetDlgItem $0 $0 1006
SetCtlColors $0 0xFF0000 0x00FF00

4.9.14.16 SetSilent

silent | normal

设置安装程序为静默模式或普通模式。关于静默安装的详细信息请看 SilentInstall。仅能在 .onInit 里使用。

4.9.14.17 ShowWindow

窗口句柄 显示状态

设置一个窗口的显示程度。可用的显示状态和 Windows 的 ShowWindow 函数相同。SW_* 常量定义于 Include\WinMessages.nsh。

!include WinMessages.nsh
GetDlgItem $0 $HWNDPARENT 1
ShowWindow $0 ${SW_HIDE}
Sleep 1000
ShowWindow $0 ${SW_SHOW}

4.9.15 多语言指令

4.9.15.1 LoadLanguageFile

语言文件.nlf

给一个语言表的结构载入一个语言文件。所有的语言文件在 Contrib\Language Files

在你插入一个语言文件后 ${LANG_langfile} 将会被定义为语言 ID (例如：${LANG_ENGLISH} 将会被定义为 1033)。你可以把它用于 LangString、LicenseLangString、LangDLL 和 VIAddVersionKey。

4.9.15.2 LangString

名称 语言ID 字串

定义一个使用多种语言的字串。这意味着它的值将不同于每个语言。这允许你容易的使你的安装程序多语言化为不需要再脚本里使用大量的开关语句。

每一个语言字串都有一个特定的名字和一个用于安装程序的分配给每一个语言的值。他们可以在脚本里用于任何运行时字串。要使用一个语言字串你所需要做的就是把 $(LangString_名称) 插入到你想插入字串的地方。

注意：

  • 不像定义使用花括号 - {} 一样，语言字串使用圆括号 - ()。
  • 如果你想在 .onInit 函数里更改语言，需要注意的是在 .onInit 里的语言字串将仍旧使用基于用户的默认 Windows 语言检测到的语言，因为语言的初始化在 .onInit 之后。
  • 总是在你的脚本里为所有语言设置语言字串。.
  • 如果你把语言 ID 设为 0 则使用 LangString 或 LoadLanguageFile 最后使用的语言。

使用的例子:

 LangString message ${LANG_ENGLISH} "英语信息"
 LangString message ${LANG_SIMPCHINESE} "简体中文信息"
 LangString message ${LANG_TRADCHINESE} "繁体中文信息"

 MessageBox MB_OK "已翻译的信息：$(message)"

4.9.15.3 LicenseLangString

名称 语言ID 许可文件路径

用法和 LangString 一样，但它仅从一个文本、RTF 文件载入字串并且定义一个特别的仅能用于 LicenseData 的 LangString。

LicenseLangString license ${LANG_ENGLISH} license-english.txt
LicenseLangString license ${LANG_SIMPCHINESE} license-simpchinese.txt
LicenseLangString license ${LANG_TRADCHINESE} license-tradchinese.txt

LicenseData $(license)


多语言

4.10 多语言

作为 2.x 版本的 NSIS 已经完全支持了多语言。一个安装程序的界面可以支持多语言。

对所有的语言使用 LoadLanguageFile 来载入默认的界面文本和语言属性。

默认的界面文本可以很容易的使用指令比如 ComponentText 等来更改。

你也可以在你自己的字串里使用标准语言字串的内容 (例如，$(^Name) 包含了 Name 指令设置的安装程序名称)。所有标准语言字串的名称作为注释列表于语言文件字串的上方。语言文件在 Contrib\Language Files。

要建立你自己的语言字串，请使用 LangString。

使用多语言的一个安装程序例子，请看 languages.nsi。

4.10.1 语言的选择

当安装程序启动时按如下步骤选择界面语言：

  1. 获取用户的默认 Windows 语言
  2. 查找一个最佳匹配的语言
  3. 如果没有最佳匹配的，则查找第一个匹配的语言
  4. 如果没有匹配的，使用脚本里定义的第一个语言 (确认你的第一个语言是一个通用的语言，比如英语)
  5. 如果语言变量 $LANGUAGE 在 .onInit 被更改，NSIS 将重新进行步骤 2 到 4。

4.10.2 LangDLL 插件

LangDLL 插件允许用户为安装程序选择语言。只需要把语言 ID (${LANG_langfile}) 和它在所有语言中的名称压入堆栈，然后再压入语言的数量，窗口标题，要提示用户选择语言的文本，调用插件的 LangDialog 函数，弹出返回值到 $LANGUAGE，然后你便可以继续。如果用户点击了取消按钮，则返回值就是 cancel。

使用多语言的一个安装程序例子，请看 languages.nsi。

4.10.3 RTL 语言

RTL 语言是从右至左书写的语言 (如 Arabic和 Hebrew)。NSIS 完整支持 RTL 语言。在语言文件里有一个地方来指定该语言是否 RTL 语言。要在运行时检测当前是否 RTL 语言只需要检测 $(^RTL) 语言字串的值。如果语言是 RTL 则为 1，否则为 0。这在使用插件来创建对话时非常有用，他们通常都有 RTL 设置。


插件 DLL

4.11 插件 DLL

NSIS 脚本语言允许你通过一个 DLL 文件的函数扩展它的能力。可能最好的例子就是在每个 NSIS 发布的版本里附带的 InstallOptions.dll。

当 NSIS 编译器开始时它会扫描插件目录的 DLL 并且列出找到的插件和输出的函数。在编译时如果遇到有序的冒号如 fred::flintstone 编译器将会作为关键字在该列表中查找。如果列表项列入了 fred.dll 并输出 flintstone 则 NSIS 将会把 fred.dll 文件打包到安装程序里。

当插件命令执行时 NSIS 将会解压所需的插件 DLL 文件到一个临时目录 ($PLUGINSDIR)，把指定的参数全部压入 (从右到左次序)，然后执行 DLL 函数。如果指定了 /NOUNLOAD 选项则插件将不会卸载直到安装程序退出或下一次你使用该插件并不带 /NOUNLOAD 参数。需要注意的是最后一次调用该插件的时候必须不能有 /NOUNLOAD 否则插件将不能从 $PLUGINSDIR 里删除，而导致垃圾文件留在用户的机器里。

4.11.1 使用插件命令

一般插件的调用像下面这样：

InstallOptions::dialog "INI文件.ini"

所有的参数都压入堆栈 (在这个例子，该插件函数仅需要一个参数)。还有一些插件不需要在堆栈里有任何参数，而其他的有可能需要几个或更多。要使用插件命令你首先需要阅读插件附带的文档以了解该插件函数需要什么样的参数。

4.11.2 禁止插件卸载

如果你不希望在调用函数后就卸载该 DLL，你可以使用 /NOUNLOAD 作为第一个参数。例如：

dll::function /NOUNLOAD "参数"

你也可以使用 SetPluginUnload alwaysoff 来避免每次使用相同插件都要写 /NOUNLOAD。

4.11.3 手动调用插件

如果你想调用一个用户硬盘或其他地方里的插件，你可以使用 CallInstDLL。几乎所有插件都提供了安装程序的泛函数，所以使用插件命令是一个简易的方法。使用 CallInstDLL 对于你创建了插件并包含在你的应用程序里并被复制到安装目录里的情况来说非常有用。


静默安装、卸载

4.12 静默安装、卸载

静默安装在安装过程中不需要用户参与而且不显示用户界面。用户不会看到任何对话且不会被询问任何问题。这对于网络管理员希望不需要用户参与的安装或卸载一些程序，这样可以快速的对多台电脑执行操作。对于其他的开发者来说，把其他的安装程序整合到自己的安装程序并且把所有需要的信息收集到自己的安装程序而不是显示两个安装程序时非常有用的。

NSIS 安装程序和卸载程序都可以静默或非静默。当一个安装程序或卸载程序静默时，不是所有的回调函数都被调用。.onGUIInit 和 .onGUIEnd 它们对应的卸载程序函数和任何涉及到特殊页面或页面类型的回调将不会被调用。

有几种方法来使得安装或卸载程序静默：

  1. SilentInstall 和 SilentUninstall
  2. SetSilent
  3. 在程序命令行里加 /S 参数(区分大小写)

要判断安装、卸载程序是否静默请使用 IfSilent。

首先你需要确认你的安装程序是否真的需要静默模式，在每一个需要用户参与的命令或创建一个窗口命令之前你应该使用 IfSilent 来判断。MessageBox 命令是在静默安装程序最常犯的，应该使用 /SD 开关来为静默安装程序指定一个默认的回答。如果你希望你的安装程序可以完全的静默你就应该使用这个开关。使所有内部的 NSIS 信息对话框都有一个静默安装的默认值。silent.nsi 实例演示了这个主题的所有方面问题。

因为安装目录选择页面在静默安装的时候不会显示，所以用户可以添加一个命令行选项来指定安装程序安装目录 (也可以在非静默安装、卸载程序里使用)。用户只需要使用 /D 开关，像下面这样的例子：

foo.exe /S /D=C:\Program Files\Foo

如果你的安装程序在静默模式时需要更多的信息，你可以让你的用户在命令行里指定并在 .onInit 函数里进行处理，比如：

Function .onInit
  Call GetParameters
  Pop $2
  # 查找引号 /USERNAME
  StrCpy $1 '"'
  Push $2
  Push '"/USERNAME='
  Call StrStr
  Pop $0
  StrCpy $0 $0 "" 1 # skip quote
  StrCmp $0 "" "" next
    # 查找非引号 /USERNAME
    StrCpy $1 ' '
    Push $2
    Push '/USERNAME='
    Call StrStr
    Pop $0
next:
  StrCmp $0 "" done
    # 复制 /USERNAME= 后面的值
    StrCpy $0 $0 "" 10
  # 查找下一个参数
  Push $0
  Push $1
  Call StrStr
  Pop $1
  StrCmp $1 "" done
  StrLen $1 $1
  StrCpy $0 $0 -$1
done:
FunctionEnd

上面的例子将会把 /USERNAME= 后面的值复制到 $0。这样可以让用户在命令行指定必须的参数信息而不需要用户参与的用户界面。用户可以使用：

foo.exe /S /USERNAME=Bar /D=C:\Program Files\Foo

或：

foo.exe /S "/USERNAME=字串" /D=C:\Program Files\Foo

GetParameters 和 StrStr 可以在附录 C 里找到。

如果你的安装程序、卸载程序需要大量的信息并且你希望能静默安装，你就应该让用户间建立一个应答文件，把需要的信息都写在里面。这样比把所有的信息都写到命令行里更好一些。


条件编译命令

第五章：编译时命令

  • 编译器工具命令
    • !include
    • !addincludedir
    • !addplugindir
    • !appendfile
    • !cd
    • !delfile
    • !echo
    • !error
    • !execute
    • !packhdr
    • !system
    • !tempfile
    • !warning
    • !verbose
  • 预定义
    • ${__FILE__}
    • ${__LINE__}
    • ${__DATE__}
    • ${__TIME__}
    • ${__TIMESTAMP__}
    • ${NSIS_VERSION}
    • 范围预定义
      • ${__GLOBAL__}
      • ${__SECTION__}
      • ${__FUNCTION__}
      • ${__PAGEEX__}
      • ${__UNINSTALL__}
  • 读取环境变量
    • $%envVarName%
  • 条件编译
    • !define
    • !undef
    • !ifdef
    • !ifndef
    • !if
    • !ifmacrodef
    • !ifmacrondef
    • !else
    • !endif
    • !insertmacro
    • !macro
    • !macroend
    • !searchparse
    • !searchreplace


编译器实用命令

5.1 编译器命令

这些命令在用途和功能性方面与 C 预处理器很相似。它们都允许文件内含，条件编译，可执行的头部封包，以及在构建进程期间处理执行。注意：这些命令都不允许使用变量。

5.1.1 !include

[/NONFATAL] 文件

这个命令可以将一个文件包含到脚本中，就像是脚本的一部分一样。请注意，如果一个文件包含在了另一个目录中，那么当前目录仍是编译脚本的地方 (不是要包含的文件所在的目录)。如果编译器无法找到文件，那么它将会在每一个包含目录中查找。若要得到更多信息，请查看 !addincludedir。如果使用了 /nonfatal 开关的话当要包含的文件未找到的时候用警告来代替错误。

!include WinMessages.nsh
!include Library.nsh
!include MyConfig.nsh
!include ..\MyConfig.nsh
!include /NONFATAL 可能存在也可能不存在的文件.nsh

5.1.2 !addincludedir

目录

向包含目录列表中添加另一个包含目录。当使用 !include 时，将会按这个列表搜索。这个列表的初始值只有 ${NSISDIR}\Include。

!addincludedir ..\include
!include something.nsh

5.1.3 !addplugindir

目录

NSIS 编译器用于搜索插件 DLL 的目录。

!addplugindir myplugin
MyPlugin::SomeFunction

5.1.4 !appendfile

文件 文本

把“文本”附加到“文件”里。

!tempfile FILE
!appendfile "${FILE}" "XPStyle on$\n"
!appendfile "${FILE}" "Name 'test'$\n"
!include "${FILE}"
!delfile "${FILE}"
!undef FILE

5.1.5 !cd

新路径

这个命令将会令编译器更改为一个新路径——“新路径”。新路径可以为相对路径或绝对路径。

!cd ..\more-scripts\new

5.1.6 !delfile

文件

删除一个文件。

!tempfile FILE
!delfile "${FILE}"
!undef FILE

5.1.7 !echo

信息

这个命令将会回显一条用户编译脚本的消息。

!echo "hello world"

5.1.8 !error

[信息]

这个命令将会发布一个脚本编译器的错误，并停止执行脚本。你也可以向这个错误添加一条消息。

!ifdef VERSION & NOVERSION
  !error "不能同时定义 VERSION 和 NOVERSION"
!endif

5.1.9 !execute

命令

这个指令将调用 CreateProcess() 来执行一个命令。和 !system 不一样，它不使用命令行处理程序，所以输如输出都被重定向并且命令行里的 cd、dir、type 等命令都不能使用。!execute 同时也不接受执行命令的返回值。目前 !execute 对于 !system 的好处就是当当前工作路径为 UNC 的时候不会引起问题。

在 POSIX 平台，!execute 使用 system() 就和 !system 一样。

!execute '"%WINDIR%\notepad.exe" "${NSISDIR}\license.txt"'

5.1.10 !packhdr

临时文件 命令

这个选项可以让编译器使用 EXE 加壳软件 (例如 Petite 或 UPX) 压缩可执行文件。请先指定一个临时文件名 (例如 "temp.dat") 以及命令行 (例如 "C:\Program Files\upx\upx -9 temp.dat") 压缩文件。

!packhdr "$%TEMP%\exehead.tmp" '"C:\Program Files\UPX\upx.exe" "$%TEMP%\exehead.tmp"'

5.1.11 !system

命令 [比较运算符 比较值]

这个命令将会通过调用 system() 来执行，并且如果比较过“比较值”以后的返回值为 false，那么编译将会被终止。“比较运算符”可以为 <、>、<> 或 =。

!system '"%WINDIR%\notepad.exe" "${NSISDIR}\license.txt"'
!system 'echo !define something > newinclude.nsh'
!include newinclude.nsh
!ifdef something
  !echo "something 已定义！"
!endif
;仅当 VPatch 返回 0(表示成功) 时继续，否则停止编译。
!system '""${NSISDIR}\Contrib\VPatch\GenPat.exe" "C:\old-file.exe" "C:\new-file.exe" "C:\patch.pat""' = 0

5.1.12 !tempfile

符号

创建一个临时文件，路径会被添加到定义列表里，名称为“符号”。

!tempfile PACKHDRTEMP
!packhdr "${PACKHDRTEMP}" '"C:\Program Files\UPX\upx.exe" "${PACKHDRTEMP}"'

!tempfile FILE
!define /date DATE "%H:%M:%S %d %b, %Y"
!system 'echo 构建于 ${DATE} > "${FILE}"'
File /oname=build.txt "${FILE}"
!delfile "${FILE}"
!undef FILE
!undef DATE

5.1.13 !warning

[信息]

这个命令将会输出一个脚本编译器的警告，但不会停止执行脚本。你也可以向这个警告添加一条消息。

!ifdef USE_DANGEROUS_STUFF
  !warning "正在使用危险的东西！"
!endif

5.1.14 !verbose

级别 | push | pop

这个命令将会设置编译输出信息的级别。4=全部信息，3=没有脚本信息，2=没有信息，1=没有警告信息，0=无输出。

通过 push 可以把 !verbose 当前的级别压入一个特殊的堆栈。通过 pop 可以把 !verbose 保存在堆栈中的级别弹出并使用该级别。

如果你的脚本比较大你可以在脚本开头设置 !verbose 3 来减少编译信息输出耗时，从而加快编译速度。

!verbose push
!verbose 1
!include WinMessages.nsh
!verbose pop


预定义

5.2 预定义

你可以使用这些标准预定义自动向开发版本的标题添加构建时间，以及向版本号添加日期，等等。

5.2.1 ${__COUNTER__}

扩展到一个数字 (每次使用时都从0开始，并且递增1)

5.2.2 ${__FILE__}

当前脚本名称。

5.2.3 ${__FILEDIR__}

当前脚本目录。

5.2.4 ${__LINE__}

当前行数。

5.2.5 ${__DATE__}

当脚本开始编译时当前时区的日期。

5.2.6 ${__TIME__}

当脚本开始编译时当前时区的时间。

5.2.7 ${__TIMESTAMP__}

当脚本开始编译时脚本的修改时间戳。

5.2.8 ${NSIS_VERSION}

编译脚本所使用的 NSIS 版本。

5.2.9 ${NSIS_PACKEDVERSION}

NSIS版本，一个32位的数字。

!if 0x2046000 >= ${NSIS_PACKEDVERSION}
  !error "NSIS 2.47 或者更高的版本才能构建这个安装程序！"
!endif

5.2.10 ${U+1}...${U+10FFFF}

一个Unicode（UCS-4）字符。

!define U+ABC "SIS" # Define will override
DetailPrint "${U+2115}${U+ABC}" # DOUBLE-STRUCK CAPITAL N + "SIS"

5.2.11 范围预定义

包含当前代码范围信息的标准预定义。

5.2.7.1 ${__GLOBAL__}

在全局范围内定义。

Section test

  !ifdef ${__GLOBAL__}
    !error "这不应该在这里！"
  !endif

SectionEnd

Function test

  !ifdef ${__GLOBAL__}
    !error "这不应该在这里！"
  !endif

FunctionEnd

PageEx instfiles

  !ifdef ${__GLOBAL__}
    !error "这不应该在这里！"
  !endif

PageExEnd

5.2.11.2 ${__SECTION__}

在区段范围内，被定义为没有任何前缀的区段名。

!ifdef __SECTION__
  !error "这不应该在这里！"
!endif

Section test

  !ifndef __SECTION__
    !error "缺少预定义！"
  !endif

  !if ${__SECTION__} != test
    !error "错误的预定义值！"
  !endif

SectionEnd

Section !test

  !if ${__SECTION__} != test
    !error "错误的预定义值！"
  !endif

SectionEnd

Section un.test

  !if ${__SECTION__} != test
    !error "错误的预定义值！"
  !endif

SectionEnd

5.2.11.3 ${__FUNCTION__}

在函数范围内，被定义为没有任何前缀的函数名。

!ifdef __FUNCTION__
  !error "这不应该在这里！"
!endif

Function test

  !ifndef __FUNCTION__
    !error "缺少预定义！"
  !endif

  !if ${__FUNCTION__} != test
    !error "错误的预定义值！"
  !endif

FunctionEnd

Function un.test

  !if ${__FUNCTION__} != test
    !error "错误的预定义值！"
  !endif

FunctionEnd

5.2.11.4 ${__PAGEEX__}

在 PageEx 范围内，被定义为页面类型。

!ifdef __PAGEEX__
  !error "这不应该在这里！"
!endif

PageEx instfiles

  !ifndef __PAGEEX__
    !error "缺少预定义！"
  !endif

  !if ${__PAGEEX__} != instfiles
    !error "错误的页面类型！"
  !endif

PageExEnd

5.2.11.5 ${__UNINSTALL__}

卸载程序中被定义为区段、函数或 PageEx 范围。

!ifdef __UNINSTALL__
  !error "这不应该在这里！"
!endif

Function test

  !ifdef __UNINSTALL__
    !error "这不应该在这里！"
  !endif

FunctionEnd

Function un.test

  !ifndef __UNINSTALL__
    !error "这不应该在这里！"
  !endif

FunctionEnd

5.2.11.6 ${__MACRO__}

定义为当前宏的名称。


读取环境变量

5.3 读取环境变量

5.3.1 $%envVarName%

当编译时，$%envVarName% 将会被环境变量 envVarName 替换。


条件编译

5.4 条件编译

编译器有一个定义符号列表，定义符号可以通过 !define 定义或使用 /D 命令行开关。这些定义符号可以用于条件编译 (通过 !ifdef 定义) 或用于符号替换 (一种格式简单的宏)。若要用它的值替换一个符号，请使用 ${符号} (如果没有定义符号，那么不会产生转换)。这个转换为“先到先得”，这意味着如果你做了：

!define 符号1 ${符号2}

当出现该行时，如果定义了“符号2”它将被替换。否则，当“${符号1}”被引用时，任何替换都会出现。

与定义、条件编译相关的命令：

5.4.1 !define

[/ifndef | /redef] ([/date|/utcdate] 符号 [值]) | (/math 符号 值1 OP 值2) | (/file 符号 文件.txt)

这个命令将会向全局定义列表中添加“符号”。这个效果与对编译器使用 /D 命令行开关效果相似 (定义仅在 !define 命令之后有效)。

如果使用了 /date 或 /utcdate，值将被传递到 strftime 并使用结果作为“符号”的值。strftime 将特殊符号转换为当前日期或时间的实际值部分。例如：%H 将被转换为当前小时的 24 小时格式。可用符号完整列表可在 MSDN 上搜索 strftime。在 POSIX 平台可使用 man strtime 获取列表。

如果使用了 /math，则“值1 OP 值2”的结果 (其中 OP 可以是 +、-、*、&、|、^、/ 或 %) 将作为“符号”的值。注意：值1和值2必须为整数值！

如果使用了 /file，指定的整个文本文件 (含空格和换行) 将被读取并填充到“符号”。

!define USE_SOMETHING
!define VERSION 1.2
!define /date NOW "%H:%M:%S %d %b, %Y"
!define /math RESULT 3 + 10
!define /math REST 15 % ${RESULT}
!define /file BUNCHASTUFF 某源文件.cpp
!define /redef USE_SOMETHING ${RESULT} ;重新定义 USE_SOMETHING

5.4.2 !undef

符号

从全局定义列表中移除一个符号。注意：取消定义“符号”的地方 ${符号} 将被转变为 "${符号}"。

!define SOMETHING
!undef SOMETHING

5.4.3 !ifdef

符号 [布尔逻辑符号 [符号 [...]]]

当这个命令与 !endif 命令组成一对时，将会告诉编译器是否编译在其两者之间的代码。如果“符号”被全局定义了 (通过 !define 或 /D 开关)，那么所含的代码将会被编译。否则，那些代码将会被跳过。“布尔逻辑符号”可以在更多的“符号”之间被指定为 & (布尔与) 或 | (布尔或)——优先度很简单，从左到右。

!define SOMETHING
!ifdef SOMETHING
  !echo "SOMETHING 已定义！"
!endif
!undef SOMETHING
!ifdef SOMETHING
  !echo "SOMETHING 已定义！" # 将不会输出
!endif

5.4.4 !ifndef

符号 [布尔逻辑符号 [符号 [...]]]

它与 !ifdef 正好相反。当“符号”没有被定义时，代码将会被编译。

5.4.5 !if

[!] 值1 [操作 值2]

当这个命令与 !endif 命令组成一对时，将会告诉编译器。如果值为非零，或者根据值 1 与值 2 比较操作的结果为真，那么所含的代码将会被编译。否则，那些代码将会被跳过。“操作”可以是 == 或 != (字符串比较)，<=、<> 或 >= (浮点数比较)，&& 或 || (布尔值比较)。如果设置了 [!]，返回值将会从真切换为假，反之亦然。

!if 1 < 2
  !echo "1 比 2 小！"
!else if ! 3.1 > 1.99
  !error "这一行将始终不会显示。"
!else
  !error "这一行也不应该显示！"
!endif

5.4.6 !ifmacrodef

宏名称 [布尔逻辑符号 [宏名称 [...]]]

当这个命令与 !endif 命令组成一对时，将会告诉编译器是否编译在其两者之间的代码。如果宏“宏名称”存在，那么所含的代码将会被编译。否则，那些代码将会被跳过。布尔逻辑符号可以在更多的“宏名称”之间被指定为 & (布尔与) 或 | (布尔或)——优先度很简单，从左到右。

!macro SomeMacro
!macroend
!ifmacrodef SomeMacro
  !echo "SomeMacro 已定义！"
!endif

5.4.7 !ifmacrondef

宏名称 [布尔逻辑符号 [宏名称 [...]]]

它与 !ifmacrodef 正好相反。当宏“宏名称”不存在时，代码块将会被编译。

5.4.8 !else

[ifdef|ifndef|ifmacrodef|ifmacrondef [...]]

这个命令允许方便地插入不同的代码块，当有不同的定义或设置了不同的宏时。你可以创建类似 !ifdef/!else/!endif、!ifdef/!else ifdef/!else/!endif 等代码块。

!ifdef VERSION
OutFile installer-${VERSION}.exe
!else
OutFile installer.exe
!endif

5.4.9 !endif

这个命令用于关闭以 !ifdef、!ifndef、!ifmacrodef 或 !ifmacrondef 起始的代码块。

5.4.10 !insertmacro

宏名称 [参数] [...]

插入一个由 !macro 创建的宏的内容。如果创建的宏带有参数，那么你必须按宏的需求向它传送足够的参数。

!macro Print text
  DetailPrint "${text}"
!macroend
!insertmacro Print "某些文字"
!insertmacro Print "更多文字"

5.4.11 !macro

宏名称 [参数][...]

创建一个名为宏。所有在 !macro 与 !macroend 之间的代码行都会被保存。若要稍后插入宏，请使用 !insertmacro。!macro 定义可以有一个或多个定义的参数。这些参数可能会按相同的方式被访问，宏参数会被依次定义 (例如：${PARMNAME}) 且在宏结束的时候依次取消定义。

!macro SomeMacro 参数1 参数2 参数3
  DetailPrint "${参数1}"
  MessageBox MB_OK "${参数2}"
  File "${参数3}"
!macroend

5.4.12 !macroend

结束一个以 !macro 为起始的宏。

5.4.13 !searchparse

[/ignorecase] [/noerrors] [/file] 源字符串或文件 子字符串开始 输出符号1 [子字符串 [输出符号2 [子字符串 ...]]]

解析“源字符串或文件”(视为字符串，或者，如果设置了“/file”则视为文件名) 查找“子字符串开始”。如果发现“子字符串开始”，那么“输出符号1”被定义为字符串其余部分 (减去任何其他可以找到的“子字符串”)。可以指定任意数量的“输出符号x”，并且最后的“子字符串”是可选的。

如果指定了“/noerrors”，则将允许匹配小于全部数量的字符串 (所有“输出符号x”在没有发现子字符串之后会被忽略)。

如果指定了“/file”文件会被视为一连串的行。该文件被搜索直到所有子字符串都匹配过。如果指定了“/noerrors”并且不是所有字符串都匹配，那么匹配最多的符号会被作为第一行使用。

# 查找 filename.cpp 中的一行 '#define APP_VERSION "2.5"' 并且设置 ${VER_MAJOR} 为 2，${VER_MINOR} 为 5。
!searchparse /file filename.cpp `#define APP_VERSION "` VER_MAJOR `.` VER_MINOR `"`

5.4.14 !searchreplace

[/ignorecase] 符号输出 源字符串 搜索字符串 替换字符串

查找“源字符串”。在“源字符串”中搜索“搜索字符串”并使用“替换字符串”替换所有实例。不像 !define，!searchreplace 允许你重新定义没有警告或错误的“符号输出”。

# ${blah} 被定义为 "i like ponies"
!searchreplace blah "i love ponies" "love" "like"


新式用户界面

附录 A：新式用户界面

NSIS 2 使得你更容易的创建一个自定义用户界面的安装程序。新式用户界面 (Modern UI) 就像是一个 Windows 向导那样的界面。这个新界面以新页面 (欢迎、完成、开始菜单) 和组件选择页面的一个描述区域为特色。这些界面和图形都可以通过提供的设置自定义。使用 Modern UI 的宏和语言文件使得写一个新式界面的脚本变得简单。

详细信息和文档请查看 Modern UI 文档。


DLL/TLB 库的安装

附录 B：DLL/TLB 库的安装

  • 简介
  • 库的安装
    • 说明
    • 参数
    • 选项
    • 注意事项
    • 例子
  • 库的卸载
    • 说明
    • 参数
    • 选项
    • 例子
  • Visual Basic 6 Runtimes


Introduction

B.1 简介

NSIS 2.01 引入了一个新的安装和卸载动态链接库 (DLL) 和类型库 (TLB) 的系统。使用该系统你可以仅使用简单的一些代码就可以完整的完成安装或卸载：

  • 文件复制
  • 重启后复制文件
  • 版本检测
  • 注册和反注册
  • 重启后注册和反注册
  • 共享的 DLL 计数
  • Windows 文件保护检测

这些宏保存在头文件 Library.nsh 里，因此首先你需要将该头文件包含到你的脚本里：

!include Library.nsh

注意：你只能在 Windows 系统里编译该脚本而不能在 Linux 等其它系统里编译。


Library Installation

B.2 库的安装

B.2.1 说明

安装库使用 InstallLib 宏。如果在安装过程中发生了错误将会放置一个错误标记。

要检测安装完成后是否需要重启可以使用 MUI 并且带一个完成页面或者使用 IfRebootFlag 指令来判断。

B.2.2 参数

库类型 是否共享 安装方式 本地文件 目标文件 临时目录

库类型

库的类型

DLL - 动态链接库 (DLL)
REGDLL - 要注册的 DLL
TLB - 类型库或包含 LIBRARY 类型的 DLL
REGDLLTLB - 要注册的 DLL 并包含类型库

是否共享

指定要安装的库是否与其它应用程序共享

NOTSHARED - 该库不共享
$VARNAME - 当应用程序第一次安装时为空， 安装时将使共享库计数增加。

安装方式

指定安装方式

REBOOT_PROTECTED

  • 正在使用时等待重启后更新文件 (系统文件必须)。
  • 当文件没有系统文件保护时更新文件。

NOREBOOT_PROTECTED

  • 当文件正在使用时警告用户。用户将可以关闭使用该文件的应用程序。
  • 当文件没有系统文件保护时更新文件。

REBOOT_NOTPROTECTED

  • 正在使用时等待重启后更新文件 (系统文件必须)。
  • 不检测系统文件保护而直接更新文件。

NOREBOOT_NOTPROTECTED

  • 当文件正在使用时警告用户。用户将可以关闭使用该文件的应用程序。
  • 不检测系统文件保护而直接更新文件。

本地文件

编译时文件的位置。

目标文件

用户系统里需要更新文件的位置。

临时目录

当系统需要重启时用来保存临时文件的目录。

要支持 Windows 9x/ME ，该目录应该和目标文件位于同一个卷。Windows 临时目录可以位于任何卷，所以你不能使用该目录。

B.2.3 选项

LIBRARY_SHELL_EXTENSION

  • 在插入 InstallLib 宏之前定义来在注册后调用带 SHCNE_ASSOCCHANGED 的 SHChangeNotify 函数。它可以在安装了环境扩展或更改了文件关联后刷新环境。

LIBRARY_COM

  • 在插入 InstallLib 宏之前定义来在注册后调用CoFreeUnusedLibraries 函数。当安装了 COM 库后它可以从内存里卸载所有不需要的库文件。

B.2.4 注意事项

  • 如果你想要支持 Windows 9x/ME，那么你只能使用短文件名 (8.3)。
  • 警告：当配置 DLL 时，总是使用可分配的文件。不要从你的系统目录里复制文件。

B.2.5 例子

 ;如果应用程序已安装，请把 $ALREADY_INSTALLED 设为一个非零的值。
 ;例如：

 IfFileExists "$INSTDIR\MyApp.exe" 0 new_installation ;将 MyApp.exe 替换为你的应用程序
   StrCpy $ALREADY_INSTALLED 1
 new_installation:

 !insertmacro InstallLib REGDLL $ALREADY_INSTALLED REBOOT_NOTPROTECTED dllname.dll $SYSDIR\dllname.dll $SYSDIR


Library Uninstallation

B.3 库的卸载

B.3.1 说明

UnInstallLib 宏用来卸载一个库。如果在卸载过程中发生了错误将会放置一个错误标记。

B.3.2 参数

库类型 是否共享 卸载方式 文件

库类型

库的类型

DLL - 动态链接库 (DLL)
REGDLL - 要注册的 DLL
TLB - 类型库或包含 LIBRARY 类型的 DLL
REGDLLTLB - 要注册的 DLL 并包含类型库

是否共享

指定要卸载的库是否与其它应用程序共享

NOTSHARED - 该库不是共享的
SHARED - 该库是共享的且仅在共享库计数减少到不再使用时才移除。

卸载方式

指定卸载方式

NOREMOVE

  • 该库不要被移除。你应该在公共的或重要的系统文件比如 Visual Basic/C++/MFC 运行时库使用该选项。

REBOOT_PROTECTED

  • 如果正在使用则等重启后移除 (系统文件必须)。
  • 当文件没有系统保护时移除。

NOREBOOT_PROTECTED

  • 当库正在使用时警告用户。使用户可以关闭正在使用该库的应用程序。
  • 当文件没有系统保护时移除。

REBOOT_NOTPROTECTED

  • 如果正在使用则等重启后移除 (系统文件必须)。
  • 移除该库而不检测系统文件保护。

NOREBOOT_NOTPROTECTED

  • 当库正在使用时警告用户。使用户可以关闭正在使用该库的应用程序。
  • 移除该库而不检测系统文件保护。

文件

用户系统里要卸载的文件位置

B.3.3 选项

LIBRARY_SHELL_EXTENSION

  • 在插入 UninstallLib 宏之前定义来在反注册后调用带 SHCNE_ASSOCCHANGED 的 SHChangeNotify 函数。它可以在卸载了环境扩展或更改了文件关联后刷新环境。

LIBRARY_COM

  • 在插入 UninstallLib 宏之前定义来在反注册后调用CoFreeUnusedLibraries 函数。当卸载了 COM 库后它可以从内存里卸载所有不需要的库文件。

B.3.4 例子

 !insertmacro UnInstallLib REGDLL SHARED REBOOT_NOTPROTECTED $SYSDIR\dllname.dll


Visual Basic 6 Runtimes

B.4 Visual Basic 6 Runtimes

把这些代码添加到你的脚本里可以安装或卸载 VB6 runtimes。

正常的版本应该包含下列的文件 (或者修改路径到你使用的另一个路径)：

  • msvbvm60.dll
  • oleaut32.dll
  • olepro32.dll
  • oleaut32.dll
  • comcat.dll
  • asycfilt.dll
  • stdole2.tlb

一篇 Microsoft 文章解释了如何获取这些文件。

要询问用户必要时是否重启请使用一个带有完成页面的 MUI 或使用 IfRebootFlag 结合 MessageBox 来判断是否需要重启。

 !include Library.nsh

 Var ALREADY_INSTALLED

 Section "-Install VB6 runtimes"

   ; 如果程序已经安装，在这里添加设置 $ALREADY_INSTALLED 为非零值的代码。例如：

   IfFileExists "$INSTDIR\MyApp.exe" 0 new_installation ;将 MyApp.exe 替换为你的应用程序
     StrCpy $ALREADY_INSTALLED 1
   new_installation:

   !insertmacro InstallLib REGDLL $ALREADY_INSTALLED REBOOT_NOTPROTECTED "msvbvm60.dll" "$SYSDIR\msvbvm60.dll" "$SYSDIR"
   !insertmacro InstallLib REGDLL $ALREADY_INSTALLED REBOOT_PROTECTED    "oleaut32.dll" "$SYSDIR\oleaut32.dll" "$SYSDIR"
   !insertmacro InstallLib REGDLL $ALREADY_INSTALLED REBOOT_PROTECTED    "olepro32.dll" "$SYSDIR\olepro32.dll" "$SYSDIR"
   !insertmacro InstallLib REGDLL $ALREADY_INSTALLED REBOOT_PROTECTED    "comcat.dll"   "$SYSDIR\comcat.dll"   "$SYSDIR"
   !insertmacro InstallLib DLL    $ALREADY_INSTALLED REBOOT_PROTECTED    "asycfilt.dll" "$SYSDIR\asycfilt.dll" "$SYSDIR"
   !insertmacro InstallLib TLB    $ALREADY_INSTALLED REBOOT_PROTECTED    "stdole2.tlb"  "$SYSDIR\stdole2.tlb"  "$SYSDIR"

 SectionEnd

 Section "-un.Uninstall VB6 runtimes"

   !insertmacro UnInstallLib REGDLL SHARED NOREMOVE "$SYSDIR\msvbvm60.dll"
   !insertmacro UnInstallLib REGDLL SHARED NOREMOVE "$SYSDIR\oleaut32.dll"
   !insertmacro UnInstallLib REGDLL SHARED NOREMOVE "$SYSDIR\olepro32.dll"
   !insertmacro UnInstallLib REGDLL SHARED NOREMOVE "$SYSDIR\comcat.dll"
   !insertmacro UnInstallLib DLL    SHARED NOREMOVE "$SYSDIR\asycfilt.dll"
   !insertmacro UnInstallLib TLB    SHARED NOREMOVE "$SYSDIR\stdole2.tlb"

 SectionEnd

你可以使用类似的代码来安装公共的 VB6 ActiveX 控件 (例如 Windows Common Controls 控件)。


常用脚本

附录 C：常用脚本

  • 获取上级目录
  • 修剪新行(去除回车换行)
  • 获取命令行参数
  • 在字串里查找
  • 获取 Windows 版本
  • 获取 Internet Explorer 版本
  • 判断 .NET Framework 是否已安装
  • 判断 Macromedia Flash Player 是否已安装
  • 连接到 Internet
  • 获取安装程序文件名
  • 禁止多个安装程序实例
  • 更多的


获取上级目录

C.1 获取上级目录

 ; GetParent
 ; 输入，堆栈顶部  (例如 C:\Program Files\Poop)
 ; 输出，堆栈顶部 (替换，例如 C:\Program Files)
 ; 不改变其它变量值。
 ;
 ; 用法：
 ;   Push "C:\Program Files\Directory\Whatever"
 ;   Call GetParent
 ;   Pop $R0
 ;   ; 在这里 $R0 将等于"C:\Program Files\Directory"

 Function GetParent

   Exch $R0
   Push $R1
   Push $R2
   Push $R3

   StrCpy $R1 0
   StrLen $R2 $R0

   loop:
     IntOp $R1 $R1 + 1
     IntCmp $R1 $R2 get 0 get
     StrCpy $R3 $R0 1 -$R1
     StrCmp $R3 "\" get
     Goto loop

   get:
     StrCpy $R0 $R0 -$R1

     Pop $R3
     Pop $R2
     Pop $R1
     Exch $R0

 FunctionEnd


修剪新行(去除回车换行)

C.2 修剪新行(去除回车换行)

 ; TrimNewlines
 ; 输入，堆栈顶  (例如 whatever$\r$\n)
 ; 输出，堆栈顶 (替换，例如 whatever)
 ; 不改变其它变量值。

 Function TrimNewlines
   Exch $R0
   Push $R1
   Push $R2
   StrCpy $R1 0

 loop:
   IntOp $R1 $R1 - 1
   StrCpy $R2 $R0 1 $R1
   StrCmp $R2 "$\r" loop
   StrCmp $R2 "$\n" loop
   IntOp $R1 $R1 + 1
   IntCmp $R1 0 no_trim_needed
   StrCpy $R0 $R0 $R1

 no_trim_needed:
   Pop $R2
   Pop $R1
   Exch $R0
 FunctionEnd


获取命令行参数

C.3 获取命令行参数

 ; GetParameters
 ; 输入，无
 ; 输出，堆栈顶 (替换，例如 whatever)
 ; 不改变其它变量值。

 Function GetParameters

   Push $R0
   Push $R1
   Push $R2
   Push $R3

   StrCpy $R2 1
   StrLen $R3 $CMDLINE

   ;Check for quote or space
   StrCpy $R0 $CMDLINE $R2
   StrCmp $R0 '"' 0 +3
     StrCpy $R1 '"'
     Goto loop
   StrCpy $R1 " "

   loop:
     IntOp $R2 $R2 + 1
     StrCpy $R0 $CMDLINE 1 $R2
     StrCmp $R0 $R1 get
     StrCmp $R2 $R3 get
     Goto loop

   get:
     IntOp $R2 $R2 + 1
     StrCpy $R0 $CMDLINE 1 $R2
     StrCmp $R0 " " get
     StrCpy $R0 $CMDLINE "" $R2

   Pop $R3
   Pop $R2
   Pop $R1
   Exch $R0

 FunctionEnd


在字串里查找

C.4 在字串里查找

 ; StrStr
 ; 输入，堆栈顶 = 要查找的字串
 ;       堆栈顶-1 = 在该字串中查找
 ; 输出，堆栈顶 (替换为字串剩余部分)
 ; 不改变其它变量值。
 ;
 ; 用法：
 ;   Push "this is a long ass string"
 ;   Push "ass"
 ;   Call StrStr
 ;   Pop $R0
 ;   ($R0 在这里为 "ass string")

 Function StrStr
   Exch $R1 ; st=haystack,old$R1, $R1=needle
   Exch    ; st=old$R1,haystack
   Exch $R2 ; st=old$R1,old$R2, $R2=haystack
   Push $R3
   Push $R4
   Push $R5
   Push $R6
   StrLen $R3 $R1
   StrLen $R6 $R2
   StrCpy $R4 0
   ; $R1=needle
   ; $R2=haystack
   ; $R3=len(needle)
   ; $R4=cnt
   ; $R5=tmp
   loop:
     StrCpy $R5 $R2 $R3 $R4
     StrCmp $R5 $R1 done
     IntCmp $R4 $R6 done
     IntOp $R4 $R4 + 1
     Goto loop
 done:
   StrCpy $R1 $R2 "" $R4
   Pop $R6
   Pop $R5
   Pop $R4
   Pop $R3
   Pop $R2
   Exch $R1
 FunctionEnd


获取 Windows 版本

C.5 获取 Windows 版本

 ; GetWindowsVersion
 ;
 ; 基于 Yazno 的函数，http://yazno.tripod.com/powerpimpit/
 ; Joost Verburg 更新
 ;
 ; 返回到堆栈顶
 ;
 ; Windows 版本 (95、98、ME、NT x.x、2000、XP、2003)
 ; 或
 ; '' (未知 Windows 版本)
 ;
 ; 用法：
 ;   Call GetWindowsVersion
 ;   Pop $R0
 ;   ; 在这里 $R0 为 "NT 4.0" 或其它

 Function GetWindowsVersion

   Push $R0
   Push $R1

   ClearErrors

   ReadRegStr $R0 HKLM \
   "SOFTWARE\Microsoft\Windows NT\CurrentVersion" CurrentVersion

   IfErrors 0 lbl_winnt

   ; 不是 NT
   ReadRegStr $R0 HKLM \
   "SOFTWARE\Microsoft\Windows\CurrentVersion" VersionNumber

   StrCpy $R1 $R0 1
   StrCmp $R1 '4' 0 lbl_error

   StrCpy $R1 $R0 3

   StrCmp $R1 '4.0' lbl_win32_95
   StrCmp $R1 '4.9' lbl_win32_ME lbl_win32_98

   lbl_win32_95:
     StrCpy $R0 '95'
   Goto lbl_done

   lbl_win32_98:
     StrCpy $R0 '98'
   Goto lbl_done

   lbl_win32_ME:
     StrCpy $R0 'ME'
   Goto lbl_done

   lbl_winnt:

   StrCpy $R1 $R0 1

   StrCmp $R1 '3' lbl_winnt_x
   StrCmp $R1 '4' lbl_winnt_x

   StrCpy $R1 $R0 3

   StrCmp $R1 '5.0' lbl_winnt_2000
   StrCmp $R1 '5.1' lbl_winnt_XP
   StrCmp $R1 '5.2' lbl_winnt_2003 lbl_error

   lbl_winnt_x:
     StrCpy $R0 "NT $R0" 6
   Goto lbl_done

   lbl_winnt_2000:
     Strcpy $R0 '2000'
   Goto lbl_done

   lbl_winnt_XP:
     Strcpy $R0 'XP'
   Goto lbl_done

   lbl_winnt_2003:
     Strcpy $R0 '2003'
   Goto lbl_done

   lbl_error:
     Strcpy $R0 ''
   lbl_done:

   Pop $R1
   Exch $R0

 FunctionEnd


获取 Internet Explorer 版本

C.6 获取 Internet Explorer 版本

 ; GetIEVersion
 ;
 ; 基于 Yazno 的函数，http://yazno.tripod.com/powerpimpit/
 ; 返回到堆栈顶
 ; 1-6 (已安装的 IE 版本)
 ; 或
 ; '' (IE 未安装)
 ;
 ; 用法：
 ;   Call GetIEVersion
 ;   Pop $R0
 ;   ; 在这里 $R0 为 "5" 或其它

 Function GetIEVersion
 Push $R0
   ClearErrors
   ReadRegStr $R0 HKLM "Software\Microsoft\Internet Explorer" "Version"
   IfErrors lbl_123 lbl_456

   lbl_456: ; ie 4+
     Strcpy $R0 $R0 1
   Goto lbl_done

   lbl_123: ; 老版本 IE
     ClearErrors
     ReadRegStr $R0 HKLM "Software\Microsoft\Internet Explorer" "IVer"
     IfErrors lbl_error

       StrCpy $R0 $R0 3
       StrCmp $R0 '100' lbl_ie1
       StrCmp $R0 '101' lbl_ie2
       StrCmp $R0 '102' lbl_ie2

       StrCpy $R0 '3' ; 如果不是 100、101 或 102 则默认为 IE3
       Goto lbl_done
         lbl_ie1:
           StrCpy $R0 '1'
         Goto lbl_done
         lbl_ie2:
           StrCpy $R0 '2'
         Goto lbl_done
     lbl_error:
       StrCpy $R0 ''
   lbl_done:
   Exch $R0
 FunctionEnd


判断 .NET Framework 是否已安装

C.7 判断 .NET Framework 是否已安装

 ; IsDotNETInstalled
 ;
 ; 用法：
 ;   Call IsDotNETInstalled
 ;   Pop $0
 ;   StrCmp $0 1 found.NETFramework no.NETFramework

 Function IsDotNETInstalled
   Push $0
   Push $1
   Push $2
   Push $3
   Push $4

   ReadRegStr $4 HKEY_LOCAL_MACHINE \
     "Software\Microsoft\.NETFramework" "InstallRoot"
   # 移除退格键
   Push $4
   Exch $EXEDIR
   Exch $EXEDIR
   Pop $4
   # 如果根目录不存在则 .NET 未安装
   IfFileExists $4 0 noDotNET

   StrCpy $0 0

   EnumStart:

     EnumRegKey $2 HKEY_LOCAL_MACHINE \
       "Software\Microsoft\.NETFramework\Policy"  $0
     IntOp $0 $0 + 1
     StrCmp $2 "" noDotNET

     StrCpy $1 0

     EnumPolicy:

       EnumRegValue $3 HKEY_LOCAL_MACHINE \
         "Software\Microsoft\.NETFramework\Policy\$2" $1
       IntOp $1 $1 + 1
        StrCmp $3 "" EnumStart
         IfFileExists "$4\$2.$3" foundDotNET EnumPolicy

   noDotNET:
     StrCpy $0 0
     Goto done

   foundDotNET:
     StrCpy $0 1

   done:
     Pop $4
     Pop $3
     Pop $2
     Pop $1
     Exch $0
 FunctionEnd


判断 Macromedia Flash Player 是否已安装

C.8 判断 Macromedia Flash Player 是否已安装

 ; IsFlashInstalled
 ;
 ; Yazno，http://yazno.tripod.com/powerpimpit/
 ; 返回值到堆栈顶
 ; 0 (Flash 未安装)
 ; 或
 ; 1 (Flash 已安装)
 ;
 ; 用法：
 ;   Call IsFlashInstalled
 ;   Pop $R0
 ;   ; $R0 在这里为 "1" 或 "0"

 Function IsFlashInstalled
  Push $R0
  ClearErrors
  ReadRegStr $R0 HKCR "CLSID\{D27CDB6E-AE6D-11cf-96B8-444553540000}" ""
  IfErrors lbl_na
    StrCpy $R0 1
  Goto lbl_end
  lbl_na:
    StrCpy $R0 0
  lbl_end:
  Exch $R0
 FunctionEnd


连接到 Internet

C.9 连接到 Internet

 ; ConnectInternet (使用 Dialer 插件)
 ; Written by Joost Verburg
 ;
 ; 当没有可用连接时该函数尝试去创建一个因特网连接。
 ; 如果你不能确认使用该安装程序前已有可用的连接的话
 ; 在用 NSISdl 插件下载前最好先调用这个函数。
 ;
 ; 这个函数需要 Internet Explorer 3。
 ; 如果 IE3 未安装的话，将会询问是否手动连接。

 Function ConnectInternet

   Push $R0

     ClearErrors
     Dialer::AttemptConnect
     IfErrors noie3

     Pop $R0
     StrCmp $R0 "online" connected
       MessageBox MB_OK|MB_ICONSTOP "无法连接到互联网。"
       Quit ;这里将会退出安装程序。你可以改为你自己的错误处理代码。

     noie3:

     ; IE3 未安装
     MessageBox MB_OK|MB_ICONINFORMATION "请先连接到互联网。"

     connected:

   Pop $R0

 FunctionEnd


获取安装程序文件名

C.10 获取安装程序文件名

 System::Call 'kernel32::GetModuleFileNameA(i 0, t .R0, i 1024) i r1'
 ;$R0 将包含了安装程序全名


禁止多个安装程序实例

C.11 禁止多个安装程序实例

把下列代码放到你的 .onInit 函数:

 System::Call 'kernel32::CreateMutexA(i 0, i 0, t "myMutex") i .r1 ?e'
 Pop $R0

 StrCmp $R0 0 +3
   MessageBox MB_OK|MB_ICONEXCLAMATION "安装程序已经在运行。"
   Abort

myMutex 应该替换为你自己的唯一标识值。


更多

C.12 更多

更多的常用函数你可以在 NSIS Wiki、NSIS 论坛和 NSIS 开发者页面找到。


常用信息

附录 D：常用信息

  • 错误级别
  • 添加卸载信息到添加删除面板
  • 使用 System.dll 来调用一个外部 DLL
  • 把安装详细信息导出到文件
  • 如何读取 REG_MULTI_SZ 值


错误级别

D.1 错误级别

像其它应用程序一样，由 NSIS 生成的安装程序执行时，会返回错误级别。如果你要用其它应用程序或安装程序调用一个 NSIS 安装程序，那么检查错误级别就会很有用。

  • 0 - 正常执行 (没有错误)
  • 1 - 安装被用户终止 (取消按钮)
  • 2 - 安装由脚本终止

从 NSIS 2.01 以后，你可以使用 SetErrorLevel 自行设置错误级别。

需要注意的是卸载程序会把它本身复制到临时文件夹并从那里执行以使得原来的卸载程序可以被删除。这意味着卸载程序的执行进程的错误级别是无效的，除非它模拟该复制过程并执行复制的卸载程序。要模拟该过程，使用：

CopyFiles $INSTDIR\uninstaller.exe $TEMP
ExecWait '"$TEMP\uninstaller.exe" _?=$INSTDIR' $0
DetailPrint "卸载程序设置错误级别为 $0"

如果你不这样做，那么你就只能知道卸载程序是否复制本身到临时文件夹失败。


添加卸载信息到添加删除面板

D.2 添加卸载信息到添加删除面板

在 HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall 下创建一个以你的产品名为名的项，就可以向控制面板中的添加/删除程序添加一个条目。对于 Windows NT (NT4/2000/XP)，可能还要在 HKCU 下创建项，而且这将只能显示给当前用户。这里有许多可以写入关于你的应用程序和卸载程序的信息的值项。可以通过 WriteRegStr 或是 WriteRegDWORD 命令写入一个值。例如：

WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\Product" "DisplayName" "Application Name"

必需值

DisplayName (字符串) - 应用程序的名称
UninstallString (字符串) - 卸载程序的路径和文件名。你应该给路径加上引号，以确保路径中的空格不会使 Windows 找不到卸载程序。

可选值

以下某些值将不会被旧版本的 Windows 支持。

InstallLocation (字符串) - 安装目录 ($INSTDIR)
DisplayIcon (字符串) - 显示在你的应用程序名称旁边的图标的路径，文件名和索引。

Publisher (字符串) - 发布者 (或公司) 的名称

ModifyPath (字符串) - 应用程序的修复程序的路径和文件名。
InstallSource (字符串) - 应用程序的安装路径。

ProductID (字符串) - 应用程序的产品 ID。
RegOwner (字符串) - 应用程序的注册拥有者。
RegCompany (字符串) - 应用程序的注册公司。

HelpLink (字符串) - 技术支持的网站链接。
HelpTelephone (字符串) - 技术支持电话。

URLUpdateInfo (字符串) - 应用程序的在线更新网址链接。
URLInfoAbout (字符串) - 应用程序的主页链接。

DisplayVersion (字符串) - 应用程序的显示版本。
VersionMajor (DWORD) - 应用程序的主版本号。
VersionMinor (DWORD) - 应用程序的副版本号。

NoModify (DWORD) - 1 (如果卸载程序没有修改应用程序的选项)
NoRepair (DWORD) - 1 (如果卸载程序没有修复安装程序的选项)

如果 NoModify 和 NoRepair 都被设为 1，那么按钮将会用“删除”来代替“修改/删除”。


使用 System.dll 来调用一个外部 DLL

D.3 使用 System.dll 来调用一个外部 DLL

某些安装进程需要调用包含于第三方开发的 DLL 中的函数。最佳的例子就是安装一个 Palm(TM) 通道。

一些关于 System.dll 的背景资料
System.dll 插件 (由 Brainsucker 开发) 使你可以通过提供 Call 函数来调用外部 DLL。有大量的由 System.dll 提供的函数，但是它们并不适合放在这里。若要得到更多关于其它函数的详细信息，请锁上门，取下电话，System 说明文档，并阅读。

数据类型
System.dll 可以识别一下数据类型：

  • v - void (常用于返回)
  • i - int (包括 char、byte、short、句柄、指针等等)
  • l - long 型整数 (已知的为 int64)
  • t - 文本、字串 (LPCSTR、第一个字符的指针)
  • b - 布尔 (需要返回 true 或 false) - 事实上这种类型没有什么意义 -> 通常可以用整数来代替 ('0':'1')
  • k - 回调。查看 system.html 的回调章节。
  • * - 指针 -> Proc 需要这种类型的指针，这会影响下一个字符 (参数) [例如：'*i' - 整数指针]

将 System.dll 变量映射为 NSIS 里的内置变量
如果你不需要返回任何数据，那么这里没有什么可以用来调用一个外部函数的指向。System.dll 可以通过以下方式将函数变量映射为 NSIS 脚本变量：

NSIS $0~$9 可与 System.dll r0~r9 相对应；NSIS $R0~$R9 也可与 System.dll r10~r19 相对应

每个参数由类型，输入和输出指定。可以用一个点跳过输入或输出。例如：

字符串 (一个字符数组的指针)，输入为 '轻松调用'：

t '轻松调用'

字符串 (一个字符数组的指针)，输入从 $5 取值，并且经转换为由调用产生的数组后，最后保存到 $R8：

t r5R8

一个整数指针，从 $1 取值并放入 $2：

*i r1r2

一个 64-bit 整数指针，输出送入堆栈，没有输入：

*l .s

通过 System.dll::Call 调用第三方 DLL 中的一个函数，Call 的用法如下：

System::Call 'YourDllName::YourDllFunction(i, *i, t) i(r0, .r1, r2) .r3'

后面的的 (r0, .r1, r2) .r3 段是用来传送 DLL 和 NSIS 脚本之间的参数。就像在这个参数列表中看到的一样，类型和输入、输出是可以分开的。每个 "(参数列表) 返回值" 块不用考虑和/或添加上一个。在这里，第一块指定类型而第二块指定输入和输出。

开始编辑 NSIS 脚本之前
在开始编辑 NSIS 代码之前，首先需要了解要调用函数的原型。在这个例子里，我们使用 Palm 'CondMgr.dll' 中的'CmGetHotSyncExecPath' 函数。这个函数用来返回 'HotSync.exe' 的完整路径。

函数定义

int CmGetHotSyncExecPath(TCHAR *pPath, int *piSize);

参数

  • pPath 是一个指向字符 buffer 的指针。在返回前这是已安装的 HotSync manager 的路径文件名。
  • piSize 是一个指向由 pPath 参数引用的 buffer 大小 (TCHAR 类型) 的整数指针。

返回值：

  • 0：无措误
  • -1：产生不明确的错误
  • ERR_REGISTRY_ACCESS(-1006)：不能访问 Palm 配置项
  • ERR_BUFFER_TOO_SMALL(-1010)：buffer 太小而不能保存请求的信息
  • ERR_INVALID_POINTER(-1013)：指定的指针不是一个有效的指针

同样的，如果 buffer 太小，*int 中的值为缓冲应当的大小 (TCHAR 类型)。

上面的函数的定义转换到 System.dll 定义:

CmGetHotSyncExecPath(t, *i) i

也就是，它有一个文本变量，一个整数指针，并返回一个整数值。

使用外部 DLL 函数
在选出了函数所要做的事情，以及它是如何转换到 System.dll 格式之后，就可以在 NSIS 脚本中使用这个函数了。

首先，推荐在需要多次调用 System.dll 时，禁止插件卸载。根据 Brainsucker (以及其他人) 的说法，这样可以提高安装包的执行速度 (减少了卸载/重新装载的时间)。

其次，你必须将输出目录更改为你要用的 DLL 所在的目录。如果 DLL 在系统路径中，那么它也能工作，但并没有经过测试。

下面的代码段会将 condmgr.dll 释放到一个临时目录中，然后执行 CmGetHotSyncExecPath 函数，显示返回的数据并最终卸载 System.dll 插件。

; **** snip ****
SetPluginUnload  alwaysoff

Function loadDll

  SetOutPath $TEMP\eInspect             ; 创建临时目录
  File bin\CondMgr.dll                  ; 释放 DLL
  StrCpy $1 ${NSIS_MAX_STRLEN}          ; assign memory to $0
  System::Call 'CondMgr::CmGetHotSyncExecPath(t, *i) i(.r0, r1r1).r2'
  DetailPrint '路径: "$0"'
  DetailPrint "路径长度: $1"
  DetailPrint "返回值: $2"

; 最后一次插件调用必须没有 /NOUNLOAD 参数，否则 NSIS 将不能在安装结束后删除临时 DLL 文件

  SetPluginUnload manual
; 什么都不作 (目的就是为了卸载 System.dll)
  System::Free 0
FunctionEnd
; **** snip ****

这个函数将在查看详细信息页面产生下面的输出：

输出目录：c:\windows\TEMP\eInspect
解压：CondMgr.dll
路径："C:\Dave\palm\Hotsync.exe"
路径长度：24
返回值：0

Written by djc

感谢
在此感谢 kichik 和 Sunjammer 花费了大量时间解决这些问题。同时感谢 brainsucker 首先做了这个 System.dll 插件。祝你好运！


把安装详细信息导出到文件

D.4 把安装详细信息导出到文件

这个函数可以把安装详细信息导出到你选定的文件。创建这个函数是因为这个论坛帖子里 Afrow UK 请求把信息导出到文件。

要使用这个函数请先把文件名压入堆栈。它将会把安装信息导出到该文件。例如：

GetTempFileName $0
Push $0
Call DumpLog

这里是要调用的函数：

!define LVM_GETITEMCOUNT 0x1004
!define LVM_GETITEMTEXT  0x102D

Function DumpLog
  Exch $5
  Push $0
  Push $1
  Push $2
  Push $3
  Push $4
  Push $6

  FindWindow $0 "#32770" "" $HWNDPARENT
  GetDlgItem $0 $0 1016
  StrCmp $0 0 error
  FileOpen $5 $5 "w"
  StrCmp $5 0 error
    SendMessage $0 ${LVM_GETITEMCOUNT} 0 0 $6
    System::Alloc ${NSIS_MAX_STRLEN}
    Pop $3
    StrCpy $2 0
    System::Call "*(i, i, i, i, i, i, i, i, i) i \
      (0, 0, 0, 0, 0, r3, ${NSIS_MAX_STRLEN}) .r1"
    loop: StrCmp $2 $6 done
      System::Call "User32::SendMessageA(i, i, i, i) i \
        ($0, ${LVM_GETITEMTEXT}, $2, r1)"
      System::Call "*$3(&t${NSIS_MAX_STRLEN} .r4)"
      FileWrite $5 "$4$\r$\n"
      IntOp $2 $2 + 1
      Goto loop
    done:
      FileClose $5
      System::Free $1
      System::Free $3
      Goto exit
  error:
    MessageBox MB_OK "错误"
  exit:
    Pop $6
    Pop $4
    Pop $3
    Pop $2
    Pop $1
    Pop $0
    Exch $5
FunctionEnd

written by KiCHiK


如何读取 REG_MULTI_SZ 值

D.6 如何读取 REG_MULTI_SZ 值

我写这个脚本来帮助这个帖子里的 rpetges。它可以读取一个注册表 REG_MULTI_SZ 类型的键值并输出。当然不要忘了修改标有“修改这里”的地方。该注册表键必须为 REG_MULTI_SZ 类型，否则将显示错误。

OutFile "REG_MULTI_SZ Reader.exe"

Name "REG_MULTI_SZ Reader"

ShowInstDetails show

!define HKEY_CLASSES_ROOT        0x80000000
!define HKEY_CURRENT_USER        0x80000001
!define HKEY_LOCAL_MACHINE       0x80000002
!define HKEY_USERS               0x80000003
!define HKEY_PERFORMANCE_DATA    0x80000004
!define HKEY_PERFORMANCE_TEXT    0x80000050
!define HKEY_PERFORMANCE_NLSTEXT 0x80000060
!define HKEY_CURRENT_CONFIG      0x80000005
!define HKEY_DYN_DATA            0x80000006

!define KEY_QUERY_VALUE          0x0001
!define KEY_ENUMERATE_SUB_KEYS   0x0008

!define REG_NONE                 0
!define REG_SZ                   1
!define REG_EXPAND_SZ            2
!define REG_BINARY               3
!define REG_DWORD                4
!define REG_DWORD_LITTLE_ENDIAN  4
!define REG_DWORD_BIG_ENDIAN     5
!define REG_LINK                 6
!define REG_MULTI_SZ             7

!define RegOpenKeyEx     "Advapi32::RegOpenKeyExA(i, t, i, i, i) i"
!define RegQueryValueEx  "Advapi32::RegQueryValueExA(i, t, i, i, i, i) i"
!define RegCloseKey      "Advapi32::RegCloseKeyA(i) i"

####### 编辑这里!

!define ROOT_KEY         ${HKEY_CURRENT_USER}
!define SUB_KEY          "Software\Joe Software"
!define VALUE            "Strings"

####### 停止编辑

Section "Read"
  StrCpy $0 ""
  StrCpy $1 ""
  StrCpy $2 ""
  StrCpy $3 ""
  SetPluginUnload alwaysoff ;插件调用设置为全部不卸载以提高速度
  System::Call "*(i) i (0) .r0"
  System::Call "*(i) i (0) .r1"
  System::Call "*(i) i (0) .r2"
  System::Call "${RegOpenKeyEx}(${ROOT_KEY}, '${SUB_KEY}', \
    0, ${KEY_QUERY_VALUE}|${KEY_ENUMERATE_SUB_KEYS}, r0) .r3"

  StrCmp $3 0 goon
    MessageBox MB_OK|MB_ICONSTOP "不能打开注册表键! ($3)"
    Goto done
goon:

  System::Call "*$0(&i4 .r4)"
  System::Call "${RegQueryValueEx}(r4, '${VALUE}', 0, r1, 0, r2) .r3"

  StrCmp $3 0 read
    MessageBox MB_OK|MB_ICONSTOP "不能查询注册表值! ($3)"
    Goto done

read:

  System::Call "*$1(&i4 .r3)"

  StrCmp $3 ${REG_MULTI_SZ} multisz
    MessageBox MB_OK|MB_ICONSTOP "注册表值不是 SZ_MULTI_SZ! ($3)"
    Goto done

multisz:

  System::Call "*$2(&i4 .r3)"

  StrCmp $3 0 0 multiszalloc
    MessageBox MB_OK|MB_ICONSTOP "注册表值为空! ($3)"
    Goto done

multiszalloc:

  System::Free $1
  System::Alloc $3
  Pop $1

  StrCmp $1 0 0 multiszget
    MessageBox MB_OK|MB_ICONSTOP "不能分配足够的内存! ($3)"
    Goto done

multiszget:

  System::Call "${RegQueryValueEx}(r4, '${VALUE}', 0, 0, r1, r2) .r3"

  StrCmp $3 0 multiszprocess
    MessageBox MB_OK|MB_ICONSTOP "不能查询注册表值! ($3)[2]"
    Goto done

multiszprocess:

  StrCpy $4 $1

  loop:

    System::Call "*$4(&t${NSIS_MAX_STRLEN} .r3)"
    StrCmp $3 "" done
    DetailPrint $3
    StrLen $5 $3
    IntOp $4 $4 + $5
    IntOp $4 $4 + 1 ;REG_MULTI_SZ 类型以一个 NULL 来分隔
    Goto loop

done:

  System::Free $2
  System::Free $1

  StrCmp $0 0 noClose
    System::Call "${RegCloseKey}(r0)"

noClose:

  SetPluginUnload manual ;插件调用改为正常
  System::Free $0 ;最后一次插件调用必须卸载
SectionEnd

written by KiCHiK


常用头文件

附录 E：常用头文件

  • 文件函数
    • 介绍
    • Locate
    • GetSize
    • DriveSpace
    • GetDrives
    • GetTime
    • GetFileAttributes
    • GetFileVersion
    • GetExeName
    • GetExePath
    • GetParameters
    • GetOptions
    • GetRoot
    • GetParent
    • GetFileName
    • GetBaseName
    • GetFileExt
    • BannerTrimPath
    • DirState
    • RefreshShellIcons
  • 文本函数
    • 介绍
    • LineFind
    • LineRead
    • FileReadFromEnd
    • LineSum
    • FileJoin
    • TextCompare
    • ConfigRead
    • ConfigWrite
    • FileRecode
    • TrimNewLines
  • 句子函数
    • 介绍
    • WordFind
    • WordFind2X
    • WordFind3X
    • WordReplace
    • WordAdd
    • WordInsert
    • StrFilter
    • VersionCompare
    • VersionConvert
  • 逻辑函数库
    • 介绍
    • 基本语句
    • 表达式
    • 例子
  • 常用函数库
    • 介绍
    • 字串处理函数
      • Find
      • FindI
      • FindLast
      • FindLastI
      • StrStr
      • StrStrI
      • StrRStrI
      • TrimLine
      • TrimLineEx
      • Replace
      • ReplaceEx
      • VerCmp
      • StrCase
      • StrToHex
      • ConvertANSIToUTF8
      • ConvertUTF8ToANSI
    • 文件、磁盘处理函数
      • GetParent
      • GetChild
      • GetFileExt
      • DumpLog
      • AppendFile
      • DelFileByLog
      • RMDir
      • ForEachFile
      • ForEachFileEx
      • SearchFile
      • IsWritable
      • GetVolume
      • TrimDir
      • FileTimeCmp
      • GetFileSize
      • CompactPathEx
      • RenameExtension
      • RelativePathTo
      • PathCanonicalize
      • RemoveArgs
      • CheckFileEncoding
    • 注册表处理函数
      • CopyReg
      • ReadRegBin
      • ReadRegMultiStr
      • WriteRegBin
      • WriteRegStrW
      • SHCopyKey
      • SHRegGetPath
      • GetRegKeyCount
      • GetRegValueCount
    • 杂项函数
      • CloseApp
      • IsWinNT
      • GetComputerName
      • GetInstallerName
      • GetLocaleInfo
      • GetWinName
      • GetUserName
      • RefreshIcon
      • ClearDetail
      • GetDllVersion
      • LoadImage
      • DeleteObject
      • DestroyCursor
      • DestroyIcon
      • MessageBox
      • WriteEnvStr
      • DeleteEnvStr
    • 区段函数
      • StartRadioButtons
      • RadioButton
      • EndRadioButtons
      • EndRadioButtons2


文件函数头文件

E.1 文件函数头文件

E.1.1 介绍

包含头文件：

!include "FileFunc.nsh"

包含用于安装的 "GetFileExt" 函数和用于卸载的 "GetParent" 函数：

!insertmacro GetFileExt
!insertmacro un.GetParent

调用函数：

Section Install
     ${GetFileExt} "C:\我的下载\Index.html" $R0
     ; $R0="html"
SectionEnd

Section un.Install
     ${un.GetParent} "C:\我的下载\Index.html" $R0
     ; $R0="C:\My Downloads"
SectionEnd

E.1.2 查找

  • 使用过滤和大小选项，查找文件、文件夹和空文件夹。

语法：

${Locate} "[Path]" "[Options]" "Function"

"[Path]"      ; 磁盘或文件夹
              ;
"[Options]    ; /L=[FD|F|D|DE|FDE]
              ;     /L=FD    - 查找文件和文件夹 (默认)
              ;     /L=F     - 仅查找文件
              ;     /L=D     - 仅查找文件夹
              ;     /L=DE    - 仅查找空文件夹
              ;     /L=FDE   - 查找文件和空文件夹
              ; /M=[mask]
              ;     /M=*.*         - 查找全部 (默认)
              ;     /M=*.doc       - 查找 Work.doc、1.doc ...
              ;     /M=Pho*        - 查找 PHOTOS、phone.txt ...
              ;     /M=win???.exe  - 查找 winamp.exe、winver.exe ...
              ;     /M=winamp.exe  - 仅查找 winamp.exe
              ; /S=No:No[B|K|M|G]
              ;     /S=      - 不查找文件大小 (较快) (默认)
              ;     /S=0:0B  - 精确查找 0 字节的文件
              ;     /S=5:9K  - 仅查找 5~9KB 的文件
              ;     /S=:10M  - 仅查找 10MB 或更小的文件
              ;     /S=1G    - 仅查找 1GB 或更大的文件
              ; /G=[1|0]
              ;     /G=1     - 查找子文件夹 (默认)
              ;     /G=0     - 不查找子文件夹
              ; /B=[0|1]
              ;     /B=0     - 不使用标语 (默认)
              ;     /B=1     - 使用标语。当函数开始搜索新的文件夹时回调。
"Function"    ; 找到时的回调函数

Function "Function"
    ; $R9    "path\name"
    ; $R8    "path"
    ; $R7    "name"
    ; $R6    "size"  ($R6="" 如果是文件夹，$R6="0" 如果是文件 (带 /S= 参数时))

    ; $R0-$R5 未使用，可用于保存数据
    ; ...

    ; Push $var    ; 如果 $var="StopLocate" 则退出函数
FunctionEnd

注意：
- 文件或文件夹不存在时的错误标记
- 语法错误时的错误标记

示例 (查找一个文件)：

Section
    ${Locate} "C:\ftp" "/L=F /M=RPC DCOM.rar /S=1K" "Example1"
    ; 文件 'RPC DCOM.rar' 位于 'C:\ftp' 且大小至少为 1KB

    IfErrors 0 +2
    MessageBox MB_OK "错误！" IDOK +2
    MessageBox MB_OK "$$R0=$R0"
SectionEnd

Function Example1
    StrCpy $R0 $R9
    ; $R0="C:\ftp\files\RPC DCOM.rar"

    MessageBox MB_YESNO '$R0$\n$\n继续查找？' IDYES +2
    StrCpy $0 StopLocate

    Push $0
FunctionEnd

示例 (将结果写入文本文件)：

Section
    GetTempFileName $R0
    FileOpen $R1 $R0 w
    ${Locate} "C:\ftp" "/S=:2M /G=0" "Example2"
    ; 文件夹和所有小于 2MB 的文件
    ; 不搜寻子文件夹
    FileClose $R1

    IfErrors 0 +2
    MessageBox MB_OK "错误！" IDOK +2
    Exec '"notepad.exe" "$R0"'
SectionEnd

Function Example2
    StrCmp $R6 '' 0 +3
    FileWrite $R1 "文件夹=$R9$\r$\n"
    goto +2
    FileWrite $R1 "文件=$R9 大小=$R6 MB$\r$\n"

    Push $0
FunctionEnd

示例 (将结果写入 INI 文件)：

Section
    GetTempFileName $R0
    ${Locate} "C:\ftp" "/L=F /S=0K" "Example3"
    ; 以 KB 为大小单位检测所有位于 'C:\ftp' 的文件

    IfErrors 0 +2
    MessageBox MB_OK "错误！" IDOK +2
    Exec '"notepad.exe" "$R0"'
SectionEnd

Function Example3
    WriteINIStr $R0 "$R8" "$R7" "$R6 KB"

    Push $0
FunctionEnd

示例 (删除空文件夹)：

Section
    StrCpy $R2 0
    StrCpy $R3 0

    loop:
    StrCpy $R1 0
    ${Locate} "C:\ftp" "/L=DE" "Example4"
    IntOp $R3 $R3 + 1
    IntOp $R2 $R2 + $R1
    StrCmp $R0 StopLocate +2
    StrCmp $R1 0 0 loop

    IfErrors 0 +2
    MessageBox MB_OK 'error' IDOK +2
    MessageBox MB_OK '已删除 $R2 个文件夹！$\n$R3 次循环。'
SectionEnd

Function Example4
    MessageBox MB_YESNOCANCEL '删除空文件夹 "$R9"？' IDNO end IDCANCEL cancel
    RMDir $R9
    IntOp $R1 $R1 + 1
    goto end

    cancel:
    StrCpy $R0 StopLocate

    end:
    Push $R0
FunctionEnd

示例 (将所有文件移动到一个文件夹)：

Section
    StrCpy $R0 "C:\ftp"   ;来源文件夹
    StrCpy $R1 "C:\ftp2"  ;目标文件夹

    StrCpy $R2 0
    StrCpy $R3 0
    ${Locate} "$R0" "/L=F" "Example5"

    IfErrors 0 +2
    MessageBox MB_OK '错误！' IDOK +4
    StrCmp $R3 0 0 +2
    MessageBox MB_OK '已移动 $R2 个文件。' IDOK +2
    MessageBox MB_OK '已移动 $R2 个文件。$\n$R3 个文件没有移动！'
SectionEnd

Function Example5
    StrCmp $R8 $R1 +6
    IfFileExists '$R1\$R7' +4
    Rename $R9 '$R1\$R7'
    IntOp $R2 $R2 + 1
    goto +2
    IntOp $R3 $R3 + 1

    Push $0
FunctionEnd

示例 (带日志复制文件)：

Section
    StrCpy $R0 "C:\ftp"   ;来源文件夹
    StrCpy $R1 "C:\ftp2"  ;目标文件夹
    StrLen $R2 $R0

    GetTempFileName $0
    FileOpen $R3 $0 w
    ${Locate} "$R0" "/L=FDE" "Example6"
    FileClose $R3

    IfErrors 0 +2
    MessageBox MB_OK 'error'

    Exec '"notepad.exe" "$0"'     ;查看日志
SectionEnd

Function Example6
    StrCpy $1 $R8 '' $R2

    StrCmp $R6 '' 0 +3
    CreateDirectory '$R1$1\$R7'
    goto end
    CreateDirectory '$R1$1'
    CopyFiles /SILENT $R9 '$R1$1'

    IfFileExists '$R1$1\$R7' 0 +3
    FileWrite $R3 "-old:$R9  -new:$R1$1\$R7  -success$\r$\n"
    goto +2
    FileWrite $R3 "-old:$R9  -new:$R1$1\$R7  -failed$\r$\n"

    end:
    Push $0
FunctionEnd

示例 (重新创建文件夹结构)：

Section
    StrCpy $R0 "C:\ftp"     ;来源文件夹结构
    StrCpy $R1 "C:\ftp2"    ;目标文件夹结构
    StrLen $R2 $R0

    ${Locate} "$R0" "/L=D" "Example7"

    IfErrors 0 +2
    MessageBox MB_OK '错误！'
SectionEnd

Function Example7
    StrCpy $1 $R9 '' $R2
    CreateDirectory '$R1$1'

    Push $0
FunctionEnd

示例 (带标语查找 - 需要 "NxS" 插件)：

Section
    nxs::Show /NOUNLOAD `$(^Name) 安装` /top `安装程序正在搜索某些东西。$\r$\n如果可以，请稍等。` /h 1 /can 1 /end
    ${Locate} "C:\WINDOWS" "/L=F /M=*.inf /B=1" "Example8"
    nxs::Destroy
SectionEnd

Function Example8
    StrCmp $R0 $R8 abortcheck
    StrCpy $R0 $R8
    nxs::Update /NOUNLOAD /sub "$R8" /pos 78 /end

    abortcheck:
    nxs::HasUserAborted /NOUNLOAD
    Pop $0
    StrCmp $0 1 0 +2
    StrCpy $0 StopLocate

    StrCmp $R9 '' end
    ;...

    end:
    Push $0
FunctionEnd

E.1.3 GetSize

  • 查找文件、文件掩码或文件夹的大小
  • 查找文件、文件夹和子文件夹的总数量

语法：

${GetSize} "[Path]" "[Options]" $var1 $var2 $var3

"[Path]"      ; 磁盘或文件夹
              ;
"[Options]"   ; /M=[mask]
              ;     /M=*.*         - 全部查找 (默认)
              ;     /M=*.doc       - 查找 Work.doc、1.doc ...
              ;     /M=Pho*        - 查找 PHOTOS、phone.txt ...
              ;     /M=win???.exe  - 查找 winamp.exe、winver.exe ...
              ;     /M=winamp.exe  - 仅查找 winamp.exe
              ; /S=No:No[B|K|M|G]
              ;     /S=      - 不查找文件大小 (较快) (默认)
              ;     /S=0:0B  - 仅精确查找 0 字节的文件
              ;     /S=5:9K  - 仅查找 5~9KB 的文件
              ;     /S=:10M  - 仅查找 10MB 或更小的文件
              ;     /S=1G    - 仅查找 1GB 或更大的文件
              ; /G=[1|0]
              ;     /G=1     - 查找子文件夹 (默认)
              ;     /G=0     - 不查找子文件夹
              ;
$var1         ; 结果1：大小
$var2         ; 结果2：文件总数量
$var3         ; 结果3：文件夹总数量

注意：
- 如果磁盘或文件夹不存在时的错误标记
- 语法错误时的错误标记

示例 (1)：

Section
    ; 以 KB 为单位查找文件 "C:\WINDOWS\Explorer.exe" 的大小

    ${GetSize} "C:\WINDOWS" "/M=Explorer.exe /S=0K /G=0" $0 $1 $2
    ; $0="220" KB
    ; $1="1"   个文件
    ; $2=""    个文件夹

    IfErrors 0 +2
    MessageBox MB_OK "错误！"
SectionEnd

示例 (2)：

Section
    ; 以 MB 为单位查找文件夹 "C:\Installs\Reanimator\Drivers" 的大小

    ${GetSize} "C:\Installs\Reanimator\Drivers" "/S=0M" $0 $1 $2
    ; $0="132" MB
    ; $1="555" 个文件
    ; $2="55"  个文件夹

    IfErrors 0 +2
    MessageBox MB_OK "错误！"
SectionEnd

示例 (3)：

Section
    ; 查找 "C:\WINDOWS" 文件和文件夹的总数量 (不含子文件夹)

    ${GetSize} "C:\WINDOWS" "/G=0" $0 $1 $2
    ; $0=""    大小
    ; $1="253" 个文件
    ; $2="46"  个文件夹

    IfErrors 0 +2
    MessageBox MB_OK "错误！"
SectionEnd

E.1.4 DriveSpace

  • 获取驱动器的全部、已用和可用空间

语法：

${DriveSpace} "[Drive]" "[Options]" $var

"[Drive]"     ; 要检查的磁盘
              ;
"[Options]"   ; /D=[T|O|F]
              ;     /D=T  - 全部空间 (默认)
              ;     /D=O  - 已用空间
              ;     /D=F  - 可用空间
              ; /S=[B|K|M|G]
              ;     /S=B  - 以字节为大小 (默认)
              ;     /S=K  - 以 KB 为大小
              ;     /S=M  - 以 MB 为大小
              ;     /S=G  - 以 GB 为大小
              ;
$var          ; 结果：大小

注意：
- 磁盘不存在或尚未就绪时的错误标记
- 语法错误时的错误标记

示例：

Section
    ${DriveSpace} "C:\" "/D=F /S=M" $R0
    ; $R0="2530"   megabytes free on drive C:
SectionEnd

E.1.5 GetDrives

  • 查找系统中所有可用驱动器

语法：

${GetDrives} "[Option]" "Function"

"[Option]"      ; [FDD+HDD+CDROM+NET+RAM]
                ;   FDD    软盘驱动器
                ;   HDD    硬盘驱动器
                ;   CDROM  光盘驱动器
                ;   NET    网络驱动器
                ;   RAM    虚拟磁盘驱动器
                ;
                ; [ALL]
                ;   按照字母顺序查找所有驱动器 (默认)
"Function"      ; 找到时的回调函数

Function "Function"
    ; $9    "驱动器名称"  (a:\ c:\ ...)
    ; $8    "驱动器类型"    (FDD HDD ...)

    ; $R0-$R9 被使用于储存数据
    ; ...

    Push $var    ; 如果 $var="StopGetDrives" 则退出函数
FunctionEnd

示例 1：

Section
    ${GetDrives} "FDD+CDROM" "Example1"
SectionEnd

Function Example1
    MessageBox MB_OK "$9  ($8 驱动器)"

    Push $0
FunctionEnd

示例 2：

Section
    ${GetDrives} "ALL" "Example2"
SectionEnd

Function Example2
    MessageBox MB_OK "$9  ($8 驱动器)"

    Push $0
FunctionEnd

示例 3 (获取分区类型)：

Section
    StrCpy $R0 "D:\"      ;驱动器名称
    StrCpy $R1 "invalid"

    ${GetDrives} "ALL" "Example3"

    MessageBox MB_OK "驱动器 $R0 的类型为 $R1"
SectionEnd

Function Example3
    StrCmp $9 $R0 0 +3
    StrCpy $R1 $8
    StrCpy $0 StopGetDrives

    Push $0
FunctionEnd

E.1.6 GetTime

  • 获取本地或系统时间
  • 获取文件访问、创建和修改时间

语法：

${GetTime} "[File]" "[Option]" $var1 $var2 $var3 $var4 $var5 $var6 $var7

"[File]"        ; 如指定 "L" 或 "LS" 则忽略
                ;
"[Option]"      ; [Options]
                ;   L   本地时间
                ;   A   文件最后访问时间
                ;   C   文件创建时间
                ;   M   文件修改时间
                ;   LS  系统时间 (UTC)
                ;   AS  文件最后访问时间 (UTC)
                ;   CS  文件创建时间 (UTC)
                ;   MS  文件修改时间 (UTC)
                ;
$var1           ; 结果 1：日
$var2           ; 结果 2：月
$var3           ; 结果 3：年
$var4           ; 结果 4：星期名称
$var5           ; 结果 5：时
$var6           ; 结果 6：分
$var7           ; 结果 7：秒

注意：
- 文件不存在时的错误标记
- 语法错误时的错误标记

示例 (获取本地时间)：

Section
    ${GetTime} "" "L" $0 $1 $2 $3 $4 $5 $6
    ; $0="01"      日
    ; $1="04"      月
    ; $2="2005"    年
    ; $3="Friday"  星期名称
    ; $4="16"      时
    ; $5="05"      分
    ; $6="50"      秒

    MessageBox MB_OK '日期=$0/$1/$2 ($3)$\n时间=$4:$5:$6'
SectionEnd

示例 (获取文件时间)：

Section
    ${GetTime} "$WINDIR\Explorer.exe" "C" $0 $1 $2 $3 $4 $5 $6
    ; $0="12"       日
    ; $1="10"       月
    ; $2="2004"     年
    ; $3="Tuesday"  星期名称
    ; $4="2"        时
    ; $5="32"       分
    ; $6="03"       秒

    IfErrors 0 +2
    MessageBox MB_OK "错误！" IDOK +2
    MessageBox MB_OK '日期=$0/$1/$2 ($3)$\n时间=$4:$5:$6'
SectionEnd

示例 (获取系统时间)：

Section
    ${GetTime} "" "LS" $0 $1 $2 $3 $4 $5 $6
    ; $0="01"      日
    ; $1="04"      月
    ; $2="2005"    年
    ; $3="Friday"  星期名称
    ; $4="11"      时
    ; $5="05"      分
    ; $6="50"      秒

    MessageBox MB_OK '日期=$0/$1/$2 ($3)$\n时间=$4:$5:$6'
SectionEnd

示例 (将时间转换为 12 小时制 AM/PM)：

Section
    ${GetTime} "" "L" $0 $1 $2 $3 $4 $5 $6

    StrCmp $4 0 0 +3
    StrCpy $4 12
    goto +3
    StrCmp $4 12 +5
    IntCmp $4 12 0 0 +3
    StrCpy $7 AM
    goto +3
    IntOp $4 $4 - 12
    StrCpy $7 PM

    MessageBox MB_OK '日期=$0/$1/$2 ($3)$\n时间=$4:$5:$6 $7'
SectionEnd

E.1.7 GetFileAttributes

  • 获取文件或文件夹属性

语法：

${GetFileAttributes} "[File]" "[Attributes]" $var

"[File]"          ; 文件或文件夹
                  ;
"[Attributes]"    ; "ALL"  (默认)
                  ;  - 输出使用 "|" 连接的所有属性的文件
                  ;
                  ; "READONLY|HIDDEN|SYSTEM|DIRECTORY|ARCHIVE|
                  ; DEVICE|NORMAL|TEMPORARY|SPARSE_FILE|REPARSE_POINT|
                  ; COMPRESSED|OFFLINE|NOT_CONTENT_INDEXED|ENCRYPTED"
                  ;  - 文件必须拥有指定的属性
                  ;
$var              ; 结果：
                  ;    $var=attr1|attr2|... (如果使用了 "ALL")
                  ;    $var=1  文件拥有指定属性
                  ;    $var=0  文件没有指定属性

注意：
- 文件不存在时的错误标记

示例1：

Section
    ${GetFileAttributes} "C:\MSDOS.SYS" "ALL" $R0
    ; $R0=READONLY|HIDDEN|SYSTEM|ARCHIVE
SectionEnd

示例2：

Section
    ${GetFileAttributes} "C:\MSDOS.SYS" "SYSTEM|HIDDEN" $R0
    ; $R0=1
SectionEnd

示例3：

Section
    ${GetFileAttributes} "C:\MSDOS.SYS" "NORMAL" $R0
    ; $R0=0
SectionEnd

E.1.8 GetFileVersion

  • 获取可执行文件的版本信息

语法：

${GetFileVersion} "[Executable]" $var

"[Executable]"      ; 可执行文件 (*.exe *.dll ...)
$var                ; 结果：版本号

注意：
- 文件不存在时的错误标记
- 文件不含版本信息时的错误标记

示例：

Section
    ${GetFileVersion} "C:\ftp\program.exe" $R0
    ; $R0="1.1.0.12"
SectionEnd

E.1.9 GetExeName

  • 获取安装程序文件名 (在Windows 98/ME 下包括有效用例)

语法：

${GetExeName} $var

示例：

Section
    ${GetExeName} $R0
    ; $R0="C:\ftp\program.exe"
SectionEnd

E.1.10 GetExePath

  • 获取安装程序路径 (在 Windows 98/ME 下 $EXEDIR 包括有效用例)

语法：

${GetExePath} $var

示例：

Section
    ${GetExePath} $R0
    ; $R0="C:\ftp"
SectionEnd

E.1.11 GetParameters

  • 获取命令行参数

语法：

${GetParameters} $var

示例：

Section
    ${GetParameters} $R0
    ; $R0="[parameters]"
SectionEnd

E.1.12 GetOptions

  • 获取命令行参数中的选项

语法：

${GetOptions} "[Parameters]" "[Option]" $var

"[Parameters]"     ; 命令行参数
                   ;
"[Option]"         ; 选项名称
                   ;
$var               ; 结果：选项字符串

注意：
- 第一个选项符号为分隔符

示例 1：

Section
    ${GetOptions} "/INSTDIR=Temp /SILENT=yes /ADMIN=qwerty" "/ADMIN="  $R0
    ;$R0=qwerty
SectionEnd

示例 2：

Section
    ${GetOptions} "-INSTDIR=C:\Program Files\Common Files -SILENT=yes" "-INSTDIR="  $R0
    ;$R0=C:\Program Files\Common Files
SectionEnd

示例 3：

Section
    ${GetOptions} '/SILENT=yes /INSTDIR="C:/Program Files/Common Files" /ADMIN=password' "/INSTDIR="  $R0
    ;$R0=C:/Program Files/Common Files
SectionEnd

示例 4：

Section
    ${GetOptions} `-SILENT=yes -INSTDIR='"C:/Program Files/Common Files"' -ADMIN=password` "-INSTDIR="  $R0
    ;$R0="C:/Program Files/Common Files"
SectionEnd

E.1.13 GetRoot

  • 获取根路径

语法：

${GetRoot} "[FullPath]" $var

示例 1：

Section
    ${GetRoot} "C:\Program Files\NSIS" $R0
    ; $R0="C:"
SectionEnd

示例 2：

Section
    ${GetRoot} "\\SuperPimp\NSIS\Source\exehead\Ui.c" $R0
    ; $R0="\\SuperPimp\NSIS"
SectionEnd

E.1.14 GetParent

  • 获取父路径

语法：

${GetParent} "[PathString]" $var

示例：

Section
    ${GetParent} "C:\Program Files\Winamp\uninstwa.exe" $R0
    ; $R0="C:\Program Files\Winamp"
SectionEnd

E.1.15 GetFileName

  • 获取文件夹路径中的最后一部分

语法：

${GetFileName} "[PathString]" $var

示例：

Section
    ${GetFileName} "C:\Program Files\Winamp\uninstwa.exe" $R0
    ; $R0="uninstwa.exe"
SectionEnd

E.1.16 GetBaseName

  • 获取文件名不带扩展名

语法：

${GetBaseName} "[FileString]" $var

示例：

Section
    ${GetBaseName} "C:\ftp\program.exe" $R0
    ; $R0="program"
SectionEnd

E.1.17 GetFileExt

  • 获取文件扩展名

语法：

${GetFileExt} "[FileString]" $var

示例：

Section
    ${GetFileExt} "C:\ftp\program.exe" $R0
    ; $R0="exe"
SectionEnd

E.1.18 BannerTrimPath

  • 为标语修剪路径

语法：

${BannerTrimPath} "[PathString]" "[Option]" $var

"[PathString]"    ;
        ;
"[Option]"        ; [Length][A|B|C|D]
        ;
        ; Length  - 最大字符串长度
        ;   A     - 修剪中间路径 (默认)
        ;           (C:\root\...\third path)
        ;           如果 A 模式不可能将使用 B 模式
        ;   B     - 修剪右侧路径
        ;           (C:\root\second path\...)
        ;           如果 B 模式不可能将使用 C 模式
        ;   C     - 右键右侧字符串
        ;           (C:\root\second path\third p...)
        ;   D     - 右键右侧字符串和文件名
        ;           (C:\root\second p...\third path)
        ;           如果 D 模式不可能则使用 C 模式
        ;
$var    ; 结果：已修剪路径

示例：

Section
    ${BannerTrimPath} "C:\Server\Documents\Terminal\license.htm" "35A" $R0
    ;$R0=C:\Server\...\Terminal\license.htm
SectionEnd

示例 (Banner 插件)：

!include "WinMessages.nsh"
!include "FileFunc.nsh"
!insertmacro Locate

Section
    Banner::show /NOUNLOAD "准备开始..."
    Banner::getWindow /NOUNLOAD
    Pop $R1
    ${Locate} "$WINDIR" "/L=F /M=*.* /B=1" "LocateCallback"
    Banner::destroy
SectionEnd

Function LocateCallback
    StrCmp $R0 $R8 code
    StrCpy $R0 $R8
    ${BannerTrimPath} "$R8" "38B" $R8
    GetDlgItem $1 $R1 1030
    SendMessage $1 ${WM_SETTEXT} 0 "STR:$R8"

    code:
    StrCmp $R9 '' end
    ;...

    end:
    Push $0
FunctionEnd

示例 (NxS 插件)：

!include "FileFunc.nsh"
!insertmacro Locate

Section
    nxs::Show /NOUNLOAD `$(^Name) 安装`\
      /top `安装程序正在搜索某些东西。$\r$\n如果可以，请稍等。`\
      /h 1 /can 1 /end
    ${Locate} "$WINDIR" "/L=F /M=*.* /B=1" "LocateCallback"
    nxs::Destroy
SectionEnd

Function LocateCallback
    StrCmp $R0 $R8 abortcheck
    StrCpy $R0 $R8
    ${BannerTrimPath} "$R8" "55A" $R8
    nxs::Update /NOUNLOAD /sub "$R8" /pos 78 /end

    abortcheck:
    nxs::HasUserAborted /NOUNLOAD
    Pop $0
    StrCmp $0 1 0 +2
    StrCpy $0 StopLocate

    StrCmp $R9 '' end
    ;...

    end:
    Push $0
FunctionEnd

E.1.19 DirState

  • 检查文件夹是满、空还是不存在

语法：

${DirState} "[path]" $var

"[path]"      ; 文件夹
$var          ; 结果：
              ;    $var=0  (空)
              ;    $var=1  (满)
              ;    $var=-1 (文件夹未找到)

示例：

Section
    ${DirState} "$TEMP" $R0
    ; $R0="1"  文件夹已满
SectionEnd

E.1.20 RefreshShellIcons

  • 当修改文件关联后，你可以调用这个函数立即刷新程序。

语法：

${RefreshShellIcons}

示例：

Section
    WriteRegStr HKCR "Winamp.File\DefaultIcon" "" "$PROGRAMFILES\Winamp\WINAMP.EXE,2"

    ${RefreshShellIcons}
SectionEnd


文本函数头文件

E.2 文本函数头文件

E.2.1 介绍

包含头文件：

!include "TextFunc.nsh"

包含函数 "LineRead" 用于安装和 "TrimNewLines" 用于卸载：

!insertmacro LineRead
!insertmacro un.TrimNewLines

调用函数：

Section Install
    ${LineRead} "C:\a.log" "-1" $R0
    ; $R0="Last line$\r$\n"
SectionEnd

Section un.Install
    ${un.TrimNewLines} "最后一行$\r$\n" $R0
    ; $R0="Last line"
SectionEnd

E.2.2 LineFind

  • 查找文本文件中的指定行并在回调函数中编辑或者查看该行

语法：

${LineFind} "[File1]" "[File2|/NUL]" "[LineNumbers]" "Function"

"[File1]"         ; 输入文本文件
                  ;
"[File2|/NUL]"    ; [File2]
                  ;   输出文本文件
                  ;   如果为空则 File2=File1
                  ; [/NUL]
                  ;   不输出文本文件 (仅读取 File1)
                  ;
"[LineNumbers]"   ; [No|-No|No:No|{No}|{-No}|{No:No}]
                  ;   1:-1     更改所有行 (默认)
                  ;   2        从开头起第 2 行
                  ;   -3       从末尾起第 3 行
                  ;   5:9      从第 5 行到第 9 行范围
                  ;   {2}      仅输出从开头起第 2 行
                  ;   {-3}     仅输出从末尾起第 3 行
                  ;   {5:9}    仅输出从第 5 行到第 9 行范围
                  ;
"Function"        ; 指定行的回调函数

Function "Function"
    ; $R9       当前行
    ; $R8       当前行号
    ; $R7       当前负行号
    ; $R6       当前行范围
    ; $R5       要读取的文件句柄
    ; $R4       要写入的文件句柄 ($R4="" 如果指定 "/NUL")

    ; 你可以使用任何字符串函数
    ; $R0-$R3 未使用，可用于保存数据
    ; ...

    Push $var      ; 如果 $var="StopLineFind"  则退出函数
                   ; 如果 $var="SkipWrite"     则跳过当前行 (如果指定 "/NUL" 则忽略)
FunctionEnd

注意：
- 输入文件时的错误标记
- 输出文件路径不存在时的错误标记
- 必须指定为增长的范围 (2 4:5 9:-8 -5:-4 -2:-1)
- 如果没有更改，输出文件将不会更新

示例1 (删除前两个符号)：

Section
    ${LineFind} "C:\a.log" "C:\a-edited.log" "3:-1" "Example1"
    IfErrors 0 +2
    MessageBox MB_OK "错误！"
SectionEnd

Function Example1
    ${TrimNewLines} '$R9' $R9
    StrCpy $R9 $R9 '' 2
    StrCpy $R9 '$R9$\r$\n'
    ;从第三行开始并删除前两个符号

    Push $0
FunctionEnd

示例2 (显示更改的行)：

Section
    ${LineFind} "C:\a.log" "a.log" "{5:12 15 -6:-5 -1}" "Example2"
    IfErrors 0 +2
    MessageBox MB_OK "错误！"
SectionEnd

Function Example2
    ${TrimNewLines} '$R9' $R9
    StrCpy $R9 "$R9   ~已更改行 ($R8)~$\r$\n"

    Push $0
FunctionEnd

示例3 (删除行)：

Section
    ${LineFind} "C:\a.log" "\logs\a.log" "2:3 10:-5 -3:-2" "Example3"
    IfErrors 0 +2
    MessageBox MB_OK "错误！"
SectionEnd

Function Example3
    StrCpy $0 SkipWrite

    Push $0
FunctionEnd

示例4 (插入行)：

Section
    ${LineFind} "C:\a.log" "" "10" "Example4"
    IfErrors 0 +2
    MessageBox MB_OK "错误！"
SectionEnd

Function Example4
    FileWrite $R4 "---第一行---$\r$\n"
    FileWrite $R4 "---第二行...---$\r$\n"

    Push $0
FunctionEnd

示例5 (带更改行数的文件内容替换 - 需要 "WordFunc.nsh")：

!include "WordFunc.nsh"
!insertmacro WordReplace

Section
    StrCpy $R0 0
    ${LineFind} "C:\a.log" "C:\logs\a.log" "1:-1" "Example5"
    IfErrors 0 +2
    MessageBox MB_OK "错误！" IDOK +2
    MessageBox MB_OK "已更改行数=$R0"
SectionEnd

Function Example5
    StrCpy $1 $R9

    ${WordReplace} '$R9' ' ' '_' '+*' $R9

    StrCmp $1 $R9 +2
    IntOp $R0 $R0 + 1
    ;$R0   已更改行数

    Push $0
FunctionEnd

示例6 (要裁剪或删除的行字符串)：

Section
    ${LineFind} "\a.log" "C:\logs\a.log" "" "Example6"
    IfErrors 0 +2
    MessageBox MB_OK "错误！" IDOK +2
    MessageBox MB_OK "已处理行数=$R1:$R2"
SectionEnd

Function Example6
    ;(裁剪从一行到另外一行的几行 (也包括那一行))
    StrCmp $R0 finish stop
    StrCmp $R0 start finish
    StrCmp $R9 '开始行$\r$\n' 0 skip
    StrCpy $R0 start
    StrCpy $R1 $R8
    goto code
    finish:
    StrCmp $R9 '完成行$\r$\n' 0 code
    StrCpy $R0 finish
    StrCpy $R2 $R8
    goto code
    skip:
    StrCpy $0 SkipWrite
    goto output
    stop:
    StrCpy $0 StopLineFind
    goto output

    ;;(删除从一行到另外一行的几行 (也包括那一行))
    ; StrCmp $R0 finish code
    ; StrCmp $R0 start finish
    ; StrCmp $R9 '开始行$\r$\n' 0 code
    ; StrCpy $R0 start
    ; StrCpy $R1 $R8
    ; goto skip
    ; finish:
    ; StrCmp $R9 '完成行$\r$\n' 0 skip
    ; StrCpy $R0 finish
    ; StrCpy $R2 $R8
    ; skip:
    ; StrCpy $0 SkipWrite
    ; goto output

    code:
    ;...

    output:
    Push $0
FunctionEnd

示例7 (读取行)：

Section
    ${LineFind} "C:\a.log" "/NUL" "1:-1" "Example7"
    IfErrors 0 +2
    MessageBox MB_OK "错误！"
SectionEnd

Function Example7
    MessageBox MB_OKCANCEL '$$R9  "Line"=[$R9]$\n$$R8     "#" =[$R8]' IDOK +2
    StrCpy $0 StopLineFind

    Push $0
FunctionEnd

E.2.3 LineRead

  • 获取文件中指定行号的内容

语法：

${LineRead} "[File]" "[LineNumber]" $var

"[File]"         ; 输入文本文件
                 ;
"[LineNumber]"   ; [No|-No]
                 ;   3    从开头起行号
                 ;   -5   从结尾起行号
                 ;
$var             ; 结果：行内容

注意：
- 输入文件时的错误标记
- 行号未找到时的错误标记

示例：

Section
    ${LineRead} "C:\a.log" "-1" $R0
    ; $R0="Last line$\r$\n"
SectionEnd

E.2.4 FileReadFromEnd

  • 从末尾起逐行读取文本文件

语法：

${FileReadFromEnd} "[File]" "Function"

"[File]"      ; 输入文本文件
"Function"    ; 回调函数

Function "Function"
    ; $9       当前行
    ; $8       当前行号
    ; $7       当前负行号

    ; $R0-$R9 未使用，可用于保存数据
    ; ...

    Push $var      ; 如果 $var="StopFileReadFromEnd" 则退出函数
FunctionEnd

注意：
- 文件不存在时的错误标记

示例1：

Section
    ${FileReadFromEnd} "C:\a.log" "Example1"

    IfErrors 0 +2
    MessageBox MB_OK "错误！"
SectionEnd

Function Example1
    MessageBox MB_OKCANCEL '"Line"=[$9]$\n   "#"=[$8]$\n  "-#"=[$7]' IDOK +2
    StrCpy $0 StopFileReadFromEnd

    Push $0
FunctionEnd

示例2 (保留文本文件)：

Section
    GetTempFileName $R0
    FileOpen $R1 $R0 w
    ${FileReadFromEnd} "C:\a.log" "Example2"
    FileClose $R1

    IfErrors 0 +2
    MessageBox MB_OK "错误！" IDOK +2
    Exec '"notepad.exe" "$R0"'
SectionEnd

Function Example2
    StrCmp $7 -1 0 +5
    StrCpy $1 $9 1 -1
    StrCmp $1 '$\n' +3
    StrCmp $1 '$\r' +2
    StrCpy $9 '$9$\r$\n'

    FileWrite $R1 "$9"

    Push $0
FunctionEnd

E.2.5 LineSum

  • 获取文本文件的行数

语法：

${LineSum} "[File]" $var

"[File]"      ; 输入文件
$var          ; 结果：行数

注意：
- 文件不存在时的错误标记

示例：

Section
    ${LineSum} "C:\a.log" $R0
    ; $R0="54"
SectionEnd

E.2.6 FileJoin

  • 将两个文件合并为一个 (File1 + File2 = File3)

语法：

${FileJoin} "[File1]" "[File2]" "[File3]"

"[File1]"     ; 输入文件1
"[File2]"     ; 输入文件2
"[File3]"     ; 输出文件3
              ;  如果 [File3]="" 则增加 [File2] 到 [File1]

注意：
- 输入文件不存在时的错误标记
- 输出文件路径不存在时的错误标记

示例1 (合并：a.log + b.log = Z.log)：

Section
    ${FileJoin} "C:\a.log" "C:\logs\b.log" "C:\Z.log"
SectionEnd

示例2 (增加：a.log + b.log = a.log)：

Section
    ${FileJoin} "C:\a.log" "C:\logs\b.log" "C:\a.log"
SectionEnd

E.2.7 TextCompare

  • 比较两个文本文件

语法：

${TextCompare} "[File1]" "[File2]" "[Option]" "Function"

"[File1]"     ; File1      比较这些行
"[File2]"     ; File2      与这些行比较
"[Options]"   ; (逐行)：
              ; FastDiff   比较第 N 行 (File1) 与第 N 行 (File2)，
              ;            如果找到不同行，调用函数。
              ; FastEqual  比较第 N 行 (File1) 与第 N 行 (File2)，
              ;            如果找到相同行，调用函数。
              ; (独立行数)：
              ; SlowDiff   比较第 N 行 (File1) 与所有行 (File2)，
              ;            如果第 N 行 (File1) 不同，调用函数。
              ; SlowEqual  比较第 N 行 (File1) 与所有行 (File2)，
              ;            如果第 N 行 (File1) 相同，调用函数。
"Function"    ; 回调函数

Function "Function"
    ; $9    "File1 行"
    ; $8    "行号"
    ; $7    "File2 行" (如果指定 SlowDiff 则为空)
    ; $6    "行号" (如果指定 SlowDiff 则为空)

    ; $R0-$R9 未使用，可用于保存数据
    ; ...

    Push $var    ; 如果 $var="StopTextCompare" 则退出函数
FunctionEnd

注意：
- 文件 1 或文件 2 不存在时的错误标记
- 语法错误时的错误标记

示例 (不同或相等)：

Section
    StrCpy $R0 ''
    ${TextCompare} "C:\1.txt" "C:\2.txt" "FastDiff" "Example1"
    IfErrors 0 +2
    MessageBox MB_OK "错误！" IDOK +4

    StrCmp $R0 NotEqual 0 +2
    MessageBox MB_OK "文件不同！" IDOK +2
    MessageBox MB_OK "文件完全相同！"
SectionEnd

Function Example1
    StrCpy $R0 NotEqual
    StrCpy $0 StopTextCompare

    Push $0
FunctionEnd

示例 (逐行比较 - 不同)：

Section
    StrCpy $R0 'Text1.txt'
    StrCpy $R1 'Text2.txt'

    GetTempFileName $R2
    FileOpen $R3 $R2 w
    FileWrite $R3 "$R0 | $R1$\r$\n"
    ${TextCompare} "$R0" "$R1" "FastDiff" "Example2"
    IfErrors 0 +2
    MessageBox MB_OK "错误！" IDOK +2

    Exec "notepad.exe $R2"
FunctionEnd

Function Example2
    FileWrite $R3 '$8=$9'
    FileWrite $R3 '$6=$7$\r$\n'

    Push $0
FunctionEnd

示例 (逐行比较 - 相同)：

Section
    StrCpy $R0 'Text1.txt'
    StrCpy $R1 'Text2.txt'

    GetTempFileName $R2
    FileOpen $R3 $R2 w
    FileWrite $R3 "$R0 | $R1$\r$\n"
    ${TextCompare} "$R0" "$R1" "FastEqual" "Example3"
    IfErrors 0 +2
    MessageBox MB_OK "错误！" IDOK +2

    Exec "notepad.exe $R2"
FunctionEnd

Function Example3
    FileWrite $R3 '$8|$6=$9'

    Push $0
FunctionEnd

示例 (比较所有行 - 不同)：

Section
    StrCpy $R0 'Text1.txt'
    StrCpy $R1 'Text2.txt'

    GetTempFileName $R2
    FileOpen $R3 $R2 w
    FileWrite $R3 "$R0 | $R1$\r$\n"
    ${TextCompare} "$R0" "$R1" "SlowDiff" "Example4"
    IfErrors 0 +2
    MessageBox MB_OK "错误！" IDOK end

    FileWrite $R3 "$\r$\n$R1 | $R0$\r$\n"
    ${TextCompare} "$R1" "$R0" "SlowDiff" "Example4"
    FileClose $R3
    IfErrors 0 +2
    MessageBox MB_OK "错误！" IDOK end

    Exec "notepad.exe $R2"

    end:
FunctionEnd

Function Example4
    FileWrite $R3 '$8=$9'

    Push $0
FunctionEnd

示例 (比较所有行 - 相同)：

Section
    StrCpy $R0 'Text1.txt'
    StrCpy $R1 'Text2.txt'

    GetTempFileName $R2
    FileOpen $R3 $R2 w
    FileWrite $R3 "$R0 | $R1$\r$\n"
    ${TextCompare} "$R0" "$R1" "SlowEqual" "Example5"
    IfErrors 0 +2
    MessageBox MB_OK "错误！" IDOK +2

    Exec "notepad.exe $R2"
FunctionEnd

Function Example5
    FileWrite $R3 '$8|$6=$9'

    Push $0
FunctionEnd

示例 (显示变量)：

Section
    ${TextCompare} "C:\1.txt" "C:\2.txt" "FastDiff" "Example6"

    IfErrors 0 +2
    MessageBox MB_OK "错误！"
SectionEnd

Function Example6
    MessageBox MB_OKCANCEL '$$9    "文件1行" =[$9]$\n$$8    "行号#"      =[$8]$\n$$7    "文件2行" =[$7]$\n$$6    "行号#"      =[$6]' IDOK +2
    StrCpy $0 StopTextCompare

    Push $0
FunctionEnd

E.2.8 ConfigRead

  • 读取配置文件中项名称的值

语法：

${ConfigRead} "[File]" "[Entry]" $var

"[File]"      ; 配置文件
              ;
"[Entry]"     ; 项名称
              ;
$var          ; 结果：值

注意：
- 文件不存在时的错误标记

示例1：

Section
    ${ConfigRead} "C:\AUTOEXEC.BAT" "SET winbootdir=" $R0
    ;$R0=C:\WINDOWS
SectionEnd

示例2：

Section
    ${ConfigRead} "C:\apache\conf\httpd.conf" "Timeout " $R0
    ;$R0=30
SectionEnd

E.2.9 ConfigWrite

  • 写入配置文件中项名称的值

语法：

${ConfigWrite} "[File]" "[Entry]" "[Value]" $var

"[File]"      ; 配置文件
              ;
"[Entry]"     ; 项名称
              ;
"[Value]"     ; 值名称
              ;  如果为 "" 则删除项
              ;
$var          ; 结果：
              ;    $var=CHANGED  值已写入
              ;    $var=DELETED  项已删除
              ;    $var=ADDED    项和值已添加
              ;    $var=SAME     项和值已存在

注意：
- 文件不存在时的错误标记
- 文件不能打开时的错误标记

示例1：

Section
    ${ConfigWrite} "C:\AUTOEXEC.BAT" "SET winbootdir=" "D:\WINDOWS" $R0
    ;$R0=CHANGED
SectionEnd

示例2：

Section
    ${ConfigWrite} "C:\apache\conf\httpd.conf" "Timeout " "30" $R0
    ;$R0=SAME
SectionEnd

示例3：

Section
    ${ConfigWrite} "C:\apache\conf\httpd.conf" "Timeout " "" $R0
    ;$R0=DELETED
SectionEnd

E.2.10 FileRecode

  • 将文本文件从 DOS 重新编码为 Windows 格式，反之亦然。

语法：

${FileRecode} "[File]" "[Format]"

"[File]"        ;
                ;
"[Format]"      ; OemToChar   - 从 DOS 到 Windows
                ; CharToOem   - 从 Windows 到 DOS

注意：
- 文件不存在时的错误标记
- 语法错误时的错误标记

示例：

Section
    ${FileRecode} "C:\SCANDISK.LOG" "CharToOem"
SectionEnd

E.2.11 TrimNewLines

  • 修剪字符串中的新行

语法：

${TrimNewLines} "[string]" $var

"[string]"    ; 输入字符串
$var          ; 结果：结尾不带 '$\r' 和 '$\n' 的字符串

示例：

Section
    ${TrimNewLines} "文字行$\r$\n" $R0
    ; $R0="文字行"
SectionEnd


Word Functions Header

E.3 文字函数头文件

E.3.1 介绍

包含头文件：

!include "WordFunc.nsh"

包含函数 "WordFind" 用于安装和 "WordReplace" 用于卸载：

!insertmacro WordFind
!insertmacro un.WordReplace

调用函数：

Section Install
    ${WordFind} "A--H---S" "-" "+2" $R0
    ; $R0="H"
SectionEnd

Section un.Install
    ${un.WordReplace} "A--H---S" "-" "x" "+3*" $R0
    ; $R0="A--HxS"
SectionEnd

E.3.2 WordFind

  • 多功能字符串函数
字符串：
"[word+1][delimiter][word+2][delimiter][word+3]..."
"[delimiter][word+1][delimiter][word+2][delimiter]..."
"[delimiter][delimiter][word+1][delimiter][delimiter][delimiter]..."
"...[word-3][delimiter][word-2][delimiter][word-1]"
"...[delimiter][word-2][delimiter][word-1][delimiter]"
"...[delimiter][delimiter][word-1][delimiter][delimiter][delimiter]"

语法：

${WordFind} "[string]" "[delimiter]" "[E][options]" $var

"[string]"         ;[string]
                   ;  输入字符串
"[delimiter]"      ;[delimiter]
                   ;  一个或多个符号
"[E][options]"     ;[options]
                   ;  +number   ：从开始起的词语序号
                   ;  -number   ：从结尾起的词语序号
                   ;  +number}  ：分隔符序号，输出从开始起此分隔符之后的范围
                   ;  +number{  ：分隔符序号，输出从开始起此分隔符之前的范围
                   ;  +number}} ：词语序号，输出从开始起此词语之后的范围
                   ;  +number{{ ：词语序号，输出从开始起此词语之前的范围
                   ;  +number{} ：词语序号，输出从开始起此词语之前和之后的范围 (词语排除)
                   ;  +number*} ：词语序号，带词语输出从开始起此词语之后的范围
                   ;  +number{* ：词语序号，带词语输出从开始起此词语之前的范围
                   ;  #         ：输出词语总数量
                   ;  *         ：输出分隔符总数量
                   ;  /word     ：输出词语序号
                   ;
                   ;[E]
                   ;  带错误级别输出
                   ;  IfErrors:
                   ;     $var=1  未找到分隔符
                   ;     $var=2  没有该词语序号
                   ;     $var=3  语法错误 (使用：+1、-1}、#、*、/word 等...)
                   ;[]
                   ;  无错误级别输出 (默认)
                   ;  如果出现错误则 (结果=输入字符串)
                   ;
$var               ;输出 (结果)

注意：
- 可接受数字 1、01、001...

示例 (通过符号查找词语)：

Section
    ${WordFind} "C:\io.sys C:\Program Files C:\WINDOWS" " C:\" "-02" $R0
    ; $R0="Program Files"
SectionEnd

示例 (排除分隔符)：

Section
    ${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" "sys" "-2}" $R0
    ; $R0=" C:\logo.sys C:\WINDOWS"
SectionEnd

示例 (词语总数量)：

Section
    ${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" " C:\" "#" $R0
    ; $R0="3"
SectionEnd

示例 (分隔符总数量)：

Section
    ${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" "sys" "*" $R0
    ; $R0="2"
SectionEnd

示例 (查找词语序号)：

Section
    ${WordFind} "C:\io.sys C:\Program Files C:\WINDOWS" " " "/Files" $R0
    ; $R0="3"
SectionEnd

示例 ( }} )：

Section
    ${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" " " "+2}}" $R0
    ; $R0=" C:\WINDOWS"
SectionEnd

示例 ( {} )：

Section
    ${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" " " "+2{}" $R0
    ; $R0="C:\io.sys C:\WINDOWS"
SectionEnd

示例 ( *} )：

Section
    ${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" " " "+2*}" $R0
    ; $R0="C:\logo.sys C:\WINDOWS"
SectionEnd

示例 (获取父路径)：

Section
    StrCpy $R0 "C:\Program Files\NSIS\NSIS.chm"
;	           "C:\Program Files\NSIS\Include\"
;	           "C:\\Program Files\\NSIS\\NSIS.chm"

    ${WordFind} "$R0" "\" "-2{*" $R0
    ; $R0="C:\Program Files\NSIS"
    ;     "C:\\Program Files\\NSIS"
SectionEnd

示例 (坐标)：

Section
    ${WordFind} "C:\io.sys C:\logo.sys C:\WINDOWS" ":\lo" "E+1{" $R0
    ; $R0="C:\io.sys C"
    IfErrors end

    StrLen $0 $R0             ; $0 = 词语开始位置 (11)
    StrLen $1 ':\lo'          ; $1 = 词语长度 (4)
    ; StrCpy $R0 $R1 $1 $0    ; $R0 = :\lo

    end:
SectionEnd

示例 (带错误级别输出)：

Section
    ${WordFind} "[string]" "[delimiter]" "E[options]" $R0

    IfErrors 0 end
    StrCmp $R0 1 0 +2       ; 错误级别 1？
    MessageBox MB_OK '未找到分隔符！' IDOK end
    StrCmp $R0 2 0 +2       ; 错误级别 2？
    MessageBox MB_OK '没有该词语序号！' IDOK end
    StrCmp $R0 3 0 +2       ; 错误级别 3？
    MessageBox MB_OK '语法错误！'

    end:
SectionEnd

示例 (不带错误级别输出)：

Section
    ${WordFind} "C:\io.sys C:\logo.sys" "_" "+1" $R0

    ; $R0="C:\io.sys C:\logo.sys" (error: delimiter "_" not found)
SectionEnd

示例 (如果找到)：

Section
    ${WordFind} "C:\io.sys C:\logo.sys" ":\lo" "E+1{" $R0

    IfErrors notfound found
    found:
    MessageBox MB_OK '找到！' IDOK end
    notfound:
    MessageBox MB_OK '未找到！'

    end:
SectionEnd

示例 (如果找到 2)：

Section
    ${WordFind} "C:\io.sys C:\logo.sys" ":\lo" "+1{" $R0

    StrCmp $R0 "C:\io.sys C:\logo.sys" notfound found        ; error?
    found:
    MessageBox MB_OK '找到！' IDOK end
    notfound:
    MessageBox MB_OK '未找到！'

    end:
SectionEnd

示例 (如果未找到分隔符则接受字符串中的一个词语)：

Section
    StrCpy $0 'OneWord'
    StrCpy $1 1

    loop:
    ${WordFind} "$0" " " "E+$1" $R0
    IfErrors 0 code
    StrCmp $1$R0 11 0 error
    StrCpy $R0 $0
    goto end

    code:
    ; ...
    IntOp $1 $1 + 1
    goto loop

    error:
    StrCpy $1 ''
    StrCpy $R0 ''

    end:
    ; $R0="OneWord"
SectionEnd

E.3.3 WordFindS

  • 同 WordFind，但是区分大小写。

E.3.4 WordFind2X

  • 查找位于两个分隔符之间的词语。
字符串：
"[delimiter1][word+1][delimiter2][delimiter1][word+2][delimiter2]..."
"[text][delimiter1][text][delimiter1][word+1][delimiter2][text]..."
"...[delimiter1][word-2][delimiter2][delimiter1][word-1][delimiter2]"
"...[text][delimiter1][text][delimiter1][word-1][delimiter2][text]"

语法：

${WordFind2X} "[string]" "[delimiter1]" "[delimiter2]" "[E][options]" $var

"[string]"         ;[string]
                   ;  输入字符串
"[delimiter1]"     ;[delimiter1]
                   ;  第一个分隔符
"[delimiter2]"     ;[delimiter2]
                   ;  第二个分隔符
"[E][options]"     ;[options]
                   ;  +number   ：从开始起的词语序号
                   ;  -number   ：从结尾起的词语序号
                   ;  +number}} ：词语序号，输出从开始起此词语之后的范围
                   ;  +number{{ ：词语序号，输出从开始起此词语之前的范围
                   ;  +number{} ：词语序号，输出从开始起此词语之前和之后的范围 (词语排除)
                   ;  +number*} ：词语序号，带词语输出从开始起此词语之后的范围
                   ;  +number{* ：词语序号，带词语输出从开始起此词语之前的范围
                   ;  #         ：输出词语总数量
                   ;  /word     ：输出词语序号
                   ;
                   ;[E]
                   ;  带错误级别输出
                   ;  IfErrors:
                   ;     $var=1  未找到词语
                   ;     $var=2  没有该词语序号
                   ;     $var=3  语法错误 (使用：+1、-1、#)
                   ;[]
                   ;  无错误级别输出 (默认)
                   ;  如果出现错误则 (结果=输入字符串)
                   ;
$var               ;输出 (结果)

示例 (1)：

Section
    ${WordFind2X} "[C:\io.sys];[C:\logo.sys];[C:\WINDOWS]" "[C:\" "];" "+2" $R0
    ; $R0="logo.sys"
SectionEnd

示例 (2)：

Section
    ${WordFind2X} "C:\WINDOWS C:\io.sys C:\logo.sys" "\" "." "-1" $R0
    ; $R0="logo"
SectionEnd

示例 (3)：

Section
    ${WordFind2X} "C:\WINDOWS C:\io.sys C:\logo.sys" "\" "." "-1{{" $R0
    ; $R0="C:\WINDOWS C:\io.sys C:"
SectionEnd

示例 (4)：

Section
    ${WordFind2X} "C:\WINDOWS C:\io.sys C:\logo.sys" "\" "." "-1{}" $R0
    ; $R0="C:\WINDOWS C:\io.sys C:sys"
SectionEnd

示例 (5)：

Section
    ${WordFind2X} "C:\WINDOWS C:\io.sys C:\logo.sys" "\" "." "-1{*" $R0
    ; $R0="C:\WINDOWS C:\io.sys C:\logo."
SectionEnd

示例 (6)：

Section
    ${WordFind2X} "C:\WINDOWS C:\io.sys C:\logo.sys" "\" "." "/logo" $R0
    ; $R0="2"
SectionEnd

示例 (带错误级别输出)：

Section
    ${WordFind2X} "[io.sys];[C:\logo.sys]" "\" "];" "E+1" $R0
    ; $R0="1" ("\...];" 未找到)

    IfErrors 0 noerrors
    MessageBox MB_OK '错误级别=$R0' IDOK end

    noerrors:
    MessageBox MB_OK '没有错误！'

    end:
SectionEnd

E.3.5 WordFind2XS

  • 同 WordFind2X，但是区分大小写。

E.3.6 WordFind3X

  • 查找位于两个分隔符之间包含一个字符串的词语

语法：

${WordFind3X} "[string]" "[delimiter1]" "[center]" "[delimiter2]" "[E][options]" $var

"[string]"         ;[string]
                   ;  输入字符串
"[delimiter1]"     ;[delimiter1]
                   ;  第一个字符串
"[center]"         ;[center]
                   ;  中间字符串
"[delimiter2]"     ;[delimiter2]
                   ;  第二个字符串
"[E][options]"     ;[options]
                   ;  +number   ：从开始起的词语序号
                   ;  -number   ：从结尾起的词语序号
                   ;  +number}} ：词语序号，输出从开始起此词语之后的范围
                   ;  +number{{ ：词语序号，输出从开始起此词语之前的范围
                   ;  +number{} ：词语序号，输出从开始起此词语之前和之后的范围 (词语排除)
                   ;  +number*} ：词语序号，带词语输出从开始起此词语之后的范围
                   ;  +number{* ：词语序号，带词语输出从开始起此词语之前的范围
                   ;  #         ：输出词语总数量
                   ;  /word     ：输出词语序号
                   ;
                   ;[E]
                   ;  带错误级别输出
                   ;  IfErrors:
                   ;     $var=1  未找到词语
                   ;     $var=2  没有该词语序号
                   ;     $var=3  语法错误 (使用：+1、-1、#)
                   ;[]
                   ;  无错误级别输出 (默认)
                   ;  如果出现错误则 (结果=输入字符串)
                   ;
$var               ;输出 (结果)

示例 (1)：

Section
    ${WordFind3X} "[1.AAB];[2.BAA];[3.BBB];" "[" "AA" "];" "+1" $R0
    ; $R0="1.AAB"
SectionEnd

示例 (2)：

Section
    ${WordFind3X} "[1.AAB];[2.BAA];[3.BBB];" "[" "AA" "];" "-1" $R0
    ; $R0="2.BAA"
SectionEnd

示例 (3)：

Section
    ${WordFind3X} "[1.AAB];[2.BAA];[3.BBB];" "[" "AA" "];" "-1{{" $R0
    ; $R0="[1.AAB];"
SectionEnd

示例 (4)：

Section
    ${WordFind3X} "[1.AAB];[2.BAA];[3.BBB];" "[" "AA" "];" "-1{}" $R0
    ; $R0="[1.AAB];[3.BBB];"
SectionEnd

示例 (5)：

Section
    ${WordFind3X} "[1.AAB];[2.BAA];[3.BBB];" "[" "AA" "];" "-1{*" $R0
    ; $R0="[1.AAB];[2.BAA];"
SectionEnd

示例 (6)：

Section
    ${WordFind3X} "[1.AAB];[2.BAA];[3.BBB];" "[" "AA" "];" "/2.BAA" $R0
    ; $R0="2"
SectionEnd

示例 (带错误级别输出)：

Section
    ${WordFind3X} "[1.AAB];[2.BAA];[3.BBB];" "[" "XX" "];" "E+1" $R0
    ; $R0="1" ("[...XX...];" not found)

    IfErrors 0 noerrors
    MessageBox MB_OK '错误级别=$R0' IDOK end

    noerrors:
    MessageBox MB_OK '没有错误！'

    end:
SectionEnd

E.3.7 WordFind3XS

  • 同 WordFind3X，但是区分大小写。

E.3.8 WordReplace

  • 从字符串中替换或删除词语

语法：

${WordReplace} "[string]" "[word1]" "[word2]" "[E][options]" $var

"[string]"         ;[string]
                   ;  输入字符串
"[word1]"          ;[word1]
                   ;  要删除或替换的词语
"[word2]"          ;[word2]
                   ;  被替换的字符串 (如果为空则删除)
"[E][options]"     ;[options]
                   ;  +number  ：从开始起的词语序号
                   ;  -number  ：从结尾起的词语序号
                   ;  +number* ：从开始起的词语序号，多次替换
                   ;  -number* ：从结尾起的词语序号，多次替换
                   ;  +        ：替换或删除所有找到的字符串
                   ;  +*       ：多次替换所有找到的字符串
                   ;  {}       ：如果存在则从两端替换或删除所有分隔符 (无错误级别输出)
                   ;  {}*      ：如果存在则从两端多次替换所有分隔符 (无错误级别输出)
                   ;
                   ;[E]
                   ;  带错误级别输出
                   ;  IfErrors:
                   ;     $var=1  没有找到要删除或替换的词语
                   ;     $var=2  没有该词语序号
                   ;     $var=3  语法错误 (使用：+1、-1、+1*、-1*、+、+*、{}、{}*)
                   ;[]
                   ;  无错误级别输出 (默认)
                   ;  如果出现错误则 (结果=输入字符串)
                   ;
$var               ;输出 (结果)

示例 (替换)：

Section
    ${WordReplace} "C:\io.sys C:\logo.sys C:\WINDOWS" "SYS" "bmp" "+2" $R0
    ; $R0="C:\io.sys C:\logo.bmp C:\WINDOWS"
SectionEnd

示例 (删除)：

Section
    ${WordReplace} "C:\io.sys C:\logo.sys C:\WINDOWS" "SYS" "" "+" $R0
    ; $R0="C:\io. C:\logo. C:\WINDOWS"
SectionEnd

示例 (多次替换 1)：

Section
    ${WordReplace} "C:\io.sys      C:\logo.sys   C:\WINDOWS" " " " " "+1*" $R0
    ; +1* 或 +2* 或 +3* 或 +4* 或 +5* 或 +6*
    ; $R0="C:\io.sys C:\logo.sys   C:\WINDOWS"
SectionEnd

示例 (多次替换 2)：

Section
    ${WordReplace} "C:\io.sys C:\logo.sysSYSsys C:\WINDOWS" "sys" "bmp" "+*" $R0
    ; $R0="C:\io.bmp C:\logo.bmp C:\WINDOWS"
SectionEnd

示例 (多次替换 3)：

Section
    ${WordReplace} "sysSYSsysC:\io.sys C:\logo.sys C:\WINDOWSsysSYSsys" "sys" "|" "{}*" $R0
    ; $R0="|C:\io.sys C:\logo.sys C:\WINDOWS|"
SectionEnd

示例 (带错误级别输出)：

Section
    ${WordReplace} "C:\io.sys C:\logo.sys" "sys" "bmp" "E+3" $R0
    ; $R0="2" (没有该词语序号 "+3")

    IfErrors 0 noerrors
    MessageBox MB_OK '错误级别=$R0' IDOK end

    noerrors:
    MessageBox MB_OK '没有错误！'

    end:
SectionEnd

E.3.9 WordReplaceS

  • 同 WordReplace，但是区分大小写。

E.3.10 WordAdd

  • 从字符串 2 添加词语 (如果不存在) 到字符串 1，或删除词语 (如果存在)

语法：

${WordAdd} "[string1]" "[delimiter]" "[E][options]" $var

"[string1]"          ;[string1]
                     ;  用于添加或删除的字符串
"[delimiter]"        ;[delimiter]
                     ;  一个或多个符号
"[E][options]"       ;[options]
                     ;  +string2 ：添加的词语
                     ;  -string2 ：删除的词语
                     ;
                     ;[E]
                     ;  带错误级别输出
                     ;  IfErrors:
                     ;     $var=1  分隔符为空
                     ;     $var=3  语法错误 (使用：+text、-text)
                     ;[]
                     ;  无错误级别输出 (默认)
                     ;  如果出现错误则 (结果=输入字符串)
                     ;
$var                 ;输出 (结果)

示例 (添加)：

Section
    ${WordAdd} "C:\io.sys C:\WINDOWS" " " "+C:\WINDOWS C:\config.sys" $R0
    ; $R0="C:\io.sys C:\WINDOWS C:\config.sys"
SectionEnd

示例 (删除)：

Section
    ${WordAdd} "C:\io.sys C:\logo.sys C:\WINDOWS" " " "-C:\WINDOWS C:\config.sys C:\IO.SYS" $R0
    ; $R0="C:\logo.sys"
SectionEnd

示例 (添加到一个)：

Section
    ${WordAdd} "C:\io.sys" " " "+C:\WINDOWS C:\config.sys C:\IO.SYS" $R0
    ; $R0="C:\io.sys C:\WINDOWS C:\config.sys"
SectionEnd

示例 (删除一个)：

Section
    ${WordAdd} "C:\io.sys C:\logo.sys C:\WINDOWS" " " "-C:\WINDOWS" $R0
    ; $R0="C:\io.sys C:\logo.sys"
SectionEnd

示例 (没有找到新词语)：

Section
    ${WordAdd} "C:\io.sys C:\logo.sys" " " "+C:\logo.sys" $R0
    StrCmp $R0 "C:\io.sys C:\logo.sys" 0 +2
    MessageBox MB_OK "没有找到要添加的新词语！"
SectionEnd

示例 (没有删除词语)：

Section
    ${WordAdd} "C:\io.sys C:\logo.sys" " " "-C:\config.sys" $R0
    StrCmp $R0 "C:\io.sys C:\logo.sys" 0 +2
    MessageBox MB_OK "没有找到要删除的词语！"
SectionEnd

示例 (带错误级别输出)：

Section
    ${WordAdd} "C:\io.sys C:\logo.sys" "" "E-C:\logo.sys" $R0
    ; $R0="1" (分隔符为空 "")

    IfErrors 0 noerrors
    MessageBox MB_OK '错误级别=$R0' IDOK end

    noerrors:
    MessageBox MB_OK '没有错误！'

    end:
SectionEnd

E.3.11 WordAddS

  • 同 WordAdd，但是区分大小写。

E.3.12 WordInsert

  • 在字符串中插入词语

语法：

${WordInsert} "[string]" "[delimiter]" "[word]" "[E][options]" $var

"[string]"          ;[string]
                    ;  输入字符串
"[delimiter]"       ;[delimiter]
                    ;  一个或多个符号
"[word]"            ;[word]
                    ;  要插入的词语
"[E][options]"      ;[options]
                    ;  +number  ：从开始起的词语序号
                    ;  -number  ：从结尾起的词语序号
                    ;
                    ;[E]
                    ;  带错误级别输出
                    ;  IfErrors:
                    ;     $var=1  分隔符为空
                    ;     $var=2  错误的词语序号
                    ;     $var=3  语法错误 (使用：+1、-1)
                    ;[]
                    ;  无错误级别输出 (默认)
                    ;  如果出现错误则 (结果=输入字符串)
                    ;
$var                ;输出 (结果)

示例 (1)：

Section
    ${WordInsert} "C:\io.sys C:\WINDOWS" " " "C:\logo.sys" "-2" $R0
    ; $R0="C:\io.sys C:\logo.sys C:\WINDOWS"
SectionEnd

示例 (2)：

Section
    ${WordInsert} "C:\io.sys" " " "C:\WINDOWS" "+2" $R0
    ; $R0="C:\io.sys C:\WINDOWS"
SectionEnd

示例 (3)：

Section
    ${WordInsert} "" " " "C:\WINDOWS" "+1" $R0
    ; $R0="C:\WINDOWS "
SectionEnd

示例 (带错误级别输出)：

Section
    ${WordInsert} "C:\io.sys C:\logo.sys" " " "C:\logo.sys" "E+4" $R0
    ; $R0="2" (错误的词语序号 "+4")

    IfErrors 0 noerrors
    MessageBox MB_OK '错误级别=$R0' IDOK end

    noerrors:
    MessageBox MB_OK '没有错误！'

    end:
SectionEnd

E.3.13 WordInsertS

  • 同 WordInsert，但是区分大小写。

E.3.14 StrFilter

  • 转换字符串为大写或小写
  • 设置符号过滤

语法：

${StrFilter} "[string]" "[options]" "[symbols1]" "[symbols2]" $var

"[string]"       ;[string]
                 ;  输入字符串
                 ;
"[options]"      ;[+|-][1|2|3|12|23|31][eng|rus]
                 ;  +   ：将字符串转为大写
                 ;  -   ：将字符串转为小写
                 ;  1   ：仅数字
                 ;  2   ：仅字母
                 ;  3   ：仅特殊字符
                 ;  12  ：仅数字 + 字母
                 ;  23  ：仅字母 + 特殊字符
                 ;  31  ：仅特殊字符 + 数字
                 ;  eng ：英语符号 (默认)
                 ;  rus ：俄语符号
                 ;
"[symbols1]"     ;[symbols1]
                 ;  包含符号 (不改变)
                 ;
"[symbols2]"     ;[symbols2]
                 ;  排除符号
                 ;
$var             ;输出 (结果)

注意：
- 语法错误时的错误标志
- 包含和排除同样的符号 = 排除符号

示例 (大写)：

Section
    ${StrFilter} "123abc 456DEF 7890|%#" "+" "" "" $R0
    ; $R0="123ABC 456DEF 7890|%#"
SectionEnd

示例 (小写)：

Section
    ${StrFilter} "123abc 456DEF 7890|%#" "-" "ef" "" $R0
    ; $R0="123abc 456dEF 7890|%#"
SectionEnd

示例 (过滤1)：

Section
    ${StrFilter} "123abc 456DEF 7890|%#" "2" "|%" "" $R0
    ; $R0="abcDEF|%"       ;仅字母 + |%
SectionEnd

示例 (过滤2)：

Section
    ${StrFilter} "123abc 456DEF 7890|%#" "13" "af" "4590" $R0
    ; $R0="123a 6F 78|%#"  ;仅数字+ 特殊字符 + af - 4590
SectionEnd

示例 (过滤3)：

Section
    ${StrFilter} "123abc 456DEF 7890|%#" "+12" "b" "def" $R0
    ; $R0="123AbC4567890"  ;仅数字 + 字母 + b - def
SectionEnd

示例 (过滤4)：

Section
    ${StrFilter} "123abcÀÁÂ 456DEFãäå 7890|%#" "+12rus" "ä" "ãå" $R0
    ; $R0="123ÀÁÂ456ä7890"  ;仅数字 + 字母 + ä - ãå
SectionEnd

示例 (英语+俄语字母)：

Section
    ${StrFilter} "123abcÀÁÂ 456DEFãäå 7890|%#" "2rus" "" "" $R0
    ; $R0="ÀÁÂãäå"        ;仅俄语字母
    ${StrFilter} "123abcÀÁÂ 456DEFãäå 7890|%#" "2" "$R0" "" $R0
    ; $R0="abcÀÁÂDEFãäå"  ;仅英语字母 + 俄语字母
SectionEnd

示例 (词首大写)：

Section
    Push "_01-PERPETUOUS_DREAMER__-__THE_SOUND_OF_GOODBYE_(ORIG._MIX).MP3_"
    Call Capitalize
    Pop $R0
    ; $R0="_01-Perpetuous_Dreamer__-__The_Sound_Of_Goodbye_(Orig._Mix).mp3_"

    ${WordReplace} "$R0" "_" " " "+*" $R0
    ; $R0=" 01-Perpetuous Dreamer - The Sound Of Goodbye (Orig. Mix).mp3 "

    ${WordReplace} "$R0" " " "" "{}" $R0
    ; $R0="01-Perpetuous Dreamer - The Sound Of Goodbye (Orig. Mix).mp3"
SectionEnd

Function Capitalize
    Exch $R0
    Push $0
    Push $1
    Push $2

    ${StrFilter} '$R0' '-eng' '' '' $R0
    ${StrFilter} '$R0' '-rus' '' '' $R0

    StrCpy $0 0

    loop:
    IntOp $0 $0 + 1
    StrCpy $1 $R0 1 $0
    StrCmp $1 '' end
    StrCmp $1 ' ' +5
    StrCmp $1 '_' +4
    StrCmp $1 '-' +3
    StrCmp $1 '(' +2
    StrCmp $1 '[' 0 loop
    IntOp $0 $0 + 1
    StrCpy $1 $R0 1 $0
    StrCmp $1 '' end

    ${StrFilter} '$1' '+eng' '' '' $1
    ${StrFilter} '$1' '+rus' '' '' $1

    StrCpy $2 $R0 $0
    IntOp $0 $0 + 1
    StrCpy $R0 $R0 '' $0
    IntOp $0 $0 - 2
    StrCpy $R0 '$2$1$R0'
    goto loop

    end:
    Pop $2
    Pop $1
    Pop $0
    Exch $R0
FunctionEnd

E.3.15 StrFilterS

  • 同 StrFilter，但是区分大小写。

E.3.16 VersionCompare

  • 比较版本号

语法：

${VersionCompare} "[Version1]" "[Version2]" $var

"[Version1]"        ; 第一个版本
"[Version2]"        ; 第二个版本
$var                ; 结果：
                    ;    $var=0  版本相同
                    ;    $var=1  版本 1 较高
                    ;    $var=2  版本 2 较高

示例：

Section
    ${VersionCompare} "1.1.1.9" "1.1.1.01" $R0
    ; $R0="1"
SectionEnd

E.3.10 VersionConvert

  • 将版本转换为可用于比较的十进制数

语法：

${VersionConvert} "[Version]" "[CharList]" $var

"[Version]"         ; 版本
                    ;
"[CharList]"        ; 将被数字替换的字符列表
                    ; "abcdefghijklmnopqrstuvwxyz" (默认)
                    ;
$var                ; 结果：转换后的版本

注意：
- 转换后的字母使用点分开
- 如果字符为非数字或者不在列表中，则它会被转换为点

示例1：

Section
    ${VersionConvert} "9.0a" "" $R0
    ; $R0="9.0.01"

    ${VersionConvert} "9.0c" "" $R1
    ; $R1="9.0.03"

    ${VersionCompare} "$R0" "$R1" $R2
    ; $R2="2"   版本 2 较高
SectionEnd

示例2：

Section
    ${VersionConvert} "0.15c-9m" "" $R0
    ; $R0="0.15.03.9.13"

    ${VersionConvert} "0.15c-1n" "" $R1
    ; $R1="0.15.03.1.14"

    ${VersionCompare} "$R0" "$R1" $R2
    ; $R2="1"   版本 1 较高
SectionEnd

示例3：

Section
    ${VersionConvert} "0.15c+" "abcdefghijklmnopqrstuvwxyz+" $R0
    ; $R0="0.15.0327"

    ${VersionConvert} "0.15c" "abcdefghijklmnopqrstuvwxyz+" $R1
    ; $R1="0.15.03"

    ${VersionCompare} "$R0" "$R1" $R2
    ; $R2="1"   版本 1 较高
SectionEnd


逻辑函数库

E.4 逻辑函数库

E.4.1 介绍

包含文件：

!include "LogicLib.nsh"

使用 NSIS 的宏来提供各种逻辑基本语句，不需要预先添加函数。

E.4.2 基本语句

  • If|Unless..{ElseIf|ElseUnless}..[Else]..EndIf|EndUnless
    - 有条件的执行一个语句区块，取决于表达式。
  • AndIf|AndUnless|OrIf|OrUnless
    - 给 If、Unless、ElseIf 和 ElseUnless 增加额外的条件语句。
  • IfThen..|..|
    - 有条件的执行一个内联语句，取决于表达式。
  • IfCmd..||..|
    - 条件的执行一个内联语句，取决于 NSIS 函数提供的真值。
  • Select..{Case[2|3|4|5]}..[CaseElse|Default]..EndSelect
    - 执行多个语句区块之一，取决于表达式的值。
  • Switch..{Case|CaseElse|Default}..EndSwitch
    - 跳转到多个标记之一，取决于表达式的值。
  • Do[While|Until]..{ExitDo|Continue|Break}..Loop[While|Until]
    - 重复一个语句区块直到停止 取决于表达式的值。
  • While..{ExitWhile|Continue|Break}..EndWhile
    - DoWhile..Loop 的别名 (向后兼容)
  • For[Each]..{ExitFor|Continue|Break}..Next
    - 重复语句区块来连续改变变量的值。

E.4.3 表达式

  • 标准 (内建的) 字串判断 (不区分大小写)：
    a == b; a != b
  • 另外的不区分大小写的字串判断 (使用 System.dll)：
    a S< b; a S>= b; a S> b; a S<= b
    - 需要在 !include LogicLib.nsh 之前 !define LOGICLIB_STRCMP
  • 区分大小写字串判断 (使用 System.dll)：
    a S== b; a S!= b
    - 需要在 !include LogicLib.nsh 之前 !define LOGICLIB_STRCMP
  • 标准 (内建的) 有符号整数判断：
    a = b; a <> b; a < b; a >= b; a > b; a <= b
  • 标准 (内建的) 无符号整数判断：
    a U< b; a U>= b; a U> b; a U<= b
  • 64 位整数判断 (使用 System.dll)：
    a L= b; a L<> b; a L< b; a L>= b; a L> b; a L<= b
    - 需要在 !include LogicLib.nsh 之前 !define LOGICLIB_INT64CMP
  • 内建的 NSIS 标记判断：
    ${Abort}; ${Errors}; ${RebootFlag}; ${Silent}
  • 内建的 NSIS 其它判断：
    ${FileExists} a
  • 任何有条件的 NSIS 指令判断：
    ${Cmd} a
  • 区段标记判断：
    ${SectionIsSelected} a; ${SectionIsSectionGroup} a;
    ${SectionIsSectionGroupEnd} a; ${SectionIsBold} a;
    ${SectionIsReadOnly} a; ${SectionIsExpanded} a;
    ${SectionIsPartiallySelected} a
    - 需要在 !include LogicLib.nsh 之前 !define LOGICLIB_SECTIONCMP

E.4.4 例子

    ;见 Examples\LogicLib.nsi


常用函数库

E.5 常用函数库

E.5.1 介绍

包含文件：

!include "UsefulLib.nsh"

声明安装函数 "GetParent" 和卸载函数 "GetParent" (注意：必须要在使用这个函数之前声明)：

${GetFileExt}
${un.GetParent}

调用函数：

Section Install
     ${GetParent} "C:\My Downloads\Index.html" $R0
     ; $R0="C:\My Downloads"
SectionEnd

Section un.Install
     ${un.GetParent} "C:\My Downloads\Index.html" $R0
     ; $R0="C:\My Downloads"
SectionEnd

某些简短的函数可以不用声明就直接使用，并可以在任意 Section、Function 中使用，卸载区段中也不需要添加 un. 前缀。比如：

Section
  ${IsWinNT} $0 ;可以直接使用的函数
  ${If} $0 == 1
    DetailPrint "你的系统是 NT、2000 平台"
  ${Else}
    DetailPrint "你的系统是 9X 平台"
  ${EndIf}
SectionEnd

当函数说明里注明“使用了 System 插件”而你又在 Function .onInit 里使用了这个函数 那么你应该增加 ReserveFile "${NSISDIR}\Plugins\System.dll" 指令

E.5.2 字串处理函数

E.5.2.1 Find (需要声明)

  • 在一个字串中查找另一个字串并返回该字串的位置

语法：

${Find} 输出变量 字串 要查找的字串

注意：
-区分大小写
-使用了 System 插件

例子：

${Find} $0 "C:\Windows\explorer.exe" "explorer"
; 结果：$0 = 11

E.5.2.2 FindI (需要声明)

  • 在一个字串中查找另一个字串并返回该字串的位置

语法：

${FindI} 输出变量 字串 要查找的字串

注意：
-不区分大小写
-使用了 System 插件

例子：

${FindI} $0 "C:\Windows\explorer.exe" "explorer"
; 结果：$0 = 11

E.5.2.3 FindLast (需要声明)

  • 在一个字串中查找另一个字串并返回该字串的位置，从右至左查找。

语法：

${FindLast} 输出变量 字串 要查找的字串

注意：
-区分大小写
-使用了 System 插件

例子：

${FindLast} $0 "C:\Windows\explorer.exe" "w"
; 结果：$0 = 8

E.5.2.4 FindLastI (需要声明)

  • 在一个字串中查找另一个字串并返回该字串的位置，从右至左查找。

语法：

${FindLastI} 输出变量 字串 要查找的字串

注意：
-不区分大小写
-使用了 System 插件

示例：

${FindLastI} $0 "C:\Windows\explorer.exe" "w"
; 结果：$0 = 8

E.5.2.5 StrStr

  • 在一个字串中查找并返回第一个匹配的子字串

语法：

${StrStr} 输出变量 字串 要查找的子字串

注意：
-区分大小写
-使用了 System 插件

示例：

${StrStr} $0 "C:\Windows\explorer.exe" "Windows"
; 结果：$0 = Windows\explorer.exe

E.5.2.6 StrStrI

  • 在一个字串中查找并返回第一个匹配的子字串

语法：

${StrStrI} 输出变量 字串 要查找的子字串

注意：
-区分大小写
-使用了 System 插件

示例：

${StrStrI} $0 "C:\Windows\explorer.exe" "Windows"
; 结果：$0 = Windows\explorer.exe

E.5.2.7 StrRStrI

  • 在一个字串中查找第一个匹配的子字串，从右到左查找。

语法：

${StrRStrI} 输出变量 字串 要查找的子字串

注意：
-不区分大小写
-使用了 System 插件

示例：

${StrRStrI} $0 "C:\Windows\explorer.exe" "w"
; 结果：$0 = ws\explorer.exe

E.5.2.8 TrimLine (需要声明)

  • 去除字串尾部的回车换行符、去除字串头部和尾部的空格

语法：

${TrimLine} 输入(出)变量

注意：

示例：

StrCpy $0 "aaa$\r$\n"
${TrimLine} $0
; 结果：$0 = aaa

E.5.2.9 TrimLineEx (需要声明)

  • 去除字串尾部的回车换行符、字串前后的空格、制表符

语法：

${TrimLineEx} 输入(出)变量

注意：

示例：

StrCpy $0 "aaa$\r$\n"
${TrimLineEx} $0
; 结果：$0 = aaa

E.5.2.10 Replace (需要声明)

  • 字符串替换

语法：

${Replace} 输入(输出)变量 要查找的字串 要替换的字串

注意：

示例：

StrCpy $0 12345ff89
${Replace} $0 ff firefox
; 结果：$0 = 12345firefox89

E.5.2.11 ReplaceEx (需要声明)

  • 字符串替换

语法：

${ReplaceEx} 输入(输出)变量 要查找的字串 要替换的字串 字串起始偏移 替换多少次后返回 是否区分大小写

注意：
"是否区分大小写" 参数接受 ${TRUE} 或 ${FALSE}

示例：

StrCpy $0 12345ff89
${ReplaceEx} $0 ff firefox 0 1 ${FALSE}
; 结果：$0 = 12345firefox89

E.5.2.12 VerCmp (需要声明)

  • 比较带点的版本号，比如 1.90.2。

语法：

${VerCmp} 输出变量 版本1 版本2

注意：
如果相等返回 0，如果 '版本1' 大于 '版本2' 则返回 1 ，否则返回 -1

示例：

${VerCmp} $0 0.8.5 0.8.3
; 结果：$0 = 1

E.5.2.13 StrCase (需要声明)

  • 转换字符大小写

语法：

${StrCase} 输出变量 字串 大小写类型

注意：
大小写类型：
- "" = 无转换
- L = 全部小写 (this is just an example. a very simple one.)
- U = 全部大写 (THIS IS JUST AN EXAMPLE. A VERY SIMPLE ONE.)
- T = 单词首字母大写 (This Is Just An Example. A Very Simple One.)
- S = 句子首字母大写 (This is just an example. A very simple one.)
- <> = 切换大小写 (This is just an example. A very simple one.)
使用了 System 插件

示例：

${StrCase} $0 "This Is Just An Example" U
; 结果：$0 = THIS IS JUST AN EXAMPLE

E.5.2.14 StrToHex (需要声明)

  • 把字符串转换为十六进制 ASCII 编码

语法：

${StrToHex} 输出变量 输入字串

注意：
使用了 System 插件

示例：

${StrToHex} $0 "a 20 你好"
; 结果：$0 = 6120323020C4E3BAC3

E.5.2.15 TrimRN

  • 去除字串尾部的回车换行符

语法：

${TrimRN} 输出(输出)变量

注意：

示例：

StrCpy $0 "aaa$\r$\n"
; 结果：$0 = aaa

E.5.2.16 ConvertANSIToUTF8 (需要声明)

  • 把 ANSI 字符转换为 UTF-8 字符

语法：

${ConvertANSIToUTF8} 输出 代码页 要转换的字符

注意：
要使用默认的代码页请使用 ${CP_ACP}，或者指定一个代码页，比如简体中文 - 936、繁体中文 - 950
使用了 System 插件

示例：

${ConvertANSIToUTF8} $0 936 "中国"
; 结果：$0 的内码为 E4B8ADE59BBD

E.5.2.17 ConvertUTF8ToANSI (需要声明)

  • 把 UTF-8 字符转换为 ANSI 字符

语法：

${ConvertUTF8ToANSI} 输出 代码页 要转换的字符

注意：
要使用默认的代码页请使用 ${CP_ACP}，或者指定一个代码页，比如简体中文 - 936、繁体中文 - 950
使用了 System 插件

E.5.3 文件、磁盘处理函数

E.5.3.1 GetParent (需要声明)

  • 获取上级目录

语法：

${GetParent} 输出变量 字串

注意：

示例：

${GetParent} $0 "C:\Windows\explorer.exe"
; 结果：$0 = C:\Windows

E.5.3.2 GetChild (需要声明)

  • 获取同级名称

语法：

${GetChild} 输出变量 字串

注意：

示例：

${GetChild} $0 "C:\Windows\explorer.exe"
; 结果：$0 = explorer.exe

E.5.3.3 GetFileExt (需要声明)

  • 获取文件的扩展名

语法：

${GetFileExt} 输出变量 字串

注意：

示例：

${GetFileExt} $0 "explorer.exe"
; 结果：$0 = exe

E.5.3.4 DumpLog (需要声明)

  • 把安装信息窗口的信息提取到文件

语法：

${DumpLog} 要写入的文件

注意：
使用了 System 插件

示例：

${DumpLog} "C:\log.txt"

E.5.3.5 AppendFile (需要声明)

  • 把一个文件的内容附加到另一个文件

语法：

${AppendFile} 源文件 目标文件

注意：

示例：

${AppendFile} "C:\log.txt" "D:\log.txt"

E.5.3.6 DelFileByLog (需要声明)

  • 根据 LogSet 指令的记录删除安装过程中释放的文件

语法：

${DelFileByLog} 记录文件

注意：

示例：

${DelFileByLog} "$INSDIR\install.log"

E.5.3.7 RMDir (需要声明)

  • 如果指定的文件夹为空则删除，并删除所有空子文件夹 (递归)。

语法：

${RMDir} 文件夹

注意：

示例：

${RMDir} $INSTDIR

E.5.3.8 ForEachFile (需要声明)

  • 对指定文件夹下的文件执行指定的回调函数

语法：

${ForEachFile} 文件夹 回调函数地址

注意：
在回调函数中，堆栈顶保存了要处理的文件全路径

示例：

GetFunctionAddress $0 CallBackProc
${ForEachFile} $SYSDIR $0

; 回调函数
Function CallBackProc
    Exch $R0
    DetailPrint $R0 ;或者其它处理指令
    Pop $R0 ;恢复 $R0
FunctionEnd

E.5.3.9 ForEachFileEx (需要声明)

  • 对指定文件夹下的文件执行指定的回调函数，和 ForEachFile 一样，但是函数是递归的。

语法：

${ForEachFileEx} 文件夹 回调函数地址

注意：
在回调函数中，堆栈顶保存了要处理的文件全路径

示例：

GetFunctionAddress $0 CallBackProc
${ForEachFileEx} $SYSDIR $0

; 回调函数
Function CallBackProc
    Exch $R0
    DetailPrint $R0 ;或者其它处理指令
    Pop $R0 ;恢复 $R0
FunctionEnd

E.5.3.10 SearchFile (需要声明)

  • 查找文件夹下的文件 (递归)

语法：

${SearchFile} 查找结果 文件夹 文件

注意：
查找结果返回找到的第一个匹配文件全路径名，找不到时返回空字串。不支持通配符

示例：

${SearchFile} $0 "$WINDIR" "shell32.dll"

E.5.3.11 IsWritable

  • 检测文件是否可写。1 为可写，0 为不可写，-1 为文件不存在。

语法：

${IsWritable} 输出变量 测试文件

注意：

示例：

${IsWritable} $0 "$WINDIR\explorer.exe"

E.5.3.12 GetVolume

  • 获取驱动器的卷标

语法：

${GetVolume} 输出变量 驱动器名

注意：
使用了 System 插件

示例：

${GetVolume} $0 "C:\"

E.5.3.13 TrimDir

  • 如果目录的最后有 \ 则去掉

语法：

${TrimDir} 输入(输出)变量

注意：

示例：

${TrimDir} $0 "C:\"
; 结果：$0 = C:

E.5.3.14 FileTimeCmp

  • 比较两个文件的时间戳 (修改时间)

语法：

${FileTimeCmp} 返回值 文件1 文件2

注意：
如果‘文件1’修改时间比‘文件2’早，返回 -1，相等则返回 0，迟则返回 1
使用了 System 插件

E.5.3.15 GetFileSize

  • 获取文件大小

语法：

${GetFileSize} 输出变量 文件

注意：
如果函数失败，则返回 ${INVALID_FILE_SIZE}
使用了 System 插件

示例：

${GetFileSize} $0 "$WINDIR\explorer.exe"

E.5.3.16 CompactPathEx

  • 根据指定的数字截去中间的字符

语法：

${CompactPathEx} 输出变量 输入 输出的最大字符长度

注意：
使用了 System 插件

示例：

${CompactPathEx} $0 "C:\Documents and Settings\用户名\Local Settings\Application Data\Microsoft\Internet Explorer" 70
; 结果：$0 = C:\Documents and Settings\用户名\Local Settings\...\Internet Explorer

E.5.3.17 RenameExtension

  • 重命名文件扩展名

语法：

${RenameExtension} 输入(输出)变量 .扩展名

注意：
使用了 System 插件

示例：

StrCpy $0 "C:\TEST\sample.txt"
${RenameExtension} $0 ".bin"
; 结果：$0 = C:\TEST\sample.bin

E.5.3.18 RelativePathTo

  • 把绝对路径转换为相对路径

语法：

${RelativePathTo} 输出变量 参考路径 要转换的路径

注意：
使用了 System 插件

示例：

${RelativePathTo} $0 "C:\a\b\path" "C:\a\x\y\file"
; 结果：$0 = ..\..\x\y\file

E.5.3.19 PathCanonicalize

  • 把相对路径转换为绝对路径

语法：

${PathCanonicalize} 输出变量 路径

注意：
使用了 System 插件

示例：

${PathCanonicalize} $0 "A:\name_1\.\name_2\..\name_3"
; 结果：$0 = A:\name_1\name_3

E.5.3.20 RemoveArgs

  • 移除路径里的参数

语法：

${RemoveArgs} 输出(输出)变量

注意：
使用了 System 插件

示例：

StrCpy $0 "C:\a\b\FileA Arg1 Arg2"
${RemoveArgs} $0
; 结果：$0 = C:\a\b\FileA

E.5.3.21 CheckFileEncoding

  • 根据 BOM (字节顺序标志) 获取文件所使用的编码

语法：

${CheckFileEncoding} 输出变量 文件

注意：
返回值为下列值之一
${BOM_ANSI}
${BOM_EBCDIC}
${BOM_UCS4_LE}
${BOM_UCS4_BE}
${BOM_UTF16_BE}
${BOM_UTF16_LE}
${BOM_UNICODE_BE}
${BOM_UNICODE_LE} 或者 ${BOM_UNICODE}
${BOM_UTF8}

E.5.4 注册表处理函数

注册表函数的根键的有效值为下列之一
${HKCU}
${HKLM}
${HKU}
${HKCR}
${HKPD}
${HKCC}
${HKDD}

E.5.4.1 CopyReg (需要声明)

  • 复制一个键下的值数据及子键数据到另一个键下 (递归)

语法：

${CopyReg} 源根键 源子键 目标根键 目标子键

注意：
使用了 System 插件

示例：

${CopyReg} ${HKCU} "Software\Microsoft\Internet Explorer" ${HKCU} "Software\test"

E.5.4.2 ReadRegBin (需要声明)

  • 读取一个二进制注册表键值

语法：

${ReadRegBin} 输出变量 根键 子键 项

注意：
使用了 System 插件

示例：

${ReadRegBin} $0 ${HKLM} `SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Streams\Desktop` `Default Taskbar`

E.5.4.3 ReadRegMultiStr (需要声明)

  • 读取一个 REG_MULTI_SZ 类型的注册表键值

语法：

${ReadRegMultiStr} 根键 子键 项 回调函数地址

注意：
在回调函数中堆栈顶保存了该健的每一个值数据
错误级别：
1 不能打开注册表健
2 无法查询注册表健
3 是 REG_MULTI_SZ 类型
4 值为空
使用了 System 插件

示例：

Section
GetFunctionAddress $0 CallBackProc
StrCpy $1 0
ClearErrors
${ReadRegMultiStr} ${HKLM} `SYSTEM\CurrentControlSet\Control\Session Manager`\
            `ObjectDirectories` $0
${If} ${Errors}
    GetErrorLevel $0
    DetailPrint $0
${Else}
    DetailPrint "回调函数调用了 $1 次"
${EndIf}
SectionEnd

Function CallBackProc
    Exch $R0
    DetailPrint $R0 ;在回调函数里你可以做其它的处理
    IntOp $1 $1 + 1
    Pop $R0
FunctionEnd

E.5.4.4 WriteRegBin (需要声明)

  • 写入一个二进制注册表键值

语法：

${WriteRegBin} 根键 子键 项 二进制数据(十六进制)

注意：
使用了 System 插件

示例：

${WriteRegBin} ${HKCU} `SOFTWARE\test` ffad61bc00

E.5.4.5 WriteRegStrW (需要声明)

  • 根据指定的代码页写入一个 Unicode 注册表数据

语法：

${WriteRegStrW} 代码页 根键 子键 项 数据

注意：
Note that Unicode support on Windows Me/98/95 requires Microsoft Layer for Unicode.
在这里 936 = 简体中文代码页。(950 = 繁体中文代码页)
使用了 System 插件

示例：

${WriteRegStrW} 936 ${HKCU} "Software\测试" "简体中文" "中国"

E.5.4.6 SHCopyKey

  • 复制一个键下的值数据及子键数据到另一个键下 (递归)

语法：

${SHCopyKey} 源根键 源子键 目标根键 目标子键

注意：
使用 Shlwapi.dll 的 SHCopyKey 函数。如果函数失败，则会放置一个错误标记
使用了 System 插件

示例：

${SHCopyKey} ${HKCU} "Software\Microsoft\Internet Explorer" ${HKCU} "Software\test"

E.5.4.7 SHRegGetPath

  • 从注册表获取一个路径，并把环境变量展开

语法：

${SHRegGetPath} 输出 根键 子键 值

注意：
使用 Shlwapi.dll 的 SHRegGetPath 函数
使用了 System 插件

示例：

${SHRegGetPath} $0 ${HKCU} "Software\Microsoft\Windows\CurrentVersion\Explorer\User Shell Folders" "Templates"

E.5.4.8 GetRegKeyCount

  • 获取注册表某个键下的子键个数

语法：

${GetRegKeyCount} 输出 根键 子键

注意：
使用了 System 插件

示例：

${GetRegKeyCount} $0 ${HKCU} "Software\Microsoft\Internet Explorer"

E.5.4.9 GetRegValueCount

  • 获取注册表某个键下的值个数

语法：

${GetRegValueCount} 输出 根键 子键

注意：
使用了 System 插件

示例：

${GetRegValueCount} $0 ${HKCU} "Software\Microsoft\Internet Explorer\Main"

E.5.5 杂项函数

E.5.5.1 CloseApp

  • 根据类名关闭一个程序

语法：

${CloseApp} 类名

注意：

示例：

${CloseApp} "Winamp v1.x"

E.5.5.2 IsWinNT

  • Windows NT 平台返回 1 ，否则返回 0

语法：

${IsWinNT} 输出变量

注意：

示例：

${IsWinNT} $0

E.5.5.3 GetComputerName

  • 获取计算机名称

语法：

${GetComputerName} 输出变量

注意：

示例：

${GetComputerName} $0

E.5.5.4 GetInstallerName

  • 获取安装程序完整名称

语法：

${GetInstallerName} 输出变量

注意：
使用了 System 插件

示例：

${GetInstallerName} $0

E.5.5.5 GetLocaleInfo

  • 获取系统信息

语法：

${GetLocaleInfo} 输出变量 信息类型

注意：
信息类型参考 http://msdn.microsoft.com/library/default.asp?url=/library/en-us/intl/nls_8rse.asp
使用了 System 插件

E.5.5.6 GetWinName

  • 获取 Windows 产品名并返回

语法：

${GetWinName} 输出变量

注意：

示例：

${GetWinName} $0 ;$0 = Microsoft Windows ME 等等

E.5.5.7 GetUserName

  • 获取用户名

语法：

${GetUserName} 输出变量

注意：
使用了 System 插件

E.5.5.8 RefreshIcon

  • 刷新图标缓存

语法：

${RefreshIcon}

注意：
使用了 System 插件

E.5.5.9 ClearDetail

  • 清除详细信息窗口

语法：

${ClearDetail}

注意：
使用了 System 插件

E.5.5.10 GetDllVersion

  • 获取 DLL 版本信息，x.x.x.x 格式

语法：

${GetDllVersion} 输出变量 DLL

注意：

E.5.5.11 LoadImage

  • 载入一个图标、光标或位图

语法：

${LoadImage} 输出图像句柄变量 控件句柄 图像名称和路径 图像类型

注意：
图像类型为下列之一：
${IMAGE_BITMAP}
${IMAGE_CURSOR}
${IMAGE_ICON}
使用后应该释放它占用的内存，调用下列函数：
位图：DeleteObject
光标：DestroyCursor
图标：DestroyIcon
使用了 System 插件

E.5.5.12 DeleteObject

  • 删除载入的位图占用的内存

语法：

${DeleteObject} 位图句柄

注意：
使用了 System 插件

E.5.5.13 DestroyCursor

  • 删除载入的光标占用的内存

语法：

${DestroyCursor} 光标句柄

注意：
使用了 System 插件

E.5.5.14 DestroyIcon

  • 删除载入的图标占用的内存

语法：

${DestroyIcon} 图标句柄

注意：
使用了 System 插件

E.5.5.15 MessageBox

  • 和内建的一样，但可以自己定义标题

语法：

${MessageBox} 返回值 文本 标题 消息框类型

注意：
消息框类型为下列值之一或联合：
${MB_OK}
${MB_OKCANCEL}
${MB_ABORTRETRYIGNORE}
${MB_YESNOCANCEL}
${MB_YESNO}
${MB_RETRYCANCEL}
${MB_ICONHAND}
${MB_ICONQUESTION}
${MB_ICONEXCLAMATION}
${MB_ICONASTERISK}
${MB_ICONINFORMATION}
${MB_ICONSTOP}
返回值为下列之一：
${IDOK}
${IDCANCEL}
${IDABORT}
${IDRETRY}
${IDIGNORE}
${IDYES}
${IDNO}
使用了 System 插件

E.5.5.16 WriteEnvStr (需要声明)

  • 写入一个环境变量字串

语法：

${WriteEnvStr} 变量名 变量值 用户类型

注意：
用户类型为下列值之一 (仅在 WinNT 平台有效，Win9X 此参数将被忽略)
${CURRENT_USER} —— 仅对当前用户
${LOCAL_MACHINE} —— 对本地用户
${ALL_USERS} —— 以上两项的联合(${ALL_USERS} == ${CURRENT_USER} | ${LOCAL_MACHINE})
Win9X 设置了环境变量后需要重启才能生效。Win9X 中可能还需要用 GetFullPathName /SHORT 来获取 8.3 格式短路径名。
使用了 System 插件

示例：

${WriteEnvStr} PATH "C:\path" ${ALL_USERS}

E.5.5.17 DeleteEnvStr (需要声明)

  • 移除一个环境变量字串

语法：

${DeleteEnvStr} 变量名 变量值 用户类型

注意：
用户类型为下列值之一 (仅在 WinNT 平台有效，Win9X 此参数将被忽略)
${CURRENT_USER} - 仅对当前用户
${LOCAL_MACHINE} - 对本地用户
${ALL_USERS} - 以上两项的联合 (${ALL_USERS} == ${CURRENT_USER} | ${LOCAL_MACHINE})
Win9X 设置了环境变量后需要重启才能生效。Win9X 中可能还需要用 GetFullPathName /SHORT 来获取 8.3 格式短路径名。
使用了 System 插件

示例：

${DeleteEnvStr} PATH "C:\path" ${ALL_USERS}

E.5.5.18 GetWallpaper

  • 获取桌面墙纸的路径

语法：

${GetWallpaper} 输出变量

注意：
使用了 System 插件

E.5.5.19 SetWallpaper

  • 设置桌面墙纸的路径

语法：

${SetWallpaper} 墙纸

注意：
使用了 System 插件

示例：

SetOutPath $WINDIR
File wallpaper.jpg
${SetWallpaper} $WINDIR\wallpaper.jpg

E.5.5.20 GetWallpaperOptions

  • 获取桌面墙纸选项

语法：

${GetWallpaperOptions} 输出变量

注意：
使用了 System 插件

E.5.5.21 SetWallpaperOptions

  • 设置桌面墙纸选项

语法：

${GetWallpaperOptions} 输出变量

注意：
使用了 System 插件
选项为下列值之一：
${WPSTYLE_CENTER} —— 墙纸居中
${WPSTYLE_TILE} —— 墙纸平铺
${WPSTYLE_STRETCH} —— 墙纸拉伸
${WPSTYLE_MAX} —— 最大化？

E.5.5.22 EnableTheming

  • 启用或禁用 Theme —— 仅对 XP 及以上系统有效

语法：

${EnableTheming} 布尔值

注意：
使用了 System 插件
布尔值：
${TRUE} —— 启用 Theme
${FALSE} —— 禁用 Theme

E.5.5.23 GetCurrentThemeName

  • 获取当前 Theme 的名称 —— 仅对 XP 及以上系统有效

语法：

${GetCurrentThemeName} 名称输出变量 颜色输出变量 字体大小输出变量

注意：
使用了 System 插件

E.5.6 区段函数

E.5.6.1 StartRadioButtons

  • 开始一个互斥区段

语法：

${StartRadioButtons} 互斥区段关联变量 区段组索引

注意：
该函数必须在 .onSelChange 函数里使用
区段关联变量必须在 .onInit 函数里初始化，且该变量在其他地方不应该再使用
如果互斥区段不在区段组内则给区段组索引传递一个负值

示例：

SectionGroup AAA sec01

Section BBB sec02 ;区段组中终默认选中的区段
SectionEnd

Section /o "" sec03
SectionEnd

Section /o DDD sec04
SectionEnd

SectionGroupEnd

Section EEE sec05 ;默认选中的区段
SectionEnd

Section /o FFF sec06
SectionEnd

Section /o GGG sec07
SectionEnd

Var RB1
Var RB2

Function .onSelChange
    ;第一组互斥按钮，区段属于区段组内，关联区段信息到 $RB1
    ${StartRadioButtons} $RB1 ${sec01} ;如果互斥按钮在区段组内则传递区段组的索引
    ${RadioButton} ${sec02}
    ${RadioButton} ${sec03}
    ${RadioButton} ${sec04}
    ${EndRadioButtons}
    ;第二组互斥按钮，区段不属于区段组内，关联区段信息到 $RB2
    ${StartRadioButtons} $RB2 -1 ;如果互斥按钮不在区段组内则传递一个负值
    ${RadioButton} ${sec05}
    ${RadioButton} ${sec06}
    ${RadioButton} ${sec07}
    ${EndRadioButtons}
FunctionEnd

Function .onInit
    StrCpy $RB1 ${sec02} ;给第一组互斥按钮的区段变量初始化值
    StrCpy $RB2 ${sec05} ;给第二组互斥按钮的区段变量初始化值
FunctionEnd

E.5.6.2 RadioButton

  • 添加互斥区段

语法：

${RadioButton} 区段索引

注意：
该函数必须在 .onSelChange 函数里使用
必须配合 StartRadioButtons、EndRadioButtons 一起使用

示例：

见 StartRadioButtons 的例子

E.5.6.3 EndRadioButtons

  • 结束一个互斥区段

语法：

${EndRadioButtons}

注意：
该函数必须在 .onSelChange 函数里使用
必须配合 StartRadioButtons、RadioButton 一起使用

示例：

见 StartRadioButtons 的例子

E.5.6.4 EndRadioButtons2

  • 结束一个互斥区段。和 EndRadioButtons 一样，不同是允许不选择任何区段。

语法：

${EndRadioButtons2}

注意：
该函数必须在 .onSelChange 函数里使用
必须配合 StartRadioButtons、RadioButton 一起使用

示例：

见 StartRadioButtons 的例子


更新日志与发行说明

附录 F：更新日志与发行说明

  • 3.0 测试版 2
    • 更新日志
  • 3.0 测试版 1
    • 发行说明
    • 更新日志
  • 3.0 测试版 0
    • 发行说明
    • 更新日志
  • 3.0 内测版 2
    • 发行说明
    • 更新日志
  • 3.0 内测版 1
    • 发行说明
    • 更新日志
  • 3.0 内测版 0
    • 更新日志
  • 2.47
    • 发行说明
    • 更新日志
  • 2.46
    • 更新日志
  • 2.45
    • 发行说明
    • 更新日志
  • 2.44
    • 更新日志
  • 2.43
    • 发行说明
    • 更新日志
  • 2.42
    • 发行说明
    • 更新日志
  • 2.41
    • 更新日志
  • 2.40
    • 更新日志
  • 2.39
    • 更新日志
  • 2.38
    • 更新日志
  • 2.37
    • 更新日志
  • 2.36
    • 发行说明
    • 更新日志
  • 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
    • 发行说明
    • 更新日志
  • 2.06
    • 更新日志
  • 2.05
    • 发行说明
    • 更新日志
  • 2.04
    • 更新日志
  • 2.03
    • 发行说明
    • 更新日志
  • 2.02
    • 更新日志
  • 2.01
    • 发行说明
    • 更新日志
  • 2.0
    • 发行说明
    • 更新日志
  • 2.0 候选版 4
    • 更新日志
  • 2.0 候选版 3
    • 更新日志
  • 2.0 候选版 2
    • 更新日志
  • 2.0 候选版 1
    • 发行说明
    • 更新日志
  • 2.0 测试版 4
    • 发行说明
    • 更新日志
  • 2.0 测试版 3
  • 2.0 测试版 2
  • 2.0 测试版 1
  • 2.0 测试版 0
  • 2.0 内测版 7
  • 2.0 内测版 6
  • 2.0 内测版 5
  • 2.0 内测版 4
  • 2.0 内测版 3
  • 2.0 内测版 2
  • 2.0 内测版 1
  • 2.0 内测版 0
  • 早期版本


构建 NSIS

附录 G：构建 NSIS

NSIS 从版本 2.07 起引进了一个新的构建系统，基于 SCons。新的构建系统可以一次性的构建整个 NSIS 而不再需要一个工程一个工程的去构建。它使你可以进行多个同步的工作，在 Windows 或 POSIX 上安装而不需要安装程序并方便的带调试符号编辑。

  • 常规构建
  • 在 Windows 上构建
  • 在 POSIX 上构建
  • 每天的构建


常规构建

G.1 常规构建

源代码可以在 CVS 找到并且和 NSIS 发行版本分离。

要构建 NSIS 首先要安装 Python 和 SCons。目前，支持的 SCons 版本是 0.96.91。任何高于 1.6 的 Python 版本只可以支持。

要开始构建，首先打开控制台，更改工作目录到 NSIS 根目录并输入 scons 然后回车。像下面这样：

C:\>cd dev\nsis
C:\dev\nsis>scons
scons: Reading SConscript files ...
Using Microsoft tools configuration
Checking for main() in C library gdi32... (cached) yes
Checking for main() in C library user32... (cached) yes
Checking for main() in C library version... (cached) yes
Checking for main() in C library pthread... (cached) no
Checking for main() in C library stdc++... (cached) no
Checking for main() in C library iconv... (cached) no
Checking for main() in C library libiconv... (cached) no
scons: done reading SConscript files.
scons: Building targets ...
...

要安装构建文件，输入：

scons PREFIX="C:\Program Files\NSIS" install

要创建安装程序 (仅在 Windows 上)，输入：

scons dist-installer

要创建发行的 ZIP 文件，输入：

scons dist-zip

都要创建，输入：

scons dist

要获取系统提供的完整选项列表，输入：

scons -h

要获取 SCons 提供的完整选项列表，输入：

scons -H


Building on Windows

G.2 在 Windows 上构建

如果你安装了 Microsoft Visual C++。SCons 将会自动地检测到并使用。如果你没有的话你可以下载免费的 Visual C++ Toolkit 和 Platform SDK。构建系统并不会自动地认出这些工具包，所以你要做一些额外的工作：

scons MSTOOLKIT=yes

如果你得到关于编译器的错误或找不到 Platform SDK，使用：

set MSSDK=C:\Path\To\Platform SDK
set VCToolkitInstallDir=C:\Path\To\VCToolkit
scons MSTOOLKIT=yes

你也可以使用开源的 MinGW 来构建，但是这会使编译的程序体积增大。Borland C++ 或 Open Watcom C/C++ 可能可以工作，但并没有经过测试。

对于 Microsoft Visual C++ 6.0 用户的重要提示：你应当安装最新的 Platform SDK。因为 Microsoft Visual C++ 6.0 发布的库文件中有缺陷，如果不安装 Platform SDK，那么当使用 CopyFiles 命令时会导致系统崩溃，更多相关信息请查看这个论坛主题。同时也强烈推荐安装 Processor Pack 以减少安装程序的可执行头部。


在 POSIX 上构建

G.3 在 POSIX 上构建

自 NSIS 2.01 起，编译器 makensis 支持在 POSIX 平台下编译。POSIX 平台包括 Linux、*BSD、Mac OS X 及其他平台。由于所产生的安装程序最终将在 Windows 上运行，为了编译源文件还需要一个交叉编译程序。

如果没有可用的交叉编译程序，使用如下命令：

scons SKIPSTUBS=all SKIPPLUGINS=all SKIPUTILS=all SKIPMISC=all
      NSIS_CONFIG_CONST_DATA_PATH=no PREFIX=/path/to/extracted/zip
      install-compiler

scons NSIS_CONFIG_CONST_DATA_PATH=no PREFIX=/path/to/extracted/zip
      /path/to/extracted/zip/LibraryLocal

这只是创建 makensis 并且安装它到一个预编译程序包目录里，就像每日构建版或压缩发行版本 (nsis-x.xx.zip)，被抽取那样。请注意，为了使它有效，预编译程序包必须跟 makensis 使用完全相同的来源进行编译。特别是 Source\exehead\config.h 传递给 scons 的选项和 Source\exehead\fileform.h 必须完全相同。每日构建版本和压缩发行版本都是使用默认选项构建。

要创建一个对应版本的 NSIS 菜单，安装 wxWidgets 2.8 并照例构建。wx-config 必须位于 PATH 环境变量。


每日构建

F.4 每日构建

如果你不想自己编译 NSIS 但却想获取最新的 CVS 版本，你可以使用每日构建版本。每日构建版本在 CVS 上每天都会自动的构建。


致谢名单

附录 G：致谢名单

  • 程序员
  • 贡献者
  • 资源制作者
  • 翻译者
  • 文档编写者


程序员

H.1 程序员

Justin Frankel aka 0xDEADBEEF

  • 创建 NSIS

Amir "make me stop" Szekely aka KiCHiK

  • 多语言 NSIS
  • RTF 许可协议文本
  • 新的页面系统
  • 对图标和位图的完整色彩支持
  • 标志图像
  • 自定义界面 UI
  • 一个 makensis.exe 就支持 zlib 和 bzip2

Joost Verburg

  • 新式用户界面
  • NSIS 网站
  • NSIS 菜单
  • DLL/TLB 库安装系统
  • NSIS 发布的更新 (原始版本为 Nathan Purciful)

Robert Rainwater

  • MakeNSISW
  • 新的文档格式
  • 增强了 TreeView
  • 重新编制 NSIS 目录结构

Dave "bit-by-bit" Laundon aka eccles

  • 大量的优化

Ximon Eighteen aka Sunjammer

  • 新的插件系统
  • 详细信息查看窗口的 "复制到剪贴板" 右键菜单
  • 许可协议文本初始化焦点

Ramon aka Ramon18

  • 版本信息资源命令
  • 可声明的用户变量
  • 许多界面的修正
  • InstallOptions 改进


贡献者

H.2 贡献者

nnop@newmail.ru

Ryan Geiss

Andras Varga

Drew Davidson

Peter Windridge

Yaroslav Faybishenko

Jeff Doozan

  • NSIS 2's new TreeView

Nike (nike@sendmail.ru)

  • HTML Help support for Halibut

Diego Pedroso aka deguix

  • New NSIS Wiki

Shengalts Aleksander aka Instructor

Stuart Welch aka Afrow UK


资源制作者

H.3 资源制作者

Nikos Adamamas

  • 新的新式图标

Jan T. Sott / whyEye.org

  • 许多的图标和选择框标志


翻译者

H.4 翻译者

Arabic - asdfuae, Rami Kattan

Breton - Korvigelloù An Drouizig

Bulgarian - Asparouh Kalyandjiev, Plamen Penkov

Catalan - falanko

Croatian - Igor Ostriz, Vedran "RIV@NVX" Miletic

Czech - T.V. Zuggy, SELiCE

Danish - Christopher, Casper Bergenstoff, Claus Futtrup

Dutch - Hendri Adriaens, Joost Verburg

Estonian - izzo

Farsi - Masoud Alinaqian, FzerorubigD

Finnish - AKX, Eclipser

French - veekee, Sébastien Delahaye, Jerome Charaoui

German - L.King, K. Windszus, R. Bisswanger, M. Simmack, Tim Kosse

Greek - Makidis N. Michael

Hebrew - Amir Szekely (aka KiCHiK), Yaron Shahrabani

Hungarian - Soft-Trans Bt., Jozsef Tamas Herczeg, Lajos Molnar (Orfanik)

Italian - Orfanik, sanface, Alessandro Staltari, Lorenzo Bevilacqua

Japanese - Dnanako, Takahiro Yoshimura

Korean - dTomoyo, linak, koder

Lithuanian - NorCis, Vytautas Krivickas, Danielius Scepanskis

Luxembourgish - Jo Hoeser

Macedonian - Sasko Zdravkin

Norwegian - Jonas Christoffer Lindstrøm, Jan Ivar Beddari

Polish - Piotr Murawski, Rafa³ Lampe, cube

Portuguese - DragonSoull, Dre', Ramon

Portuguese Brasil - Layout do Brasil, deguix

Romanian - Sorin Sbarnea, Cristian Pirvu, George Radu

Russian - Sergey `Timon` Kusnetsov, Nik Medved, Scam, THRaSH, Dmitry Yerokhin

Serbian - Vladan Obradovic

Slovak - trace, Kypec

Slovenian - Janez Dolinar

Spanish - MoNKi, Lobo Lunar

Swedish - Peter Gustafsson, Magnus Bonnevier, Rickard Angbratt

Thai - TuW@nNu (asdfuae)

Traditional & Simplified Chinese - Kii Ali

Turkish - Bertan Kodamanoglu, Çagatay Dilsiz, Fatih BOY

Ukrainian - Yuri Holubow, Nash-Soft


文档编写者

H.5 文档编写者

Sebastian Armbrust aka flizebogen

  • 指南


NSIS 许可协议

上一页 | 目录 | 下一页

附录 H：NSIS 许可协议

 Copyright (C) 1999-2006 Nullsoft, Inc.

 This software is provided 'as-is', without any express or implied
 warranty.  In no event will the authors be held liable for any damages
 arising from the use of this software.

 Permission is granted to anyone to use this software for any purpose,
 including commercial applications, and to alter it and redistribute it
 freely, subject to the following restrictions:

 1. The origin of this software must not be misrepresented; you must not
    claim that you wrote the original software. If you use this software
    in a product, an acknowledgment in the product documentation would be
    appreciated but is not required.
 2. Altered source versions must be plainly marked as such, and must not be
    misrepresented as being the original software.
 3. This notice may not be removed or altered from any source distribution.

中文版参照：

版权所有 (C) 1999-2006 Nullsoft, Inc.

  除非有另外的说明本授权适用于 NSIS 安装包的所有相关事宜。

  本软件遵循“概不保证”的原则，没有其它任何的说明和暗示。
  作者不承担任何由于使用本软件所造成的损害的责任。

  允许任何人使用本软件用于任何的目的，包括商业软件，修改、自由重新发布，需遵守下列条款：

  1. 本软件的原始版本不允许被误传；您不具有撰写软件的原始版本的任何权利。
     如果您要在产品中使用本软件，希望您能在您的产品中加入相关的书面承认，但这并不是必须的。

  2. 修改过源代码的版本必须在显著的位置注明，并且不允许有任何相对于原始软件的欺骗性质的语句。

  3. 本说明不能在任何发布版本中被删除或更改。

上一页 | 目录 | 下一页


3.0 测试版 2

F.1 3.0 测试版 2

2015年8月4日发布

F.1.1 更新日志

F.1.1.1 主要更改

  • Preliminary Windows 10 support

F.1.1.2 次要更改

  • Added !appendfile /RawNL switch
  • Added PESubsysVer attribute
  • Exec[Wait] sets the CREATE_DEFAULT_ERROR_MODE flag when creating a process
  • Fixed 4+ TiB freespace calculation bug (bug #1115)
  • Fixed CreateShortcut /NoWorkingDir parsing bug (bug #1110)
  • Fixed minor issues in the Pascal NSIS plug-in SDK and removed the extrap global variable
  • nsDialogs and InstallOptions now use the system link color

F.1.1.3 构建系统

  • Linux stdcall warning fix (patch #261)
  • Linux test-scripts fix (patch #260)
  • Win64 fixes (including patch #258, bug #1105)
  • Visual C 2012 fixes


3.0 测试版 1

F.2 3.0 测试版 1

2014年10月6号发布

F.2.1 发行说明

  • This release addresses a lot of build issues, reintroduces the nightly builds and adds automatic nightly test execution

F.2.2 更新日志

F.2.2.1 主要更改

  • !insertmacro allows macro recursion (RFE #497)
  • Added !makensis command
  • Added new MUI2 bitmap stretch modes, *_NOSTRETCH is now deprecated (RFE #521)
  • InitiateShutdown() is used to reboot the machine if available (patch #247)
  • Added PPO and SafePPO preprocess-only compiler switches
  • MakeNSIS WM_COPYDATA messages now use the QH_OUTPUTCHARSET encoding with CP_ACP as the default for compatibility with old IDEs.

F.2.2.2 次要更改

  • Added IsWow64 to x64.nsh
  • Added PEDllCharacteristics attribute
  • Added System::Call direct register memory access type. (patch #249)
  • Added WX compiler switch
  • Allow skipping ExDLL build with SKIPPLUGINS ((patch #254))
  • Changed default DllCharacteristics to TS_AWARE+NO_SEH+NX_COMPAT+DYNAMIC_BASE
  • Fixed Mac OS X builds (patch #253 and bug #1085)
  • Fixed POSIX !searchparse bug (patch #251)
  • Fixed !macroundef
  • Fixed test-code build target on POSIX and enabled it in nightly builds (bug #1098)
  • Fixed Visual Studio 2012 builds

F.2.2.3 翻译

  • Added Armenian (Hrant Ohanyan)


3.0 测试版 0

F.3 3.0 测试版 0

2014年5月11日发布

F.3.1 发行说明

  • POSIX builds work again! Please let us know if your favorite platform is still having build issues. We mainly test on Linux.

F.3.2 更新日志

F.3.2.1 主要更改

  • Basic AMD64 System::Call support
  • Fixed POSIX builds

F.3.2.2 次要更改

  • Added CreateShortcut /NoWorkingDir parameter
  • Added Int<32|64|Ptr><Op|Cmp[U]> helper macros to Util.nsh
  • Added P<, P<=, P=, P<>, P>= and P> LogicLib ptrdiff_t tests
  • Try harder to find duplicate strings in string block (bug #1088)
  • !system will decode child output as OEMCP if GetConsoleOutputCP() == GetOEMCP()
  • !system and !execute can store the exit code in a define
  • !execute supports comparing the exit code with the same syntax as !system
  • Preprocessor supports 0n and 0b radix prefix on number literals


3.0 测试版 2

F.4 3.0 内测版 2

2013年12月24日发布

F.4.1 发行说明

It's the holiday gift you've been waiting for!

F.4.1.1 已知的问题

  • The POSIX build is getting much closer, but still currently broken
  • LangDLL doesn't display localized language name with Unicode false

F.4.2 更新日志

F.4.2.1 主要更改

  • !include defaults to UTF-8 after Unicode True
  • Preprocessor does not parse all branches and will not validate code that is never executed (bug #1086)

F.4.2.2 次要更改

  • FileRead in Unicode installers can handle DBCS, conversion output is limited to UCS-2.
  • FileRead in Unicode installers now uses the Unicode replacement character (U+FFFD) for invalid characters and not '?'.
  • FileReadByte no longer performs a Unicode conversion on non-ASCII characters
  • Windows 8.1 & 2012R2 support in WinVer.nsh
  • Fixed !define Unicode null terminator bug (bug #1079)
  • Unicode stubs create WCHAR richedit controls (bug #1080)
  • Fixed MakeNSISW default pushbutton and tab order
  • Fixed incorrect page count in compiler statistics


3.0 内测版 1

F.5 3.0 内测版 1

2013年7月14日发布

F.5.1 发行说明

F.5.1.1 已知的问题

  • The POSIX build is currently broken
  • LangDLL doesn't display localized language name with Unicode false
  • FileRead may return '?' for MBCS letters with Unicode true

F.5.2 更新日志

F.5.2.1 主要更改

  • Default verbosity is /V3 without logo, MakeNSISW still uses /V4.
  • ManifestSupportedOS added support for the Windows 8.1 Preview GUID and it is set by default to avoid GetVersionEx compatibility behavior.

F.5.2.2 次要更改

  • Fixed !finalize %1
  • Fixed !searchparse (bug #1073)
  • Made installers always respect /S on command line, even when installer file can't be read (bug #1076)
  • Minor MakeNSISW fixes and tweaks
  • Zip2Exe Unicode checkbox


3.0 内测版 0

F.6 3.0 内测版 0

2013年5月19日发布

F.6.1 发行说明

  • MakeNSIS can now generate ANSI and Unicode installers. Source files can be UTF8SIG, UTF16BOM or traditional MBCS text files (which are converted to Unicode with ACP unless you specify a different codepage). The default plugins are now stored in sub-folders based on their CPU target and character set encoding.

F.6.1.1 已知问题

  • The POSIX build is currently broken
  • LangDLL doesn't display localized language name with Unicode false
  • FileRead may return '?' for MBCS letters with Unicode true

F.6.2 更新日志

F.6.2.1 主要更改

  • Added the Unicode attribute (RFE #1238132, patch #1795257)
  • Added support for Windows 8 and Windows Server 2012
  • MakeNSIS can read UTF8SIG and UTF16BOM script files (RFE #2026892)
  • All NLF and NSH language files are stored in Unicode (RFE #1879642)
  • Scripts can control the SupportedOS list in the application manifest using ManifestSupportedOS (bug #2725883, RFE #3020103)
  • Installers can claim DPI-awareness with ManifestDPIAware (bug #2897169)
  • The index of the changed section is stored in $0 during .onSelChange callbacks (RFE #1634936)
  • ${U+1}...${U+10FFFF} are treated as a Unicode character unless there is already a define with that name (RFE #2084797)

F.6.2.2 次要更改

  • Added !getdllversion (bug #2809308)
  • Added !appendfile /CHARSET parameter
  • Added !if support for /fileexists, case sensitive comparisons, hex and float
  • Added more definitions to WinMessages.nsh
  • %temp%\Low will be used if the installer cannot write to %temp% nor %windir%\Temp (bug #2909242, patch #2912824)
  • Added ${NSIS_PACKEDVERSION}, the NSIS version packed in a hex number (patch #2680832)
  • Added ${__MACRO__} and ${__COUNTER__} predefines
  • Added UnsafeStrCpy instruction, it can write to special variables like $PLUGINSDIR
  • Added VIFileVersion
  • Added !finalize for post-build commands (like signing the installer)
  • Plugins in ${NSISDIR}\Plugins have to be reserved with ReserveFile /plugin
  • MakeNSIS /NOTIFYHWND uses a (optional) new event name to abort compilation, see build.cpp/h for details.
  • Reduced !include/!insertmacro recursion stack usage (bug #3067954)
  • Fixed minor MakeNSIS leaks (bug #3474662)
  • Fixed MUI_FINISHPAGE_TITLE_3LINES padding when reboot is required (bug #3400067, bug #3408407)
  • Fixed removal of read only attribute even if Delete or RMDir fails (bug #3072159)
  • Fixed ${__SECTION__} in hidden sections (RFE #1787648)
  • Various documentation fixes (bug #3063566, bug #3567313, patch #3307144)
  • Lots of other small fixes...

F.6.2.3 翻译

  • Changed LANGFILE macro in LangFile.nsh
  • Warnings are now displayed for missing strings (LANGFILE_INCLUDE_WITHDEFAULT)
  • Added Georgian (David Huriev)
  • Added Pashto (Pakhtosoft)
  • Added Scottish Gaelic (GunChleoc)
  • Fixed Korean MUI_[UN]TEXT_FINISH_INFO_* (bug #3541515)


2.47

F.1 2.47

2015年12月8日发行

F.1.1 发行说明

  • This is a maintenance and security release

F.1.2 更新日志

F.1.2.1 主要更改

  • LoadLibrary security hardening to prevent dll hijacking (patch #1125
  • InitiateShutdown() is used to reboot the machine if available (patch #247)

F.1.2.2 次要更改

  • Fixed 4+ TiB freespace calculation bug (bug #1115)
  • Windows 8 & 2012 support in WinVer.nsh


2.46

F.1 2.46

2009年12月6日发行

F.1.1 更新日志

F.1.1.1 次要更改

  • Fixed !searchparse (bug #2803622)
  • Fixed Vista error message when canceling uninstaller (bug #2803097)
  • Resolve warning for LogicLib's endless Do..Loop (bug #2849872)
  • StartMenu: fixed random number prefixes when clicking on an empty spot (bug #2810188)
  • Updates to NSIS.pas for plug-in development (patch #2802794)

F.1.1.2 翻译

  • PortugueseBR typo (patch #2826598)
  • Removed double spaces in Italian (bug #2873598)

F.1.1.3 构建系统

  • Fixed mingw builds of Math plug-in (patch #2835731)


2.45

F.2 2.45

2009年6月6日发行

F.2.1 发行说明

  • Support for Microsoft's upcoming release of Windows 7 has been added based on RC1 testing and documentation. Please report any related issues and don't forget to use RequestExecutionLevel.

F.2.2 更新日志

F.2.2.1 主要更改

  • Added support for Windows 7 installers - use RequestExecutionLevel, just like with Vista (bug #2725883)
  • Added WinVer.nsh Windows 7 and Windows 2008 R2 support
  • Installers now identify as Terminal Services aware (IMAGE_DLLCHARACTERISTICS_TERMINAL_SERVER_AWARE) so $WINDIR will no longer be under the user's profile when installing on Terminal Services
  • Less UAC annoyance in Add/Remove control panel (bug #2697027)

F.2.2.2 次要更改

  • Added wildcard and /nonfatal suppport for !delfile (RFE #1505425)
  • Fixed !searchparse (bug #2680110)
  • Fixed input validation for CreateFont (bug #2801024)
  • Fixed NSIS Menu handling of working directory (bug #2781948)
  • Fixed Vista issues with shell folders ($DOCUMENTS, $PROFILE, etc.) on root directories (bug #2138075)
  • Minor documentation improvements (including bug #2705878, bug #2606525)
  • Use SW_SHOWDEFAULT for ExecShell by default (bug #2796189)

F.2.2.3 现代界面

  • Call finish page show function only after the page is fully initialized (bug #2720968)
  • Fixed translation of uninstaller directory page (bug #2690112)
  • Fixed installation type text position in components page (patch #2801317)
  • Fixed missing MUI_INNERTEXT_COMPONENTS_DESCRIPTION_TITLE (bug #2788620)

F.2.2.4 翻译

  • Updated Indonesian (patch #2790571)
  • Updated Portuguese BR (patch #2642542)

F.2.2.5 构建系统

  • Fixed some GCC warnings


2.44

F.3 2.44

2009年2月21日发行

F.3.1 更新日志

F.3.1.1 主要更改

  • Fixed a bug introduced in 2.43 causing script build issues with some icons (bug #2572035)

F.3.1.2 次要更改

  • Fixed nsDialogs CreateTimer documentation (bug #2595565)
  • Global labels didn't work when declared in unused functions (bug #2593369)


2.43

F.4 2.43

2009年2月5日发行

F.4.1 发行说明

  • A few minor changes were made to the new plug-in API that break backward compatibility. Header and library paths were changed and RegisterPluginCallback has changed its return value.

F.4.2 更新日志

F.4.2.1 次要更改

  • Added WinCore.nsh, WinDef.nsh, WinError.nsh, WinNT.nsh and WinUser.nsh for more useful Windows definitions
  • Fixed a crash caused by !packhdr compressing resources (bug #2533431)
  • Minor documentation improvements (including bug #2564005)
  • Modern UI 2: Fixed MUI_DIRECTORYPAGE_BGCOLOR (bug #2494528)

F.4.2.2 工具和插件

  • Banner: Fixed installer showing on the background when Banner was used in .onInit
  • MakeNSISW: Added Ctrl+K hotkey for build cancelation (RFE #2557392)
  • nsDialogs: Added NSD_SetIcon (patch #2500960)

F.4.2.3 翻译

  • Added Esperanto
  • Bulgarian fixes

F.4.2.4 Plug-in API

  • Added VS2008 project files
  • Better installation of header and library files under POSIX - see INSTALL file for more information
  • Header and library files were moved to a subdirectory named nsis to prevent collisions
  • RegisterPluginCallback now returns int instead of BOOL for a wider range of error reporting

F.4.2.5 构建系统

  • Added fink's mingw prefixes (bug #2495138)
  • Fixed BOOL build issue on OS X (bug #2497290)
  • Fixed iconv dependency detection on OS X (bug #2494539)
  • Fixed Solaris builds (patch #2497172)


2.42

F.5 2.42

2008年12月20日发行

F.5.1 发行说明

  • Merry Christmas and a happy Hanukkah!
  • Plug-in developers should check out the new plug-in API in Examples\Plugin and convert their plug-ins, especially in case they require staying loaded.

F.5.2 更新日志

F.5.2.1 主要更改

  • Deprecated /NOUNLOAD and SetPluginsUnload to make scripts simpler and safer (patch #1912699)
  • Useful header functions no longer require usage declaration and different syntax for uninstaller functions
  • Revamped plug-in API now comes in the form of pluginapi.lib, API version information and more common functions (patch #2359978)

F.5.2.2 次要更改

  • Added !searchreplace preprocessor command for compiletime text search/replaces
  • Added support for registration of EXE COM servers (RFE #2315740)
  • Minor documentation improvements (including bug #2386821)
  • nsDialogs: Added timer support (patch #2135855)
  • nsDialogs: Added progress bar support
  • WinVer.nsh: Added IsServer, IsWin2003R2, IsStarterEdition, OSHasMediaCenter and OSHasTabletSupport (patch by Anders)
  • WinVer.nsh: Fixed 95/NT4 ambiguity (bug #2053642)
  • WinVer.nsh: Proper Windows XP x64 detection (bug #2053700)
  • WinVer.nsh: Windows 2008 detection support (RFE #1949260)

F.5.2.3 翻译

  • Minor English grammar improvements (bug #2323452)

F.5.2.4 构建系统

  • Full System compatibility with GCC (patch #2193442)


2.41

F.6 2.41

2008年11月20日发行

F.6.1 更新日志

F.6.1.1 次要更改

  • Fixed LangDLL memory leaks for invalid input (bug #1939573)
  • Fixed uninstaller generation on big-endian systems (bug #2166401, bug #2167958)

F.6.1.2 翻译

  • Brazilian Portuguese corrections
  • Consistency fixes for Simple Chinese (patch #2189117)

F.6.1.3 构建系统

  • Added support for SCons 1.1.0
  • Fixed directory and components page text issues on VC8 builds (patch #1982084)
  • System's Resource.dll now built from source


2.40

F.7 2.40

2008年10月10日发行

F.7.1 更新日志

F.7.1.1 主要更改

  • Service pack macros added to WinVer in version 2.39 now work (bug #2070708, patch #2095363)

F.7.1.2 次要更改

  • Added initial folder selection option for nsDialogs::SelectFileDialog (patch #2016003)
  • Fixed GetParameters handling of MBCS characters (bug #2067946)
  • Fixed incorrect ${NSD_OnBack} documentation (bug #2059651)
  • Modern UI 2: Set focus to checkboxes on the finish page (bug #2110357)

F.7.1.3 翻译

  • Portuguese corrections (bug #2086988)
  • Simplified Chinese corrections (patch #2056906)


2.39

F.8 2.39

2008年8月16日发行

F.8.1 更新日志

F.8.1.1 主要更改

  • Added !define /file and !searchparse (patch #2016254)
  • Added service pack macros (AtLeastServicePack, IsServicePack, AtMostServicePack) to WinVer.nsh (patch #2036802)

F.8.1.2 次要更改

  • Added more nsDialogs list box handling macros (patch #2041919)
  • Added Unicode version compatible System string type (patch #2025721, RFE #1961307)
  • Fixed nsDialogs atom leak (bug #2053522)
  • Minor documentation improvements
  • Show hand cursor for nsDialogs links (patch #2004129)


2.38

F.9 2.38

2008年7月12日发行

F.9.1 更新日志

F.9.1.1 主要更改

  • Fixed a bug in nsDialogs that caused it to pollute the stack if callbacks are not set for each control (bug #2013317)

F.9.1.2 次要更改

  • Added IfNotThen support for LogicLib (patch #1990761)
  • Added support for NTFS mounts points on the directory page (bug #1946112)
  • Fixed branding image control detection on Debian, due to improper identification of static controls (bug #1951417)
  • Log actual creation of directories and not just failures and final directory (patch #1992325)
  • Made log close when LogSet off is used (patch #1986692)
  • Minor documentation improvements (including bug #1990955)
  • MultiUser: Fixed MULTIUSER_INSTALLMODE_INSTDIR handling for the uninstaller

F.9.1.3 现代界面

  • Document page leave callback function (bug #1964719)
  • Fixed MUI_FINISHPAGE_CANCEL_ENABLED
  • Fixed wasted variable warnings (bug #1995024)

F.9.1.4 翻译

  • Fixed French translation of MUI_UNTEXT_FINISH_INFO_REBOOT (patch #1967032)
  • Removed non-ANSI characters from French display name (bug #1979491)
  • Updated Slovenian (patch #2014106)


2.37

F.10 2.37

2008年5月3日发行

F.10.1 更新日志

F.10.1.1 主要更改

  • Fixed a bug introduced in 2.32 that caused blurry icons on Windows versions prior to XP (bug #1956350)
  • Use $PROGRAMFILES as a default for $PROGRAMFILES64 instead of "C:\Program Files" (bug #1947702)

F.10.1.2 次要更改

  • Automatically select language in case there is only one available choice (bug #1939571)
  • MultiUser: Fixed build errors with manual inclusion of StrFunc.nsh
  • Support for compression of files up to 2GB (patch #1948700)

F.10.1.3 工具和插件

  • Fixed ${NSD_OnBack} (bug #1947388)
  • Fixed nsDialogs::SelectFileDialog return value for user cancelation (bug #1955803)
  • Fixed possible BgImage crash when calling BgImage::Destroy more than once (patch #1951248)
  • Minor documentation improvements

F.10.1.4 翻译

  • Brazilian Portuguese updates
  • Polish updates (patch #1927421)
  • Slovak updates (patch #1939669)
  • Spanish updates

F.10.1.5 构建系统

  • SCons requirement upgraded to 0.98


2.36

F.11 2.36

2008年3月29日发行

F.11.1 发行说明

  • nsDialogs is picking up its pace and offers lots of new macros in this release. Keep the patches and requests coming!

F.11.2 更新日志

F.11.2.1 主要更改

  • nsExec: Support for x64 disabled redirection (RFE #1778973, bug #1889317)

F.11.2.2 现代界面

  • Added missing MUI_UNFUNCTION_DESCRIPTION_BEGIN and MUI_UNFUNCTION_DESCRIPTION_END
  • Fixed start menu page setting the error flag (bug #1891106)

F.11.2.3 nsDialogs

  • NSD_AddStyle and NSD_AddExStyle for easy customization (patch #1900588)
  • NSD_CB_AddString, NSD_CB_SelectString, NSD_LB_AddString and NSD_LB_SelectString for easier handling of combo and list boxes
  • NSD_CreateNumber and NSD_SetTextLimit for limited input fields
  • NSD_SetImage, NSD_SetStretchedImage, NSD_ClearImage and NSD_FreeImage for image handling
  • NSD_SetState, NSD_GetState, NSD_Check and NSD_Uncheck for handling of check boxes and radio buttons (patch #1900588)
  • NSD_SetText for easily setting control's text
  • OnClick support for labels (bug #1908732)
  • Support for edit box change notification in combo box

F.11.2.4 次要更改

  • Fixed exception handling of UPX compressed icons (bug #1896500)
  • Fixed InstallDirRegKey example in bigtest.nsi
  • Fixed Memento's documentation to include ${MementoSectionDone}
  • Fixed rare decompression error with 0x4001 bytes of compressed data (bug #1874297)
  • LangFile.nsh: Added LANGFILE_INCLUDE_WITHDEFAULT to load language file with defaults being obtained from a default file. This replaces the LANGFILE_DEFAULT setting and makes it easier to use LangFile.nsh for multiple sets of languages file without having to care about the different LANGFILE_DEFAULT settings.
  • Minor documentation improvements (including bug #1891266, bug #1894033, bug #1896803)
  • MultiUser: Fixed error when a custom installation mode initialization function is used only for the installer
  • MultiUser: Fixed default installation mode based on registry key (bug #1913029)
  • MultiUser: Fixed no uninstaller handling (MULTIUSER_NOUNINSTALL)

F.11.2.5 工具和插件

  • MakeNSISW: Avoid opening executables with identical folder names when opening script's folder (bug #1891066)
  • nsExec: Fixed return code handling so 259 won't cause an infinite loop (bug #1909458)
  • VPatch: Added MD5 functions (RFE #1900226)

F.11.2.6 翻译

  • Albanian updates (patch #1919360)
  • French fixes (patch #1916564)
  • Polish updates (patch #1894983)

F.11.2.7 构建系统

  • Fixed build of NSIS Menu with wxGTK (bug #1900233)
  • Use CRLF for DSW and DSP files to avoid corruption messages
  • Various build fixes for GCC 4.3, amd64 and Linux in general


2.35

F.12 2.35

2008年2月8日发行

F.12.1 更新日志

F.12.1.1 主要更改

  • Added MultiUser - installer configuration for multi-user Windows environments
  • More user friendly corrupted installer message (RFE #1795426)
  • Switched all examples to Modern UI 2

F.12.1.2 次要更改

  • Fixed uninitialized memory leaking into resources (bug #1874297)
  • Minor documentation improvements (including bug #1861941, bug #1883917)
  • Modern UI 2: Fit images in welcome/finish page by default and fix support for MUI_(UN)WELCOMEFINISHPAGE_BITMAP_NOSTRETCH (bug #1875945)
  • Modern UI 2: Fixed default finish page reboot selection (bug #1864690)
  • Modern UI 2: Fixed MUI_STARTMENU_GETFOLDER (bug #1864507)
  • Modern UI 2: Fixed unreferenced mui.StartMenuPage.Create warning (bug #1861944)
  • New simplified code for installation of VisualBasic 6 runtime
  • Simplified NSIS Menu providing easier access to all documentation

F.12.1.3 工具和插件

  • Added keyboard cues support for LINK controls in nsDialogs (patch #1871856)
  • Fixed a rare nsDialogs crash on Windows 98 with non-standard builds of nsDialogs (bug #1889720)


2.34

F.13 2.34

2007年12月24日发行

F.13.1 发行说明

  • Thanks to user input on Modern UI 2, it is now ready for mass consumption at no better time than the holiday season. The installer for NSIS itself now exploits the wonders of MUI2 and nsDialogs and so should you.

F.13.2 更新日志

F.13.2.1 主要更改

  • Modern UI 2: Simpler code, easier to extend and makes use of the faster nsDialogs

F.13.2.2 次要更改

  • Added IfNot support for LogicLib (patch #1846785)
  • Added some deprecation messages in MUI2 (bug #1784470)
  • Allow overwrite of LANGFILE_*_NAME defines in new LangFile.nsh (bug #1848952)
  • Better RTL support in instfiles and components page (bug #1841573)
  • Don't warn of comments containing line-continuation character when it has no effect (bug #1701051, RFE #1686589)
  • Fixed deletion of files with relative paths, a.k.a the EVE bug (bug #1851273)
  • Fixed input verification of GetCurInstType and GetFullPathName
  • Fixed WordFind handling of MBCS characters (bug #1852141)
  • Minor documentation improvements (including bug #1842326)
  • Use CRLF in examples (bug #1835866)

F.13.2.3 工具和插件

  • Added missing stack handling in nsDialogs examples
  • Added NSD_GetState for checkboxes and radio buttons, NSD_SetFocus, NSD_CreatePassword and NSD_CreateDropList (patch #1848940)
  • Fixed documentation of nsDialogs::SelectFolderDialog (bug #1841120)
  • Fixed NSD_CreateComboBox so it'd work like InstallOptions (bug #1851136)

F.13.2.4 翻译

  • Bulgarian updates
  • German fixes

F.13.2.5 构建系统

  • Fixed build issues on Mac OS (bug #1851365)
  • Fixed endianity issues introduced in version 2.32 (bug #1851365)


2.33

F.14 2.33

2007年11月17日发行

F.14.1 发行说明

  • This is a quick fix release for a bug, introduced in 2.32, that prevented the welcome page to display properly on Windows 9x. The problem was caused by the move from CVS to Subversion that messed with the line-breaks format of the INI files.

F.14.2 更新日志

F.14.2.1 主要更改

  • Modern UI: Fixed a bug, introduced in 2.32, that caused display problems for the welcome and finish pages on Windows 9x (bug #1831677)

F.14.2.2 次要更改

  • Modern UI: Allow MUI_LANGDLL_ALLLANGUAGES to be defined after insertion of MUI_LANGUAGE macro

F.14.2.3 工具和插件

  • Made nsExec's internal process always exit cleanly to avoid false return values and delays (reported in the forum)
  • nsDialogs: Added OnClick support for static controls
  • VPatch: Fixed VPatchFile macro path handling (bug #1829540)

F.14.2.4 翻译

  • Spanish updates

F.14.2.5 构建系统

  • Separate strip options for win32 and cross-platform binaries


2.32

F.15 2.32

2007年11月9日发行

F.15.1 发行说明

  • Vista PNG icons are now supported without the need for any special tricks.

F.15.2 更新日志

F.15.2.1 主要更改

  • Added support for mismatching installer and uninstaller icons
  • NSIS source code is now hosted on Subversion instead of CVS

F.15.2.2 次要更改

  • Fixed synchronization that could allow the user to cause extraction errors in rare cases (reported in the forum)
  • Fixed syntax validation of Var
  • Minor documentation improvements (including bug #1811876, bug #1819946)
  • Modern UI 2 beta: Fixed 3-line title on welcome/finish page
  • Modern UI 2 beta: Fixed components page description and lock
  • Modern UI 2 beta: Fixed default language selection from registry
  • Modern UI 2 beta: Fixed MUI_DIRECTORYPAGE_BGCOLOR

F.15.2.3 工具和插件

  • nsDialogs: Added link support

F.15.2.4 翻译

  • Bulgarian corrections
  • Fixed Japanese and Norwegian Nynorsk MUI line breaks (bug #1817289)

F.15.2.5 构建系统

  • Check compiler's -m32 flag before the linker's to avoid gcc segfault


2.31

F.16 2.31

2007年9月29日发行

F.16.1 发行说明

  • Please continue to report any issues and suggestions regarding Modern UI 2. Input for the previous version was very helpful in improving MUI2.

F.16.2 更新日志

F.16.2.1 次要更改

  • Added BST_* definitions to WinMessages.nsh (bug #1792422)
  • Added SetRegView lastused
  • Minor documentation improvements
  • Library will now revert registry view settings (SetRegView) after it's finished
  • Modern UI: Fixed empty welcome page with Chinese (bug #1786899)
  • Modern UI: Fixed finish button text (bug #1789492)
  • Modern UI: Fixed uninstaller comportments page text (bug #1793811)
  • Modern UI: Fixed unused function warnings
  • Modern UI 2 beta: Fixed header bitmap issues, including NOSTRETCH and compilation errors
  • Modern UI 2 beta: Fixed language selection dialog
  • Modern UI 2 beta: Fixed reboot finish page
  • Modern UI 2 beta: Fixed unloading of nsDialogs on finish page
  • Modern UI 2 beta: Fixed unused variable warnings

F.16.2.2 工具和插件

  • MakeNSISW: Fixed command line parsing error (bug #1796053)

F.16.2.3 翻译

  • Korean corrections
  • Persian improvements (patch #1776386)
  • Romanian improvements (patch #1783853)

F.16.2.4 构建系统

  • Fixed build failures with MinGW's GCC 4 (bug #1800834)


2.30

F.17 2.30

2007年8月25日发行

F.17.1 发行说明

  • This release includes a beta of Modern UI 2. Please report any issues and suggestions.
  • The format of Modern UI language files has been modified to better support external strings. Private language files should be converted (and submitted as a patch in the spirit of open source).

F.17.2 更新日志

F.17.2.1 主要更改

  • Fixed a bug introduced in version 2.29 that caused invalid $SMPROGRAMS value on Windows 98 (bug #1766268)
  • Modern UI 2 beta: Simpler code, easier to extend and makes use of nsDialogs

F.17.2.2 次要更改

  • Added InstallOptions.nsh with relevant usage macros, based on the old Modern UI macros
  • Added LangFile.nsh allowing creation of langauge files that can be included with a single command with defaults for missing strings (when LANGFILE_DEFAULT is set)
  • Added LB_ERR and CB_ERR to WinMessages.nsh (bug #1771644)
  • Fixed CreateDirectory logging (patch #1768584)
  • Fixed escaping of quotes with $\ in macros (bug #1713708)
  • Minor documentation improvements
  • Modern UI 1.80: New language files structure based on LangFile.nsh
  • Modern UI 1.80: MUI_LANGDLL_DISPLAY now reads previous settings on silent installations as well
  • Modern UI 1.80: Added MUI_CUSTOMFUNCTION_MOUSEOVERSECTION (patch #1762003)

F.17.2.3 工具和插件

  • Various nsDialogs improvements including RTL support, more macros in nsDialogs.nsh and initial documentation

F.17.2.4 翻译

  • Catalan returns
  • Danish corrections
  • Slovak corrections (patch #1762627)

F.17.2.5 构建系统

  • More HPUX fixes (bug #1755148, bug #1753063, bug #1758873, patch #1758863)
  • Ignore known failing tests by default on POSIX


2.29

F.18 2.29

2007年7月14日发行

F.18.1 发行说明

  • The most notable addition in this release is nsDialogs - a faster and far more capable replacement for InstallOptions. It allows creating controls of any type directly from the script and removes the need to mess with slow INI files. It integrates directly into the script by calling functions for notification, including change notification for edit boxes. Speak up if you have any suggestions/comments/patches for it.

F.18.2 更新日志

F.18.2.1 主要更改

  • Added nsDialogs - a replacement for InstallOptions

F.18.2.2 次要更改

  • Disable Windows error messages for the entire installer and not just for an incomplete list of fail-points (bug #1741061)
  • Fixed incorrect large version handling of GetFileVersion (bug #1742255, patch #1742562)
  • Fixed the ReverseSection macro in Sections.nsh (bug #1742793)
  • Minor documentation improvements
  • Simplified REG_MULTI_SZ reader
  • Use SHGetFolderPath where available to better support all users' folders

F.18.2.3 工具和插件

  • Banner: Avoid possible hangs when called from page callbacks (bug #1743801)
  • NSISdl: added /TRANSLATE2 for more "translator-friendly" strings (patch #1656076)
  • NSISdl: support downloads over 2gb (patch #1723131)

F.18.2.4 翻译

  • Added International Spanish

F.18.2.5 构建系统

  • Added support for HPUX (patch #1714416)


2.28

F.19 2.28

2007年6月8日发行

F.19.1 更新日志

F.19.1.1 主要更改

  • Added a workaround for a Windows 2000 bug that caused infinite loops when hitting a key in the instilfes page (bug #1733692)

F.19.1.2 次要更改

  • Improved compiler error strings (patch #1722147)
  • Modern UI: added MUI_STARTMENUPAGE_BGCOLOR and MUI_DIRECTORYPAGE_BGCOLOR (patch #1706187)
  • Modern UI: added MUI_LANGDLL_ALLLANGUAGES that forces the language selection dialog to display all languages (patch #1724876)

F.19.1.3 工具和插件

  • InstallOptions: corrected documentation of TxtColor (bug #1716614)
  • NSISdl: added compatibility with some buggy servers that don't close the connection (bug #1713562)
  • NSISdl: fixed 100% CPU usage during domain resolution (bug #1713560)

F.19.1.4 翻译

  • Valencian and Catalan are no longer installed (patch #1558822)

F.19.1.5 构建系统

  • Added IGNORETESTS for ignoring certain test files
  • Added wxWidgets to the requirement list
  • System now builds with GCC, but without System::Get and System::Call (patch #1711089)


2.27

F.20 2.27

2007年5月5日发行

F.20.1 发行说明

  • This is a quick-fix release that addresses a bug introduced in the last version, 2.26, that caused $PROGRAMFILES and $COMMONFILES to translate into random strings in the uninstaller.

F.20.2 更新日志

F.20.2.1 主要更改

  • Fixed a bug introduced in 2.26 that made $PROGRAMFILES and $COMMONFILES unavailable in the uninstaller

F.20.2.2 次要更改

  • Disable the X button on InstallOptions pages when CancelEnabled is 0
  • Fixed incomplete MessageBox usage line (bug #1709460)

F.20.2.3 构建系统

  • Added TOOLSET option to allow selection of specific build tools (e.g. scons TOOLSET=mingw)


2.26

F.21 2.26

2007年4月27日发行

F.21.1 发行说明

  • Installation on x64 systems is now fully supported with $PROGRAMFILES64, SetRegView and Library's LIBRARY_X64 option.

F.21.2 更新日志

F.21.2.1 主要更改

  • Added LIBRARY_X64 option for InstallLib and UnInstallLib for installing and uninstalling x64 libraries
  • Added $PROGRAMFILES32, $PROGRAMFILES64, $COMMONFILES32 and $COMMONFILES64

F.21.2.2 次要更改

  • Added $EXEPATH and $EXEFILE
  • Added $(^Language) language string which holds the language name (RFE #1235616)
  • Added LIBRARY_IGNORE_VERSION option for InstallLib (patch #1699435)
  • Added VXD support for GetDLLVersionLocal on Windows NT/2000/XP/Vista (patch #1706624)
  • Avoid Library warning when UnInstallLib is unused (bug #1692761)
  • Fixed error handling of CopyFiles on Windows NT4 (bug #774966)
  • Fixed font name encoding broken since 2.24
  • Fixed LogicLib duplicate labels across included files
  • Fixed preservation of folder attributes with File /a (bug #1699474)
  • Improved unused variable warning (bug #1701050)
  • Library macros no longer require version information for DLL files on POSIX
  • Minor documentation improvements (including RFE #971467)
  • Modern UI: added MUI_FINISHPAGE_CANCEL_ENABLED
  • Modern UI: added MUI_FINISHPAGE_REBOOTLATER_DEFAULT (RFE #1143843)
  • Modern UI: block unsupported languages in the language selection dialog (RFE #1564986)
  • Modern UI: disable Cancel button on the finish page (bug #1267491)
  • Modern UI: reduce flicker caused by MUI_HEADER_TRANSPARENT_TEXT (patch #1696610)
  • Support Quit in show page functions

F.21.2.3 新增/更改命令

  • Added SetRegView to allow access to the x64 registry view
  • Installer icon support for MessageBox using MB_USERICON (patch #1682748, RFE #1530388)

F.21.2.4 工具和插件

  • InstallOptions 2.47: line breaks support in Link controls (patch #1683186, RFE #1495949), added HLine and VLine controls (patch #1683189)
  • MakeNSISW: fixed broken command line parameter handling introduced in the last version (bug #1696534)
  • UserInfo: return effective user group on Vista, added GetOriginalAccountType (patch #1687456, bug #1684777)

F.21.2.5 翻译

  • Added Afrikaans translation (patch #1699558)
  • French corrections (patch #1676101)
  • German corrections

F.21.2.6 构建系统

  • Added SKIPTESTS option
  • Avoid a lot of code warnings (bug #1676243)
  • Detect wxWidgets instead of assuming its existence on POSIX (bug #1672315)
  • Fixed big-endian platform support broken since 2.24


2.25

F.22 2.25

2007年3月31日发行

F.22.1 更新日志

F.22.1.1 主要更改

  • Added Memento.nsh for easy persistency of user selections across different runs of the installer (RFE #1677624)
  • Fixed a bug introduced in 2.24 that allowed the license page to be skipped even with agreement check box or radio buttons (bug #1664428)

F.22.1.2 次要更改

  • Added Vista manifest to StartMenu.nsi example to avoid backward compatibility mode that moves shortcuts (bug #1664957)
  • Both dashes and slashes are supported as switch prefixes on makensis.exe (bug #1661503)
  • Delete uninstaller temporary directory on reboot (patch #1660626)
  • Distribute Plug-in example with the NSIS package and not only with the source code
  • Fixed lossy Unicode conversion of dialog template strings (bug #1662190)
  • Fixed Sections.nsh macros support for $0 as input (bug #1664648)
  • Fixed uninstallers support for the /D= command line switch
  • Improved logging of WriteReg commands
  • Minor documentation updates and fixes (including patch #1662419)

F.22.1.3 新增/更改命令

  • Added bitwise operators support for !define /math (RFE #1669513)
  • __PAGEEX__ contains the page type (patch #1644712)

F.22.1.4 工具和插件

  • InstallOptions 2.46: Use installer's name for message boxes (bug #1661677)
  • MakeNSISW: Use Escape button to close (RFE #1666501)
  • Math: Removed mathcrt.lib
  • StartMenu: Refuse empty paths (bug #1684751)

F.22.1.5 翻译

  • Fixed Galician language files (bug #1663795)

F.22.1.6 构建系统

  • Added APPEND_LIBPATH and APPEND_CPPATH instead of the malfunctioning CPPPATH and LIBPATH
  • Added 更新日志 to source code package (patch #1680508)
  • Avoid some warnings on VS2005 (patch #1667950)
  • Fixed lzma test segfault on POSIX (bug #1666873)
  • More strict-aliasing compatibility (bug #1635841)
  • NSIS Menu finally built from source


2.24

F.23 2.24

2007年2月17日发行

F.23.1 更新日志

F.23.1.1 主要更改

  • Library uninstall-reinstall-reboot problems workaround (bug #1097642)
  • Minimized number of cases where an error message appears in silent mode
  • New compiler predefines for code scope (patch #1644712)

F.23.1.2 次要更改

  • Added /P command line option for setting process priority of makensis (patch #1638974)
  • Added support for 64-bit PE on POSIX to GetDLLVersionLocal (patch #1643633)
  • Append last part of InstallDir only to $INSTDIR on directory pages (bug #1174184)
  • Avoid permissions change of output files for LineFind and FileJoin (bug #1631773)
  • Fixed erroneous warnings on uninstall sections (bug #1631889)
  • Fixed lossy Unicode conversion in resource editor (bug #1083492)
  • Ignore invalid preprocessor commands in ignored block or comments
  • Made VIAddVersionKey only query language tables instead of creating them and generating warnings (bug #1626504)
  • Minor documentation updates and fixes (including bug #1642107, patch #1649187)
  • Warn when continuing a comment line using backslash (bug #1554178)

F.23.1.3 新增/更改命令

  • RegDLL and UnregDLL now use LOAD_WITH_ALTERED_SEARCH_PATH, so there's no need to use SetOutPath to set the working directory (bug #1638191)

F.23.1.4 工具和插件

  • InstallOptions 2.45: Added FOCUS flag (patch #1634704) and fixed paste with ONLY_NUMBERS flag (bug #1652075)
  • MakeNSISW: settings in HKCU instead of HKLM (bug #1411970) and MRU menu accelerators

F.23.1.5 翻译

  • Added Galician translation (patch #1631765)

F.23.1.6 构建系统

  • Added a workaround for building on x64 POSIX platforms (bug #1646170)
  • Added a workaround for strict-aliasing compatibility (bug #1635841)
  • Added compression tests
  • Added STRIP, APPEND_CCFLAGS and APPEND_LINKFLAGS build options
  • Fixed SCons 0.96.94 compatibility


2.23

F.24 2.23

2007年1月13日发行

F.24.1 更新日志

F.24.1.1 次要更改

  • Fixed compiler crash on Mac OS X (patch #1611866)
  • Fixed deletion of start menu icons in NSIS installer on Vista (bug #1611251)

F.24.1.2 工具和插件

  • Fixed incorrect nsExec message handling in silent mode (bug #1605581)
  • Fixed System crash when System::Store is called on an empty private stack (bug #1620178)
  • Fixed System crash with parenthesis in filename (bug #1616267)
  • Minor VPatch documentation enhancements (patch #1624292)

F.24.1.3 构建系统

  • Fixed build failures on mingw32 (bug #1610773)
  • Fixed build problems with MSTOOLKIT=yes


2.22

F.25 2.22

2006年11月27日发行

F.25.1 发行说明

  • Some changes have been made to the credit and license files in order to avoid copyrights and license related confusions. This does not change in any way how NSIS should or could be used. NSIS itself is still licensed with the permissive BSD-like zlib license.
  • Upgrade is recommended for early adopters of WinVer.nsh, due to a bug in Windows 98 and ME detection.

F.25.2 更新日志

F.25.2.1 次要更改

  • Fixed context menu not disappearing when moving from instfiles page (bug #1115825)
  • Fixed WinVer.nsh's detection of Windows 98 and ME (reported on the forum)
  • Fixed WriteUninstaller failure to overwrite read-only uninstallers (bug #1542530)
  • Licensed lzma under CPL with a special exception, instead of LGPL
  • Minor documentation updates and fixes (including bug #1584618, bug #1589877)
  • Updated comments in MUI examples (bug #1595500)

F.25.2.2 新增/更改命令

  • Added `highest` option for RequestExecutionLevel

F.25.2.3 翻译

  • Added Uzbek translation
  • Fixed corruption in Lithuanian (bug #1602673)
  • Minor Breton fixes
  • Slovenian corrections (patch #1590108)

F.25.2.4 构建系统

  • Added Microsoft Visual C++ 2005 Express support
  • SCons requirement upgraded to 0.96.93


2.21

F.26 2.21

2006年10月20日发行

F.26.1 更新日志

F.26.1.1 主要更改

  • Added WinVer.nsh for easy Windows version comparisons
  • Upgraded to lzma sdk 4.43 for faster compression

F.26.1.2 次要更改

  • Added Vista support to GetWindowsVersion
  • Added x64.nsh including a few simple macros for handling x64 installations
  • Fixed a handle leak in Locate
  • Minor documentation updates and fixes
  • Modern UI 1.76: Added MUI_ABORTWARNING_CANCEL_DEFAULT (RFE #1547844)

F.26.1.3 新增/更改命令

  • Added RequestExecutionLevel (RFE #1524709)

F.26.1.4 翻译

  • Added Valencian translation (patch #1558822)
  • Bulgarian corrections
  • Slovenian corrections

F.26.1.5 构建系统

  • SCons requirement upgraded to 0.96.92


2.20

F.27 2.20

2006年9月9日发行

F.27.1 更新日志

F.27.1.1 次要更改

  • Better LogicLib errors (bug #1537976)
  • Fixed incomplete plug-in call error messages (bug #1535995)
  • Fixed incorrect file timestamp querying on big-endian platforms (bug #1536377)
  • Minor documentation updates and fixes

F.27.1.2 翻译

  • Danish corrections (bug #1548190)
  • Fixed incorrectly encoded Turkish translation (bug #1542765)
  • French corrections
  • Italian corrections (bug #1546183)
  • Spanish corrections
  • Swedish corrections (bug #1542680)
  • Ukrainian corrections

F.27.1.3 构建系统

  • Fixed NSIS_CONFIG_CONST_DATA_PATH being ignored on POSIX platforms (bug #1515592)


2.19

F.28 2.19

2006年8月6日发行

F.28.1 更新日志

F.28.1.1 次要更改

  • Fixed !system and !packhdr failure with quoted long file names (bug #1509909)
  • Fixed build problems on 64bit platforms (bug #1504772)
  • Fixed negative total size for data larger than 2GB in script compilation summary (bug #1468852)
  • Minor documentation updates and fixes
  • Replaced IsDotNETInstalled with a simpler and better version

F.28.1.2 新增/更改命令

  • Made !if compare strings case insensitively, like StrCmp and !ifdef

F.28.1.3 插件

  • NSISdl: fixed random DNS errors (reported in the forums)
  • System: fixed a bug that caused stack corruption and stopped the installer from deleting System.dll when a function with no arguments was called (bug #1535005)
  • System: fixed wrong return values for functions that return short or char (bug #1535007)

F.28.1.4 翻译

  • Added Norwegian Nynorsk translation (patch #1503208)
  • Fixed typos in the French translation (bug #1531874)


2.18

F.29 2.18

2006年7月1日发行

F.29.1 更新日志

F.29.1.1 次要更改

  • CRC32 implementation used potentially non-32bit types (bug #1504758)
  • Fixed errors on multiple inclusion of useful headers
  • Fixed GetFileAttributes
  • Fixed incorrect text on browse dialog with .onVerifyInstDir (bug #1504297)
  • Fixed Library's implementation on POSIX
  • Minor documentation updates and fixes

F.29.1.2 翻译

  • Added Irish translation (patch #1503639)
  • Catalan corrections (bug #1504104)
  • Dutch corrections
  • Finnish corrections (Mozilla bug #341643)
  • Fixed Serbian grammar and typos
  • Italian corrections (Mozilla bug #340450)
  • Polish corrections (Mozilla bug #224532)
  • Portuguese (Brazil) corrections (Mozilla bug #340885)
  • Romanian corrections (Mozilla bug #340645)
  • Thai corrections
  • Turkish corrections (Mozilla bug #340511)


2.17

F.30 2.17

2006年5月19日发行

F.30.1 更新日志

F.30.1.1 次要更改

  • Fixed build failures and segfaults on PowerPC Mac OS X (bug #1474597, bug #1481044)
  • Fixed Library's TLB version interpretation (bug #1471341)
  • Fixed possible stack corruption when using TypeLib.dll on an invalid TLB
  • Fixed RMDir deletion failure of read-only folders (bug #1481664)
  • MakeNSISW: Fixed toolbar compressor selection menu, broken in the previous version (bug #1466486)
  • Minor documentation improvements and fixes (including bug #1469306, bug #1491616)

F.30.1.2 翻译

  • Added missing Basque and Welsh files (bug #1469471)
  • Brazilian Portuguese updates
  • Bulgarian fixes
  • Fixed a typo in Hebrew translation (bug #1474587)
  • Icelandic fixes and improvements


2.16

F.31 2.16

2006年4月7日发行

F.31.1 发行说明

  • The script compiler, makensis, builds and works on big-endian platforms. This change enlarges the portability range of NSIS to theoretically every POSIX platform. Please report any incompatibility with specific platforms or build-tools.
  • The internal changes made to support big-endian platforms also pave the road to x64 installers. There is now a central function which writes data to disk. This function currently only converts the endianity of integers, but it can be changed to selectively write 64-bit integers. Hopefully, there'll soon be a simple method of compiling a script to both x86 and x64 installers.
  • Changing Source/exehead/fileform.h to alter the internal structure of installers is no longer enough. The compiler has its own definitions of the structures which must also be changed in Source/fileform.cpp. In the future, fileform.cpp should be automatically generated from fileform.h, but for now, the synchronization must be done manually.

F.31.2 更新日志

F.31.2.1 主要更改

  • Big-endian platforms are now fully supported by makensis
  • Library now available on non-Windows platforms as well, although it requires the installed DLL to have version information
  • MakeNSISW 2.1: added "Cancel compilation" menu item

F.31.2.2 新增/更改命令

  • Added /utcdate switch to !define for UTC dates (RFE #1459210)

F.31.2.3 次要更改

  • Added an optional timestamp in the log - NSIS_CONFIG_LOG_TIMESTAMP build setting (RFE #1460586)
  • Added NSIS_WIN32_MAKENSIS define, defined only when compiling on Windows
  • Exported validate_filename to plug-ins
  • Fixed a crash in CResourceEditor when adding resources to a PE that already contains named resources
  • Fixed a small resource leak in the TypeLib::GetLibVersion plug-in function
  • Fixed CResourceEditor input sanity checks
  • Fixed incorrect FileOpen input validation (bug #1459789)
  • Fixed Library failure with DLLs marked as read-only
  • Fixed lzma's POSIX implemention thread synchronization issues and resource leaks
  • Fixed makensis self-path detection on non-Windows platforms (NSIS_CONFIG_CONST_DATA_PATH=no)
  • Fixed replace_icon and and generate_uninstall_icon_data icon validation
  • Made external CHM links safer to script exceptions (bug #1449879)
  • Minor documentation improvements and fixes (including bug #1077439, bug #1448374, RFE #1464446)
  • Modern UI 1.75: added show function for the start menu page (RFE #1448176), added MUI_HEADER_TRANSPARENT_TEXT for transparent header texts (RFE #1447766)
  • NSISdl: better header detection for better compatibility with proxies like WinProxy (bug #1445735), fail if no headers are sent, faster downloads (patch #1465378)
  • StartMenu: validate user input (bug #1440636)

F.31.2.4 翻译

  • Added Basque translation
  • Minor Slovenian fixes

F.31.2.5 构建系统

  • Added code tests for CResourceEditor and CDialogTemplate
  • Automatically pass build settings to script, eliminating the need to edit build.cpp for new settings
  • Fixed $PREFIX expansion during installation on POSIX platforms (bug #1456943)
  • Fixed CHM dependencies
  • Fixed compatibility issue with EclipseNSIS (version wasn't prefixed with 'v')
  • Fixed GCC 4.1 compatibility (patch #1456861)
  • Test for -Wl,-Map availability


2.15

F.32 2.15

2006年3月4日发行

F.32.1 更新日志

F.32.1.1 新增/更改命令

  • Added !if for more complex compile-time flow control (patch #1412982)
  • Added /math switch to !define for simple compile-time mathematical operations (patch #1372561)

F.32.1.2 次要更改

  • Added more replacement options to WordReplace
  • Added NSIS_CONFIG_LOG_STDOUT configuration option for logging to stdout
  • Added path translation for !addincludedir (bug #1431958)
  • ConfigRead now sets the error flag, if the entry wasn't found
  • Documented Nop
  • Edit box in the installation directory selection page is now always LTR, even for RTL languages
  • Fixed improper iterator usage in dir_reader (bug #1431593)
  • Fixed MessageBox MB_TOPMOST not showing up, if used as the first sections' instruction (bug #1400995)
  • Fixed RMDir skipping files with names starting with two dots (bug #1420657)
  • GetOptions now sets the error flag, if the option wasn't found
  • Made !include stop searching the include directories after a match is found (bug #1441877)
  • Made header functions use /NOUNLOAD for faster plug-in calls
  • Minor documentation improvements and fixes (including bug #1420352, bug #1432423)
  • More informative Icon error messages (bug #1174742)
  • New case sesnsitive functions in headers: WordFindS, WordFind2XS, WordFind3XS, WordReplaceS, WordAddS, WordInsertS, StrFilterS, TextCompareS, ConfigReadS, ConfigWriteS, GetOptionsS

F.32.1.3 翻译

  • Added proper language identifier for Breton
  • Breton translation improvements
  • Bulgarian translation improvements
  • Fixed Czech grammer mistakes (patch #1427189)
  • Fixed Italian typo (patch #1416988)
  • Updated Mongolian

F.32.1.4 构建系统

  • Fixed __BIG_ENDIAN__ definition
  • Fixed improper handling of paths passed to the compiler (bug #1434215)
  • Improved GCC 4.2 compatibility (patch #1434174)
  • Moved NSIS_VARS_SECTION from config.h to scons
  • Write all configuration to sconf.h instead of passing it on the command line


2.14

F.33 2.14

2006年1月24日发行

F.33.1 发行说明

  • This release fixes a critical bug that caused installers using plug-ins to fail loading on Windows 9x and NT. Upgrading from 2.13 is highly recommended.

F.33.2 更新日志

F.33.2.1 主要更改

  • Fixed a bug that corrupted $TEMP under Windows 9x and NT and caused InitPluginsDir to fail (bug #1412159)

F.33.2.2 次要更改

  • Fixed a possible buffer overflow caused by long values of $0, when using large NSIS_MAX_STRLEN builds (above 4096)


2.13

F.34 2.13

2006年1月21日发行

F.34.1 发行说明

  • Language detection has changed. The default language is now set to the user's user-interface language instead of the locale language, as suggested by MSDN. To restore the old behavior, use System::Call "kernel32::GetUserDefaultLangID()i.a" in .onInit.

F.34.2 更新日志

F.34.2.1 主要更改

  • Default $LANGUAGE value is now based on user's UI language instead of locale (bug #1324734)

F.34.2.2 新增/更改命令

  • Added StrCmpS for case sensitive string comparison (patch #1381929)

F.34.2.3 次要更改

  • Added system time support to GetTime
  • Fixed components page checkbox redraw problem under Windows 95 (bug #1397031)
  • Fixed constant maximum string length in FileRead (changed from 1024 to NSIS_MAX_STRLEN)
  • Fixed empty $INSTDIR value in directory page show callback function (bug #1209843)
  • Fixed relative jumps ignoring File /nonfatal (bug #1299100)
  • Fixed typo in NSIS Menu (bug #1387748)
  • Issue a warning when BrandingText /TRIM* actually expands the label (bug #1362443)
  • Made RMDir /r remove Unicode paths as well using short names (bug #1378785)
  • Minor documentation improvements and fixes

F.34.2.4 工具和插件

  • Fixed System plug-in documentation of callback functions (bug #1403608)
  • Fixed System plug-in heap corruption (bug #1403601)

F.34.2.5 翻译

  • Mongolian translation improvements

F.34.2.6 构建系统

  • Better installation under POSIX with proper ${NSISDIR} detection and appropriate directory paths (/usr/bin, /usr/share/doc, etc.)


2.12

F.35 2.12

2005年12月17日发行

F.35.1 更新日志

F.35.1.1 主要更改

  • Fixed compile-time assertion failure for big uninstallers (bug #1380447)
  • Tutorial enhancements (including bug #1366431)

F.35.1.2 新增/更改命令

  • Added /NONFATAL switch to !include (patch #1372048)

F.35.1.3 次要更改

  • Clearer error message for double label definition (patch #1374675)
  • Fixed browsed network root directory not being accepted (bug #1331292)
  • Fixed incorrect CompletedText parsing (bug #1349810)
  • Fixed sdbarker_tiny.exe's compatibility with NSIS_CONFIG_LOG (bug #1365869)
  • Implemented nicer registry commands log (patch #1340255)
  • Minor documentation improvements and fixes (including patch #1355653, bug #1349810)
  • Multi-line comments are no longer ignored inside !ifdef'd block

F.35.1.4 工具和插件

  • Added drag & drop support for zip2exe
  • Better drag & drop error handling in MakeNSISw
  • Fixed Math plug-in array issues (bug #1235875)

F.35.1.5 翻译

  • Added browse button Danish translation
  • Breton translation fixes and improvements
  • Fixed finish button Swedish translation

F.35.1.6 构建系统

  • Fixed endianess detection problem on POSIX platforms (bug #1370179)
  • Generated installers use nsis-VERSION-setup.exe template


2.11

F.36 2.11

2005年11月12日发行

F.36.1 发行说明

  • Rebuilding existing installers that use SetOverwrite ifdiff, might falsely overwrite files once

F.36.2 更新日志

F.36.2.1 主要更改

  • Added a workaround for a bug that prevented detection of some special folders (e.g. $DESKTOP for all users) on Windows 9x (bug #1008632)
  • Fixed a crash caused by copying very long details to clipboard in the installation log page (bug #1314004)

F.36.2.2 新增/更改命令

  • Added !tempfile, !delfile and !appendfile for cross-platform handling of text files during compilation
  • Fixed ChangeUI input handling (patch #1348473)
  • SectionIn RO is no longer case sensitive

F.36.2.3 次要更改

  • Added support URL to the NSIS package entry in the Add/Remove control panel (RFE #1349867)
  • Fixed comment handling (patch #1324898)
  • Fixed duplicate RegTool test in Library
  • Fixed invalid language selection according to $LANGUAGE in .onInit when only primary language match is found (bug #1328629)
  • Fixed missing RegTool error after install-reboot-install-reboot sequence with Library
  • Fixed portability issues with LogicLib (bug #1320297, patch #1248336)
  • Fixed SetOverwrite ifdiff always overwriting on FAT file system (bug #1338423)
  • Fixed wrong size of red.bmp check box image
  • Larger browse button for localized texts (bug #1314682)
  • Minor documentation improvements and fixes (including bug #1349810)
  • Sort language names in language selection dialog
  • Use the temporary directory for Library temporary files, instead of the possibly write-protected installation directory

F.36.2.4 工具和插件

  • Added /OEM switch for OEM to ANSI conversion in nsExec (patch #1346737)
  • Added /PROXY switch for manual proxy configuration in NSISdl (patch #1334166)
  • Added solid compression check box to zip2exe (patch #1334155)
  • Added stdin in MakeNSISw to allow xcopy to run
  • Added timestamp handling to zip2exe (bug #1349853)
  • Fixed input validation of nsExec
  • InstallOptions 2.44: Added HWND and HWND2 entries to the INI file to avoid messy calculations of the correct control id

F.36.2.5 翻译

  • Slovenian translation fixes and improvements

F.36.2.6 构建系统

  • Added a workaround for linking errors caused by a bad library included in recent Platform SDK versions
  • Check for and use -pthread linker flag
  • Improved FreeBSD portability
  • Nicer error message for SCons version older than 0.96.90


2.10

F.37 2.10

2005年10月4日发行

F.37.1 更新日志

F.37.1.1 主要更改

  • Added auto completion to the directory page
  • Fixed a bug, introduced in 2.09, that caused AllowRootDirInstall to fail
  • Fixed a thread leak in the POSIX implementation of LZMA
  • VPatch 3.1: MD5 checksums, better performance, and some bug fixes (including bug #1219806)

F.37.1.2 次要更改

  • Added rounding of required and available size on the directory page (1.59 => 1.6 instead of 1.5)
  • Added WS_EX_LEFTSCROLLBAR style in RTL mode (bug #1283528)
  • Fixed alteration of the working directory by FileRequest in InstallOptions (bug #1287731)
  • Fixed bad mnemonic key in MakeNSISw menu (bug #1288159)
  • Fixed negative size values showing up after the decimal point in the directory page for very big sizes
  • Minor documentation improvements and fixes
  • Modern UI 1.74: Fixed compile error when checkboxes are used on multiple finish pages

F.37.1.3 翻译

  • Fixed a bug in Slovenian translation that caused lots of missing language string warnings
  • Fixed typos in Serbian translation
  • Fixed typos in Thai translation
  • Updated Simple Chinese translation

F.37.1.4 构建系统

  • Automatic fix for VC6 SP6 compile error
  • Moved most of the configuration from config.h to the 构建系统
  • Removed all optimizations and symbol stripping in debug mode
  • SCons requirement updated to 0.96.91
  • VPatch can be built on POSIX as well


2.09

F.38 2.09

2005年8月26日发行

F.38.1 更新日志

F.38.1.1 主要更改

  • Fixed a bug introduced in 2.08, that prevented uninstallers from deleting $INSTDIR
  • Fixed a bug that caused "C:\ " to be considered a valid installation directory, even without AllowRootDirInstall

F.38.1.2 新增/更改命令

  • Var can now be used in sections and functions, but only with the /GLOBAL flag

F.38.1.3 次要更改

  • Applied patch #1248335 for greater portability of examples
  • FileFunc: workaround for GetLongPathName which is not available on Windows 95 (Instructor)
  • Fixed an unused label warning in Library
  • Fixed duplicate label errors in LogicLib and Library when used in different files (bug #1243865)
  • Modern UI 1.73: fixed checkboxes on uninstaller finish page or multiple finish pages
  • WordFunc: fixed incorrect replacement of first word in WordReplace, under some conditions (Instructor)

F.38.1.4 翻译

  • Renamed Malaysian to Malay
  • Update Thai translation to the latest version
  • Updated Kurdish MUI translation to the latest version

F.38.1.5 构建系统

  • Fixed a number of build problems on POSIX platforms which caused plug-ins to malfunction and installers to crash


2.08

F.39 2.08

2005年7月23日发行

F.39.1 发行说明

  • The Archive has been replaced with a Wiki. The new Wiki allows everyone to edit all pages so there's no longer need to hunt for the original author. It also allows everyone to upload plug-ins and not just administrators. And as if that's not enough, it looks better and provides easier and more feature-rich syntax.

F.39.2 更新日志

F.39.2.1 主要更改

  • Added Instructor's header files of useful functions
  • Library improvements: ordered registration after reboot, smaller RegTool and separate process for each registration to avoid conflicts (thanks stb)

F.39.2.2 次要更改

  • Added Bosnian and Kurdish translations
  • Added per-user nsisconf.nsh file in %APPDATA% or $HOME, depending on the platform (patch #1223041)
  • Documentation improvements and fixes (including bug #1202495, bug #1227610, bug #1238686, patch #1225167, RFE #1240601)
  • Fixed _?= being ignored, if the uninstaller path is not quoted and is separated with only space from _?=
  • Fixed Library failing on paths with spaces (bug #1234283)
  • Fixed UpgradeDLL compilation error (bug #1230336)
  • Improved French, Ukrainian and Luxembourgish translation
  • Made RMDir set the error flag, if passed an invalid directory path (bug #1227553)
  • Made uninstallers copy themselves into a subdirectory of the temporary directory to avoid DLLs left in the temporary directory from being loaded by the uninstaller (patch #1214319)
  • Missing LangString warning now uses the language name, if possible
  • zip2exe: fixed restriction of extraction path length and updated to zlib 1.2.3 (bug #1226381)

F.39.2.3 构建系统

  • Added linker script to assure correct order of sections when building using GNU tools
  • Added test target
  • UIs are now built from source


2.07

F.40 2.07

2005年6月20日发行

F.40.1 发行说明

  • NSIS Update was removed and the update check was moved back to MakeNSISw (Help -> NSIS Update). Use the nightly builds to get the latest compiled binaries from CVS.
  • Solid compression is no longer the default for bzip2 and lzma, use SetCompressor /SOLID bzip2 or SetCompressor /SOLID lzma for solid compression.
  • Source code is no longer supplied with the installer package. Source code can be downloaded from CVS or from the download page.
  • The directory structure of the installation has been changed. All documentation is now in the Docs folder and all examples are in the Examples folder.

F.40.2 更新日志

F.40.2.1 主要更改

  • Added /SOLID switch for SetCompressor
  • New build system (see appendix G)
  • Stubs (exeheads) are no longer compiled into makensis.exe, but kept in the Stubs folder

F.40.2.2 新增/更改命令

  • EnumRegValue sets the error flag, if the enumeration index is out of range (bug #1178756)
  • ExpandEnvStrings now sets the error flag as the documentation states
  • Made File /oname throw an error if the first character is a quote

F.40.2.3 次要更改

  • Added $LOCALAPPDATA (RFE #1172123)
  • Changed MUI dialogs charset from ANSI_CHARSET to DEFAULT_CHARSET (bug #1193736, bug #1201712)
  • Fixed $INSTDIR changing, even if user clicked Cancel in browse dialog
  • Fixed a crash in makensis when using WindowIcon off (bug #1123353)
  • Fixed Call :label in uninstall code
  • Fixed compilation error without NSIS_CONFIG_COMPONENTPAGE
  • Fixed compilation errors on various platforms (including patch #1179116, patch #1193692)
  • Fixed CreateDirectory setting the error flag for directories with two consecutive backslashes (bug #1119442)
  • Fixed InstallLib setting the error flag for new shared libraries (bug #1181951)
  • Fixed letters case in examples (patch #1184571)
  • Fixed logging state being reset after the directory page (bug #1168711)
  • Fixed overlapping icon in welcome page (bug #1221772)
  • Fixed RMDir /REBOOTOK setting the reboot flag when trying to delete non-existent directory (bug #1073792)
  • Minor documentation fixes and improvements (including bug #1220940)
  • Removed NSIS Update, MakeNSISw checks for new versions again

F.40.2.4 头文件

  • More messages in WinMessages.nsh (Shengalts Aleksander)
  • Some more useful macros in Colors.nsh (Joel)

F.40.2.5 工具和插件

  • Fixed halibut segfaults on PowerPC (patch #1180886)
  • Math: Fixed memory leak (brainsucker)
  • zip2exe: upgraded to zlib 1.2.2

F.40.2.6 翻译

  • Added Malaysian translation (Azwa)
  • Added Welsh translation (Rhoslyn Prys)
  • Fixed Breton NLF file (credits weren't commented)
  • Fixed duplicate accelerator in French translation (bug #1168652)
  • Improved French translation (bug #1220277)
  • Updated Russian translation (Dmitry)
  • Updated translation credits (patch #1223362)


2.06

F.41 2.06

2005年3月19日发行

F.41.1 更新日志

F.41.1.1 主要更改

  • Fixed a bug, introduced in 2.05, that made components selection not function properly if the first section in the script was a section group
  • Fixed a bug, introduced in 2.05, that corrupted the state of section groups inside section groups (bug #1155836)

F.41.1.2 新增/更改命令

  • Added MB_RTLREADING style to MessageBox (RFE #1159701)
  • All registry instructions now accept SHCTX which is replaced with HKLM or HKCU on runtime according to SetShellVarContext (RFE #1124901)

F.41.1.3 次要更改

  • Added Belarusian and Icelandic language files
  • Added components.c to the Makefile (patch #1123154)
  • Added missing ClearErrors in GetWindowsVersion (bug #1155588)
  • Fixed a bug in install.sh that made it try to install a non existing directory
  • Fixed a bug in the Russian language file distributed with 2.05
  • Fixed a bug that caused SetFont to not function properly with RTL languages on Windows 9x (bug #1159700)
  • Fixed a bug, introduced in 2.05, that caused problems with InstType /COMPONENTSONLYONCUSTOM (bug #1155060)
  • Fixed a crash caused by compiling large uninstallers (bug #1144763)
  • Fixed compile error without NSIS_CONFIG_CRC_SUPPORT
  • Fixed compile errors of MinGW on POSIX for source code under Contrib (patch #1164307)
  • Fixed plug-ins directory initialization for extremely restricted guest users with no directory listing access to the temporary directory
  • Made install.sh not use $(tempfile) and install files under /usr/share instead of /lib (patch #1120399)
  • Minor documentation updates and fixes
  • Updated Slovenian, Serbian and Serbian Latin language files

F.41.1.4 工具和插件

  • AdvSplash: Fixed a small memory leak (Thanks Takhir)
  • StartMenu: Added support for SetCtlColors (RFE #711900)


2.05

F.42 2.05

2005年2月4日发行

F.42.1 发行说明

  • A lot of changes were made to the behavior of sections/components and related instructions. The changes were thoroughly tested, but may still cause minor incompatibilities with old scripts. Please let us know if your script no longer functions as expected with these changes.

F.42.2 更新日志

F.42.2.1 新增/更改命令

  • Renamed SubSection and SubSectionEnd to SectionGroup and SectionGroupEnd
  • SectionSetFlags, when used on a section group, toggles its children too
  • SectionSetText works better with variables (parses immediately and treats an empty variable as an empty string)
  • SetCurInstType works without the components page

F.42.2.2 次要更改

  • Added Breton translation
  • AdvSplash: Fixed double delay time in some cases
  • Documentation fixes and enhancements (including patch #1098454)
  • Fixed case sensitive name comparison with File /x, when not using wildcards
  • Fixed extraction status ending prior to 100%
  • Fixed negative values of available space in the directory page (bug #1114876)
  • Fixed system.nsi example crash (bug #1102255)
  • Fixed unused label warnings with Library macros
  • Improved some error messages
  • InstallOptions 2.42: Added an image displaying example, added TRANSPARENT flag for BITMAP fields (RFE #1079715 - funded by Chris Morgan)
  • Invisible sections weren't always affected by a change of the installation type (bug #1045722)
  • Language file fixes
  • Made pages refresh after an aborted leave function
  • Partially selected section groups can now be toggled


2.04

F.43 2.04

2005年1月7日发行

F.43.1 更新日志

F.43.1.1 主要更改

  • Fixed $0 changed by File /r
  • Fixed empty directory not included by File /r
  • Fixed invalid directory creation by File /r on POSIX
  • Fixed Unicode conversion problems on POSIX

F.43.1.2 次要更改

  • Added new test for dir_reader::matches
  • Fixed LibraryLocal failure with UNC paths
  • Fixed VC 7.1 and GCC 3.4 compile errors
  • Language file fixes


2.03

F.44 2.03

2004年12月3日发行

F.44.1 发行说明

  • If you're using File /r folder in your script, it's recommended you replace it with File /r folder\* for faster compilation and so no other folders named folder will be included
  • Command line switches prefix on POSIX has changed to a dash
  • The plug-in API change is backward compatible

F.44.2 更新日志

F.44.2.1 主要更改

  • Added another parameter to plug-in functions with a pointer to exec_flags and ExecuteCodeSegment
  • Fixed handling of absolute paths on POSIX
  • Made RegDLL load and unload a DLL exactly once to fix crashes with COM DLLs registration

F.44.2.2 新增/更改命令

  • Added /date switch to !define for definition of date and time constants
  • Added /x switch for File and ReserveFile to exclude files and directories
  • Made File's /r switch always search in subdirectories, even if the given path points to an existing directory

F.44.2.3 次要更改

  • Added LIBRARY_SHELL_EXTENSION and LIBRARY_COM to Library
  • Added missing #include
  • Added NSIS_LZMA_COMPRESS_WHOLE to the script define list
  • Documentation fixes and improvements
  • Fixed an access violation in case of a script jump beyond the last entry
  • Fixed keyboard navigation in the instfiles page while installing
  • Fixed unpacking window not showing when BGGradient is used
  • Fixed unused label warning in Library.nsh
  • Language file fixes
  • Modern UI 1.72: Fixed state of Cancel button on Finish page when used in installer and uninstaller, added a string for NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE
  • nsisconf.nsh was not always parsed when compiling using MakeNSISw


2.02

F.45 2.02

2004年10月23日发行

F.45.1 更新日志

F.45.1.1 主要更改

  • Added lots of small usage examples to the documentation
  • Made relative jumps work with instructions that add multiple entries
  • Made the datablock optimizer much faster
  • Made the installer deny reboots while running (WM_QUERYENDSESSION)
  • Made the Reboot command first quit and then reboot so everything is always cleaned-up

F.45.1.2 新增/更改命令

  • Added << and >> to IntOp
  • Added GetErrorLevel and SetErrorLevel
  • Fixed CopyFiles usage checking problem
  • Made Reboot call .onRebootFailed and quit on failure instead of setting the error flag

F.45.1.3 次要更改

  • Added Albanian language files
  • Added NSIS_CONFIG_COMPONENTPAGE_ALTERNATIVE configuration option which makes components only be toggled when the user clicks on the checkbox and makes .onMouseOverSection only be called when the user selects a component
  • Added some CppUnit tests
  • Both _=? and /D= now require a space before them so they can safely remove the space from $CMDLINE
  • Fixed a bug that caused the uninstaller CRC-check to fail if !packhdr created a non-512-bytes-aligned exehead
  • Fixed a compiler crash caused by using GetCurrentAddress
  • Fixed errors when using 'File /r .' on Windows
  • Fixed gcc 3.4 compile errors
  • Fixed inconsistencies between error levels and the documentation
  • Fixed some minor memory leaks
  • Language file fixes
  • Makefile improvements
  • Modern UI 1.71: Made the selected language only be saved if the installation was successful
  • Some code refactoring
  • StrFunc: Rewrote StrSort and fixed StrStrAdv. See the readme for a complete 更新日志

F.45.1.4 工具和插件

  • Banner: Fixed some cases where the banner would not show on the foreground


2.01

F.46 2.01

2004年9月24日发行

F.46.1 发行说明

  • See Compiling NSIS Sources for information about compiling makensis on POSIX platforms
  • NSIS doesn't create installers for Linux/Mac OS X etc., but you can compile Windows installers on these platforms
  • UpgradeDLL is still provided in UpgradeDLL.nsh for backwards compatibility

F.46.2 更新日志

F.46.2.1 主要更改

  • Compiler (makensis) supports POSIX platforms (Linux, *BSD, Mac OS X, etc.)
  • New system for DLL/TLB library setup

F.46.2.2 新增/更改命令

  • Added BGFont that allows setting the background text font
  • Added SW_HIDE to ExecShell's accepted show modes
  • RMDir can now be used with both /r and /REBOOTOK at the same time
  • Extended maximum binary data for WriteRegBin to 3 * NSIS_MAX_STRLEN
  • Added !execute

F.46.2.3 次要更改

  • LZMA exehead is now 34KB and should also decompress faster
  • Windows 95 (OSR2)/98/ME no longer see drive free space capped to 2GB
  • Modern User Interface: New orange theme by MoNKi
  • Speedup background gradient painting
  • LogicLib 2.5: Added AndIf, AndUnless, OrIf, OrUnless. Avoids unused variable warnings by requiring !defines before using certain features.
  • StrFunc: Added support for uninstaller, some fixes and improvements. See the readme for a complete 更新日志
  • The plug-ins folder is properly removed when the system is rebooted
  • SetOutPath "-" works again
  • Fixed a bug which made plug-ins that didn't have lower case extension not be found
  • Fixed a bug that caused directories with drives that had their current directory set to an invalid directory to not be accepted in the directory selection page
  • Fixed a crash in makensis caused by defining a macro in a file included by another macro
  • makensis shows meaningful errors for compression errors instead of just magic numbers
  • Fixed a bug with AllowRootDirInstall used along with InstallDirRegKey that caused the directory in the registry to be ignored
  • Fixed FileRead setting the error flag when a null character is the first character it reads
  • Fixed a bug which caused the background gradient to paint slowly
  • File paths relative to the root folder work again
  • Added Colors.nsh
  • Made Times New Roman default font for the background text because it should always have support for the locale's language
  • Fixed compilation of NSISdl under VS.NET
  • SetCtlColors /BRANDING wasn't working right, if just one of the background or text color were specified
  • Language file fixes and improvements

F.46.2.4 工具和插件

  • System: New, hopefully more informative, documentation; fixed some bugs
  • Banner: Added getWindow to allow greater control over the banner window
  • InstallOptions 2.41: Bitmaps are now automatically centered, fixed a bug which prevented enabling the next button from the leave function of InstallOptions pages, fixed a rare freeze
  • Zip2Exe 0.32: Fixed codepage problems
  • nsExec: Always create a valid input handle, fixed a problem when called from a path with spaces
  • VPatch: Close all open file handles when one of them fail to open
  • NSISdl: Added /NOIEPROXY (based on memph's code)


2.0

F.47 2.0

2004年2月7日发行

F.47.1 发行说明

  • Finnish, Bulgarian and Thai language files are outdated and do not contain all needed translations

F.47.2 更新日志

F.47.2.1 更改自 1.98

  • Multiple languages in one installer support (with RTL support)
  • Easier plug-in system
  • Modern User Interface (optional)
  • LZMA compression which provides installers 20% smaller than bzip2
  • Easier paging system (no more .onNextPage, .onPrevPage)
  • Components are presented as a tree which allows sub components
  • User variables ($VARNAME)
  • Icon and UninstallIcon support any color depth and sizes, not just 32x32x16
  • CheckBitmap supports any color depth
  • Improved large files handling
  • License data can be RTF
  • CHM documentation for easy browsing
  • Better silent support
  • New include files for easier scripting: LogicLib, StrFunc and Sections
  • Improved plug-ins: InstallOptions, NSISdl and Splash
  • New plug-ins: AdvSplash, Banner, BgImage, Dialer, LangDLL, Math, nsExec, StartMenu, System, UserInfo and VPatch
  • New and improved utilities: MakeNSISw, NSIS Menu (NSIS.exe), NSIS Update (Bin\NSIS Update.exe) and zip2exe (Bin\zip2exe.exe)
  • New commands: !addplugindir, !echo, !ifmacrodef, !ifmacrondef, !verbose, AddBrandingImage, AllowSkipFiles, ChangeUI, CheckBitmap, CreateFont, DirVar, DirVerify, EnableWindow, FileBufSize, FlushINI, GetCurInstType, GetDlgItem, GetInstDirError, IfAbort, IfSilent, InitPluginsDir, InstTypeGetText, InstTypeSetText, LangString, LicenseBkColor, LicenseForceSelection, LicenseLangString, LoadLanguageFile, LockWindow, Page, PageEx, ReserveFile, SectionGetInstTypes, SectionGetSize, SectionSetInstTypes, SectionSetSize, SetBrandingImage, SetCompressionLevel, SetCompressor, SetCompressorDictSize, SetCtlColors, SetCurInstType, SetPluginUnload, SetSilent, ShowWindow, SubSection (replaced by SectionGroup), SubSectionEnd (replaced by SectionGroupEnd), Var, VIAddVersionKey, VIProductVersion and XPStyle
  • Removed commands: DirShow, DisabledBitmap, EnabledBitmap and SectionDivider
  • All this and a smaller overhead! =)
  • A lot more... See below for more information

F.47.2.2 更改自 RC4

  • Command line parser ignored any switches after tokens that are not switches
  • Last part of the path specified in InstallDir was appended even if selected folder name was the same
  • Modern UI 1.70: Improved documentation, new Init custom function for Welcome and Finish page
  • Added StrFunc by deguix
  • Updated and fixed language files
  • Updated, fixed and improved documentation


2.0 Release Candidate 4

F.48 2.0 候选版 4

2004年2月2日发行

F.48.1 更新日志

F.48.1.1 主要更改

  • Fixed MBCS mishandling in exehead, InstallOptions and nsExec

F.48.1.2 次要更改

  • Language files updates and fixes
  • Fixed logging (NSIS_CONFIG_LOG)
  • Fixed compile errors caused by removing some config.h options
  • NSIS compiles without PSDK again
  • Documentation fixes

F.48.1.3 工具和插件

  • NSISdl: All potential and rare crashes should be completely fixed now
  • InstallOptions: Fixed a rare crash related to ListItems and a small memory leak when using ValidateText


2.0 Release Candidate 3

F.49 2.0 候选版 3

2004年1月26日发行

F.49.1 更新日志

F.49.1.1 次要更改

  • Fixed some bugs with LZMA/bzip2 and non-solid compression
  • Fixed a bug that caused escaping not to be ignored on extended !define lines
  • Language files updates and fixes
  • Fixed installer crash when certain language strings were not referenced in all languages
  • Some new and improved graphics
  • Made CreateShortcut case insensitive when parsing hot key
  • Some documentation improvements and fix-ups
  • Modern UI 1.69: Made all uninstaller pages work without installer pages and fixed top text on uninstaller license page

F.49.1.2 工具和插件

  • MakeNSISW: Fixed resize bug, fixed some UI issues in the settings dialog
  • NSIS Update: Improved UI
  • InstallOptions: Fixed minor problems with the new NOTIFY flag


2.0 Release Candidate 2

F.50 2.0 候选版 2

2004年1月5日发行

F.50.1 更新日志

F.50.1.1 次要更改

  • Set focus to the main control in each page to ease keyboard control (plug-ins too)
  • LangStrings and user variables limit is now 16383 and is enforced
  • Fixed control colors set using SetCtlColors not changing when the system colors were changed
  • Log window now responds to the context menu key
  • Fixed a bug which caused beeping when the space key is hit on the components tree
  • Added code to prevent weird usage of WM_COMMAND which can cause weird behavior
  • Fixed compile errors when NSIS_CONFIG_COMPONENTPAGE, NSIS_CONFIG_PLUGIN_SUPPORT or NSIS_SUPPORT_HWNDS are not defined
  • More language files updated to the latest version
  • Fixed CHM's script errors
  • Documentation improvements

F.50.1.2 工具和插件

  • InstallOptions 2.4: NOTIFY for link, drop list and list box; UI fixes and improvements. See IO's change log for a complete list
  • MakeNSISW: Improved user interface, added support for named symbol sets and fixed best compressor selector


2.0 Release Candidate 1

F.51 2.0 候选版 1

2003年12月27日发行

F.51.1 发行说明

  • Trying the LZMA compression method for your installer is recommended. It often gives a 20% better compression ratio.
  • Modern UI 1.68: The setting to change the title size on the Welcome page and Finish page has been changed

F.51.2 更新日志

F.51.2.1 主要更改

  • LZMA compression support. Added SetCompresssorDictSize.
  • Modern UI 1.68: New settings for extra space for title and text on Welcome page and Finish page, improved handling of verbose settings, language file string for uninstaller reboot information, more
  • Shell folders are now detected using shell API functions and not the registry. This is the recommended method by Microsoft. New constants have been added in the process ($FONTS, $SENDTO and more...). See section 4.2.3 for more details.
  • Added LogicLib to distribution (easier conditional execution etc.)
  • Added DirVerify and GetInstDirError to allow custom error checking when the installation directory is invalid or the drive does not have enough space
  • Support for reading environmental variables on compile time: $%envVarName%
  • Added /SD parameter for MessageBox. Allows to set default for silent installers.
  • New conditional compilation options: !ifmacrodef and !ifmacrondef.
  • New sections macros for mutually exclusive section selection
  • Improved RTL support by adding WS_EX_RTLREADING wherever possible

F.51.2.2 工具和插件

  • InstallOptions 2.3: Added new control type "Button", added new flag "NOTIFY", added new flag "NOWORDWRAP" for multi-line text boxes, reduced size down to 12K
  • MakeNSISW: More options to set the compression method
  • Zip2Exe 0.31: Fixed compression setting, LZMA compression support
  • VPatch 2.1: Better error handling and exit code for GenPat


2.0 beta 4

F.52 2.0 测试版 4

2003年11月19日发行

F.52.1 发行说明

  • The /LANG parameter is no longer available for any text setting instructions. You must use a LangString if you want to make a certain text multilingual. This means you can also set one text for all languages. To make the license data multilingual you should use LicenseLangString.
  • Modern UI 1.67: Because of the new syntax for pages, renaming of settings and variable names etc., you have to make some changes to your scripts, see the Modern UI Readme for details.
  • Custom Pages now have a leave function. As this parameter is placed before the caption you have to add another "" empty string for the title to work.
  • .onSelChange is no longer called when the components page is created.
  • The icons folder has been renamed to Graphics and was reorganized. If you were using any files from Contrib\Icons in your script, you should update it to point to the new image or icon path.
  • UpgradeDLL has been changed, it's highly recommend that you include the new version in your script using !include "UpgradeDLL.nsh" instead of the old one.

F.52.2 更新日志

F.52.2.1 主要更改

  • CHM documentation - searchable and comes with an index
  • User variables ($VARNAME) that can be declared with the Var command
  • Support for all pages in both installer and uninstaller. Components, directory and license pages can be used for the uninstaller
  • Improved large files handling (way lower requirements to compile a 2GB installer now)
  • Full support for RTL languages, including support for LTR and RTL languages in one installer
  • Modern UI 1.67: New system & syntax for pages, settings (support for multiple pages of the same type, page specific settings, more customization options etc.), Welcome/Finish pages for uninstaller, LicenseForceSelection support, new options for Finish page / language selection dialog, fixes, more
  • Extraction progress
  • No more unprocessed strings, variables can be used everywhere
  • Leave function for custom pages: Input on InstallOptions pages can be validated using script code
  • Interface improvements: Better ClearType support, no more flickering
  • OnMouseOver text is only displayed when mouse over section
  • NLF language files (v6): language specific fonts, RTL and more strings
  • Inner LangStrings can be used in the script
  • No more /LANG, only LangStrings - easier to set one string to all languages
  • LangStrings are no longer installer/uninstaller specific (no un.)

F.52.2.2 新增/更改命令

  • Added PageEx, PageCallbacks and DirVar - it's now a lot easier to add the same page type twice
  • Added FileBufSize
  • Added VIAddVersionKey: add version information resource to the installer
  • Added AllowSkipFiles: set whether the user should be able to skip a file when overwriting failed
  • Added LicenseForceSelection: checkbox or radio buttons on license page to let user agree with license or not
  • Added SectionSetSize, SectionGetSize, SetCurInstType and GetCurInstType
  • Replaced SetBkColor with SetCtlColors which can set text color too
  • Added IfSilent and SetSilent to allow better /S interaction
  • Added support for standard predefines: ${__DATE__}, ${__TIME__}, ${__TIMESTAMP__}, ${__FILE__}, ${__LINE__}
  • Added ifdiff and lastusd for SetOverwrite
  • /o Switch for Section provides ability to unselect the section by default
  • New parameter for DirText to set the browse dialog text
  • Added RMDir /REBOOTOK: remove folders on reboot
  • InstType /NOCUSTOM and /COMPONENTSONLYONCUSTOM work together
  • Added base_dir for GetTempFileName

F.52.2.3 次要更改

  • RO sections can now be in InstTypes too (defaults to old behavior)
  • Increased limit of InstTypes to 32
  • Improved macros & functions: UpgradeDLL, GetParent, GetParameters. Using the new versions is recommended.
  • Fixed SetOutPath not setting current directory if the directory didn't exist before
  • Components tree: fixed problems with sub-sections with RO sections as children, SF_EXPAND now refreshes the components tree and added SF_PSELECTED for partially selected sub-sections
  • Improved AddBrandingImage: doesn't depend on the UI, can set image on the bottom and on the right, support for custom padding value
  • Better installation directory verification
  • Fixed all known problems with temporary files and directories
  • Documentation fixes
  • Minor bug fixes
  • Code clean-ups and some more comments
  • More...

F.52.2.4 工具和插件

  • MakeNSISW 2.0: UI to define symbols, easy access to recent scripts, toolbar and more
  • Zip2Exe 0.3: based on header files, improved interface, Modern UI support, new script code, improved folder detection
  • InstallOptions 2.2: added LINK control, added EXTENDEDSELECT flag for list boxes which replaces MULTISELECT that now acts exactly as the real style flag ([double] click turns on or off selection), fixes
  • BgImage plug-in stability fixes
  • Added vPatch: patch generator and plug-in that applies the patches
  • Banner plug-in improvements: responds to messages and some new /set tricks by brainsucker
  • AdvSpalsh plug-in improvements: smaller, better transparency support and a possible bug fix
  • System plug-in improvements: Unicode, GUID and COM support
  • nsExec plug-in improvments: ability to run 16 bit code and tabs to spaces conversion
  • Math plug-in
  • Delphi unit for NSIS plug-ins


2.0 Beta 3

F.53 2.0 测试版 3

2003年3月16日发行

  • Modern UI 1.63: Header bitmap support, new defines to change the description area, single macro for language selection dialog, more!
  • New tutorial in the documentation
  • define_if_last in Page command also works when a define has not been specified for all Page commands.
    This fixes the problem with the Modern UI "Click Next" / "Click Install" texts.
  • Added SectionSetInstTypes and SectionGetInstTypes
  • Reboot command does not force a reboot anymore (allows the user to save work)
  • !if[n]def/!else fixes
  • LogSet on now really starts logging
  • Cancel button available on all pages after the instfiles page but the last page unless /ENABLECANCEL was used in its Page command
  • License page: No more limit on RTF size
  • LangDLL: Option to auto-count number of languages, shell font support
  • Page and UninstPage can not be used inside sections/functions
  • CreateDirectory now uses the error flag
  • EnumRegKey/Value output_var check fixed
  • Updated translations
  • Dreaded BSOD after plug-ins enumeration finally banished
  • Minimize button and BGGradient and BGImage compatibility fixes
  • WriteINIStr with empty value works again
  • Added FlushINI


2.0 Beta 2

F.54 2.0 测试版 2

2003年2月26日发行

  • NSIS Menu: links to all NSIS utilities, documentation and websites
  • NSIS Update: check for new releases, download latest development files
  • Dialer plugin to connect to the internet
  • Improved filename validation
  • VC7 compiler compatibility issues fixed
  • CreateDirectory sets error flag
  • InstallOptions: INI File State value fixed
  • Updated translations
  • Minor fixes


2.0 Beta 1

F.55 2.0 测试版 1

2003年2月9日发行

  • User interface improvements: better order/grouping of controls, button selection problems fixed, added minimize box, transparent BrandingText
  • LangString improvements: can be used before they have been defined, warning if not present in all language tables
  • New version of the Modern User Interface with UI improvements, bugfixes and some small new features
  • InstallOptions 2.0 with support for custom font and DPI settings, groupboxes, grouped controls, lots of bugfixes etc.
  • No more random compression ratios
  • SetOutPath now sets the working directory
  • File names are validated, directory given by the user will now always work
  • $QUICKLAUNCH now works with SetShellVarContext all
  • Automatically appended directory name in the directory selection dialog will no longer contain squares if not all characters are ASCII.
  • Fixed a bug with remote drives and available space (\\remote\drive)
  • Plug-in function's names are now case insensitive
  • Fixed a bug with specifying Icon twice
  • Include dirs (!addincludedir)
  • On leave function for pages
  • Installers can now really contain more than one branding image
  • All !if/!else/!endif problems should be solved now
  • SetFont "MS Shell Dlg" adds the DS_SHELLFONT style
  • Win9x rename on reboot now also works when the destination file does not exist
  • DeleteRegKey works on default value
  • nsExec can be called from an installer executed by CreateProcess
  • WriteUninstaller sets error code
  • Banner.dll compatible with Modern UI
  • Fixed focus problems in MakeNSISw
  • Updated and new translations
  • Some new bitmaps for the MUI by Virtlink
  • Faster and better MakeNSISw integration
  • New .NET Framework detection function
  • Minor bugfixes
  • Code clean-ups (compiles on VC7)


2.0 Beta 0

F.56 2.0 测试版 0

2002年12月6日发行

  • New paging system
  • Added Page and UninstPage
  • Removed .onNextPage, .onPrevPage, .onInitDialog
  • New easier version of the Modern User Interface with better multilanguage support, InstallOptions integration, welcome and finish page etc.
  • Custom pages no longer flicker when created
  • Added accelerator keys
  • Added LangString and LangStringUP for user defined multilingual strings
  • Added support for transparent check marks
  • Added InitPluginsDir
  • Renamed nsisconf.nsi to nsisconf.nsh
  • Added CreateShortcut comment/description parameter
  • Splash.exe is now a plugin (splash.dll)
  • Added new plugins: System, AdvSplash, nsExec, UserInfo, BgImage, Banner and StartMenu
  • !ifdef and friends can now be used in macros
  • SendMessage can send strings (put STR: before a param) and supports timeouts
  • Right mouse button "Copy to clipboard" context menu for the Details window
  • Plugin syntax now requires dll name, e.g. dll::func not just func
  • Licence text receives initial focus (page up & down work immediately, return key still works)
  • Made win9x move/delete on reboot support proper and function like on win2k
  • Now always loads RichEdit v2 if present (links work on Win9x)
  • DeleteRegKey now complains if given a third parameter (other than /ifempty)
  • RegDLL now works with DLLs dependent on DLLs from the same directory
  • ${LANG_langName} defined as the language id when loading a NLF
  • Fixed a few bugs that caused the installer to load slower than before
  • Uninstall can now get command line parameters too
  • Added ReserveFile
  • Added ExDLL.h
  • Included makensisw 1.9 (lots of changes)
  • Updated InstallOptions
  • Updated ZIP2EXE
  • Updated HTTP download plugin, NSIS-dl (timeout added, better proxy detection)
  • A lot of new language files
  • A lot of new icons and check marks
  • Changed section flags values
  • SectionSetFlags can now set bold too
  • SectionSetFlags now works in silent installers too
  • SectionSetName for sub sections doesn't need '-' in front of the name
  • Added SetPluginUnload
  • Hidden section can now use SectionIn too
  • File /nonfatal switch added
  • Plugins no longer add size to their containing section
  • Defines can now be used inside define names (${bla${blo}})
  • New docs format (WOOHA!)
  • EXE header size a lot smaller, 33.5KB for bzip2 and 34KB for zlib
  • Lots of other bugs fixed...


2.0 Alpha 7

F.57 2.0 内测版 7

2002年8月29日发行

  • Can now select the language from .onInit ($LANGUAGE is a variable)
  • Added CreateFont
  • Added .onMouseOverSection
  • Added .onInitDialog and un.onInitDialog
  • Added SetStaticBkColor
  • Disabled UseOuterUIItem
  • SendMessage WM_SETTEXT treats lParam as a string and not a number
  • CopyFiles script message no longer always prints (silent)
  • Custom install type text can now be changed
  • ChangeUI can now change IDD_VERIFY
  • Default license color now fits the user system
  • Summary reports the right number of required sections
  • Checkbox is only required in IDD_DIR if logging is enabled
  • Not using /LANG now really causes the script compiler to use the last used language
  • Fixed a bug with MBCS and the uninstaller text
  • MBCS to Unicode and Unicode to MBCS conversion bugs fixed
  • Fixed a bug that caused RTF not to show on Windows 9x
  • Added a dialog that shows up if compress whole is used and initial decompressing lasts longer than a second
  • Updated to InstallOptions 1.3
  • MakeNSISw 1.7 included
  • Added modern UI by Joost Verburg (Examples\Modern UI)
  • Added new full color icons by adni18
  • Added Dutch, Korean, Russian, Swedish and Traditional Chinese language files
  • Updated Spanish language file version (thanks to LsMoNKi)
  • Added /TRIM(LEFT|RIGHT|CENTER) for BrandingText
  • EXE header size down to 36.5KB
  • Added yi-pixel.ico and yi-pixel-uninstall.ico by Jan T. Sott
  • Fixed a bug with macros at the end of the file
  • Sub-sections can now have defined names too
  • Added LangDLL.dll plugin
  • CallInstDLL /NOUNLOAD added (works on plugin calls too)


2.0 Alpha 6

F.58 2.0 内测版 6

2002年8月10日发行

  • Fixed two bugs with the plug-in mechanism
  • Fixed infinite loop bug


2.0 Alpha 5

F.59 2.0 内测版 5

2002年8月9日发行

  • Added UseOuterUIItem
  • Enhanced ChangeUI
  • Enhanced SetDlgItemText
  • Added one-section.nsi example file
  • Optimized Ximon's code for plug-in DLLs (back to 37KB)
  • If default user language doesn't fit exactly, will try to find primary language match
  • Fixed some strings that got replaced (space available and required etc.)
  • Compiles without MS Platform SDK
  • Included Spanish.nlf
  • Included MagicLime.exe by snowchyld


2.0 Alpha 4

F.60 2.0 内测版 4

2002年8月5日发行

  • Added automatic detection, packing, unpacking and deletion of plugin dlls
  • Added simplified calling syntax for plugin dlls
  • Added PluginDir


2.0 Alpha 3

F.61 2.0 内测版 3

2002年8月4日发行

  • Added LoadLanguageFile
  • Added $LANGUAGE
  • Added /LANG option to string setters (Name, Caption, etc.)
  • 'LogSet on' now builds a log file if not already created


2.0 Alpha 2

F.62 2.0 内测版 2

2002年7月31日发行

  • Added ${NSISDIR}
  • Added XPStyle
  • Added SetFont
  • Added ChangeUI
  • Added AddBrandingImage, and SetBrandingImage
  • Added SetCompressor (no more makensis-bz2.exe)
  • Added LicenseBkColor
  • 'SpaceTexts none' now causes no space texts to appear
  • Icon and UninstallIcon now support icons of any type
  • CheckBitmap now support bitmaps with any color table/depth
  • Unused resources are removed before writing out the installer
  • Documented !error and !warning
  • Added !echo and !verbose
  • Added force option for CRCCheck
  • Updated to Makensisw 1.6
  • Updated to InstallOptions 1.2
  • Installer can now be compressed using UPX
  • A hint is shown if a line is longer than the detail window
  • Modern style folder select dialog
  • License data can now be RTF
  • WindowIcon is now handled in the compiler
  • Removed debug version (it never worked anyway)
  • Faster compile time (WIN32_LEAN_AND_MEAN)


2.0 Alpha 1

F.63 2.0 内测版 1

2002年7月9日发行

  • Added expand node option to Section and SubSection
  • Added preserve file attribute option to File command
  • Copy-All bug fix in Makensisw
  • Added NSISDIR to the define list
  • Reorganized NSIS directory structure


2.0 Alpha 0

F.64 2.0 内测版 0

2002年5月22日发行

  • TreeView component list (care of Jeff Doozan)
  • No more SectionDivider, but SubSection and SubSectionEnd.
  • No more EnabledBitmap/DisabledBitmap, just CheckBitmap. (with tons of button states)
  • Bugfixes of brokenness.
  • Added ! for Section/SubSection to make bold.
  • Made config.h have hacks for easier building for me. :)


历史版本

F.65 历史版本

NSIS 1.x 历史版本