NSIS 用户手册

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

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

版权所有 (C) 1999-2009 贡献者

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


介绍 NSIS

这是首页，请浏览 目录 或 下一页

第一章: 介绍 NSIS

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

这是首页，请浏览 目录 或 下一页


关于 NSIS

1.1 关于 NSIS

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

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

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


主要特性

1.2 主要特性

很小的额外开销

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

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

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

独特的压缩方法

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

基于脚本

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

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

脚本语言提供的命令使你可以在目标系统上使用。本身已经包含超过 40 种翻译，但是你也可以创建你自己的语言文件。RTL(从右至左)语言比如阿拉伯语和希伯来语也得到完整的支持。

许多功能和对目标系统的检测

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

自定义对话框和界面

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

插件系统

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

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

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

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

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

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

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


特性列表

1.3 特性列表

  • 生成包含可执行安装程序的外壳
  • 支持 ZLIB, BZIP2 和 LZMA 数据压缩( (文件可以单独或同时压缩)
  • 支持卸载程序 (安装程序可以生成卸载程序)
  • 可自定义的用户界面 (对话框、字体、背景、文本、检测标记、图像等等)
  • 典型和新式向导界面
  • 完整的多语言，支持一个安装程序有多个语言。自带超过 40 种语言翻译，你也可以建立你自己的
  • 页面系统:你可以添加标准向导页面或自定义页面
  • 用户可以选择安装组件，树形组件列表
  • 多个安装配置 (通常最小、典型、完全)和自定义配置
  • 安装程序使用 CRC32 校验和作为自我验证
  • 除了压缩的安装数据大小外只需要很小的系统开销 (默认为34 KB)
  • 可以显示文本或 RTF 格式的许可协议
  • 可以通过注册表检测目标目录
  • 易用的插件系统 (经包含大多数插件用于创建自定义对话、互联网连接、HTTP 下载、文件打补丁、调用 Win32 API 等等)
  • 安装程序最高限制可以达到 2 GB
  • 可选性的静默安装模式用于自动安装
  • 预处理器支持定义符号、宏、条件编辑、标准预定义
  • 有意思的类似于 PHP 和汇编的编程体验(包含用户变量、堆栈、流程控制等等)
  • 安装程序有它们自己的 VM，使你书写的代码可以支持:

    • 文件解压(可配置的覆盖参数)
    • 文件、目录复制、重命名、删除、搜索
    • 插件 DLL 调用
    • DLL/ActiveX control 控件注册、反注册
    • 可执行外部程序 (外部执行并带有等待选项)
    • 创建快捷方式
    • 注册表读取、设置、查询、删除
    • INI 文件读取、写入
    • 常规文本文件读取、写入
    • 强大的字符串和整数处理
    • 基于类名或标题查找窗口
    • 用户界面操作(字体、文本设置)
    • 发送 Window 消息
    • 通过消息框或自定义页面与用户交流
    • 分支、比较等等
    • 错误检查
    • 支持重启，包括重启后删除或重命名文件
    • 安装程序行为命令(比如显示、隐藏、等待等等)
    • 在脚本可以使用用户函数
    • 回调函数对用户的操作

  • 对任何用户完全免费。请看 许可协议。
  • 更多


教程: 基础知识

第二章: 教程: 基础知识

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


介绍

2.1 介绍

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

NSIS 是开发者用来创建这样安装程序的工具。 NSIS 允许你创建任何事情，从最基本的只需复制文件的安装程序，到含有诸如写注册表主键、设置环境变量、从互联网下载最新版本的程序、定制配置文件等大量复杂任务的安装程序。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 "Installer Section"
SectionEnd

Section "un.Uninstaller Section"
SectionEnd

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

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

例子:

Section "My Program"
  SetOutPath $INSTDIR
  File "My Program.exe"
  File "Readme.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 提供了很多简单的宏便于构造复杂的逻辑结构(条件或联合逻辑判断)。这些语法在 LogicLib.nsh 做了解释，并且这些语法很像其它的初学者和高级用户熟悉的语言。

例如, 对变量值的判断(不使用 LogicLib)应该像这样:

StrCmp $0 'some value' 0 +3
  MessageBox MB_OK '$$0 is some value'
  Goto done
StrCmp $0 'some other value' 0 +3
  MessageBox MB_OK '$$0 is some other value'
  Goto done
# else
  MessageBox MB_OK '$$0 is "$0"'
done:

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

${If} $0 == 'some value'
  MessageBox MB_OK '$$0 is some value'
${ElseIf} $0 == 'some other value'
  MessageBox MB_OK '$$0 is some other value'
${Else}
  MessageBox MB_OK '$$0 is "$0"'
${EndIf}

也可以用 switch 来实现相同的效果，像下面的那样:

${Switch} $0
  ${Case} 'some value'
    MessageBox MB_OK '$$0 is some value'
    ${Break}
  ${Case} 'some other value'
    MessageBox MB_OK '$$0 is some other value'
    ${Break}
  ${Default}
    MessageBox MB_OK '$$0 is "$0"'
    ${Break}
${EndSwitch}

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

${If} $0 == ''
${AndIf} $1 == ''
  MessageBox MB_OK|MB_ICONSTOP 'both are empty!'
${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

    ...code...

  Pop $R1
  Pop $R0

FunctionEnd

2.3.5.3 调试脚本

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

2.3.6 脚本的执行

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

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

2.3.7 编译器命令

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

!define VERSION "1.0.3"
Name "My Program ${VERSION}"
OutFile "My Program Installer - ${VERSION}.exe"

欲了解更多关于定义信息，请查看 条件编译。

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

!macro MyFunc UN
Function ${UN}MyFunc
  Call ${UN}DoRegStuff
  ReadRegStr $0 HKLM Software\MyProgram key
  DetailPrint $0
FunctionEnd
!macroend

!insertmacro MyFunc ""
!insertmacro MyFunc "un."

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

欲了解更多信息，请查看 编译时命令。


编译器

2.4 编译器

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

要编译你需要在你的 .nsi 文件上点击右键并选择“编译 NSIS 脚本”或“编译 NSIS 脚本 (选择压缩程序)”。这将会运行并调用 MakeNSISW (NSIS 编译器的界面)来编译你的脚本。MakeNSISW 将会给出 MakeNSIS 的输出并在一个可见的窗口里显示出来，你可以复制、测试安装程序、浏览和更多。你也可以从 Windows 命令行里使用 makensis.exe 。

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

NSIS支持不同的压缩方法，在这里有解释。ZLIB 是默认的压缩方法，它非常快并且在资源消耗方面很小。对于在互联网上发行一个小巧的安装程序，LZMA 是一个很好的方法。 BZIP2 通常比 ZLIB 的压缩率好，但不如 LZMA 。如果你需要较低的内存使用情况或快速编译脚本，它是有用的。

你也可以在 Linux, BSD 或 Mac OS X servers 上面编译 Windows 安装程序。欲了解更多信息，请查看 构建 NSIS 。


新式用户界面(Modern UI)

2.5 新式用户界面(Modern UI)

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

欲了解更多信息，请查看 Modern UI 2 自述文件 和 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 目录下的 插件文件夹 里查找插件并且会列出所有可用的函数。你也可以使用 !addplugindir 来告诉 NSIS 在另外的目录里查找插件。

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

你也可以创建你自己的插件。C/C++ 和 Delphi 头文件都是可用的，基础的插件编写例子你可以查看 插件例子。包括插件的源代码你也可以在源代码软件包中找到。


更多

2.7 更多

本教程描述了基本的 NSIS 功能，要得到关于 NSIS 更多的东西，你还要花点时间读完本手册。


命令行的用法

第三章: 命令行的用法

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


MakeNSIS 的使用

3.1 MakeNSIS 的使用

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

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

makensis [选项 | script.nsi | - [...]]

3.1.1 选项

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

3.1.2 注意事项

  • 参数是按照次序来处理的。 makensis /Ddef script.nsi 和 makensis script.nsi /Ddef 是不同的。
  • 如果指定了多个脚本，他们将会被连接起来当为一个脚本来处理。
  • 在 Windows 95, 98 和 NT 上，不支持设定优先级为低于正常标准和高于正常标准。在这些系统上，低于正常标准将设定为空闲和高于正常标准将设定为高。

3.1.3 环境变量

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

  • NSISDIR, NSISCONFDIR - 放置 NSIS 数据和配置文件的目录。 NSISDIR 用来设置脚本定义的 ${NSISDIR}。更多信息请参看 section 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 force 。
  • /S 静默运行安装程序或卸载程序。更多信息请参看 section 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 语言
  • 插件 DLLs
    • 使用插件命令
    • 手动调用插件
  • 静默安装程序、卸载程序


脚本文件格式

4.1 脚本文件格式

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

命令

命令行的格式为: '命令 [参数]'

File "myfile"

注释

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

; 注释
# 注释

# 注释 \
    另一个注释行 (查看本节下面的 `长命令`)

/*
注释
注释
*/

Name /* 注释 */ mysetup

File "我的文件" ; 注释

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

插件

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

nsExec::Exec "我的文件"

数字

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

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

IntCmp 1 0x1 lbl_equal

SetCtlColors $HWND CCCCCC

字符串

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

MessageBox MB_OK "Hi 您好!"

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

You can escape quotes using $\:

MessageBox MB_OK "I'll be happy" ; 把一个 ' 放在字符串里
MessageBox MB_OK 'And he said to me "Hi there!"' ; 把一个 " 放在字符串里
MessageBox MB_OK `And he said to me "I'll be happy!"` ; 这里把 ' 和 " 都放到了字符串里
MessageBox MB_OK "$\"A quote from a wise man$\" said the wise man" ; 这里演示了跳过引号的解析

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

变量

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

Var MYVAR

StrCpy $MYVAR "变量值"

更多的信息...

长命令

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

CreateShortCut "$SMPROGRAMS\NSIS\ZIP2EXE project workspace.lnk" \
    "$INSTDIR\source\zip2exe\zip2exe.dsw"

MessageBox MB_YESNO|MB_ICONQUESTION \
    "是否要删除文件夹中的所有文件? \
    (如果你想保留任何你自己创建的文件 \
     请点击[否])" \
    IDNO NoRemoveLabel

长命令多行扩充同样适用于注释，它可能会让人混淆，因此应该尽量避免。

# 一个注释\
    在这里仍然是注释...

配置文件

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


变量

4.2 变量

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

4.2.1 用户变量

$VARNAME

用户变量可以用 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" 参数1 参数2 参数3
  • 安装程序.exe 参数1 参数2 参数3
  • 对于解析“参数”部分，参阅 GetParameters。如果在命令行里指定了 /D= (用来跳过安装路径的选择)，那么 /D= 后面的参数将不会被保存在 $CMDLINE (前面的可以保存)。

$LANGUAGE

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

4.2.3 常量

常量通常用在 InstallDir 属性里。

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

$PROGRAMFILES, $PROGRAMFILES32, $PROGRAMFILES64

程序文件目录 (通常为 C:\Program Files 但在运行时会检测)。在 Windows x64 操作系统中, $PROGRAMFILES 和 $PROGRAMFILES32 指向 C:\Program Files (x86) 同时 $PROGRAMFILES64 指向 C:\Program Files。当安装 64 位应用程序时，使用 $PROGRAMFILES64。

$COMMONFILES, $COMMONFILES32, $COMMONFILES64

公用文件目录。这是应用程序共享组件的目录 (通常为 C:\Program Files\Common Files 但在运行时会检测)。在 Windows x64 操作系统中, $COMMONFILES 和 $COMMONFILES32 指向 C:\Program Files (x86)\Common Files 同时 $COMMONFILES64 指向 C:\Program Files\Common Files。当安装 64 位应用程序时，使用 $COMMONFILES64。

$DESKTOP

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

$EXEDIR

可执行安装程序运行时所在目录 (从技术上来说你可以修改改变量，但并不是一个好方法)。

$EXEFILE

可执行安装程序的基本名字。

$EXEPATH

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

${NSISDIR}

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

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

$WINDIR

Windows 目录 (通常为 C:\Windows 或者 C:\WinNT 但在运行时会检测)。

$SYSDIR

Windows 系统目录 (通常为 C:\Windows\System or C:\WinNT\System32 但在运行时会检测)。

$TEMP

系统临时目录 (通常为 C:\Windows\Temp 但在运行时会检测)。

$STARTMENU

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

$SMPROGRAMS

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

$SMSTARTUP

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

$QUICKLAUNCH

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

$DOCUMENTS

文档目录。一个当前用户典型的路径形如 C:\Documents and Settings\Foo\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\Foo。

该常量仅在 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

用来表示一个 Tab (\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 "第一个宏行first macro line"
  MessageBox MB_OK "第二个宏行second macro line"
!macroend

Goto +2
!insertmacro relative_jump_test


页面

4.5 页面

每个(非静默安装) NSIS 安装程序都有一个页面设置。每个页面可以是一个 NSIS 内建页面或者一个由用户函数(查看 nsDialogs 或 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 并且有一个以上非隐藏的区段), directory (如果指定了 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]
  或
internal_page_type [预置函数] [显示函数] [离开函数] [/ENABLECANCEL]

要添加一个安装程序页面，见上述章节，了解更多关于相对于自定义页面的内置页面和回调函数信息。

内置的页面类型:

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

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

4.5.5 UninstPage

custom [创建函数] [离开函数] [标题] [/ENABLECANCEL]
  或
internal_page_type [预置函数] [显示函数] [离开函数] [/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 磁盘空间。仅在一个区段里有效(在区段外或函数里无效)。

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

若需访问区段索引，必需使用花括号括起来且区段索引代码必需在区段之后。

Section test1 sec1_id
SectionEnd

Section test2 sec2_id
SectionEnd

Function .onInit
  SectionGetText ${sec2_id} $0
  MessageBox MB_OK "索引 ${sec2_id} 的名称:$\n$0" # 将正确显示 '索引 1 的名称: test2'
FunctionEnd

Function .onInit
  SectionGetText ${sec2_id} $0
  MessageBox MB_OK "索引 ${sec2_id} 的名称:$\n$0" # 将错误显示 '索引 ${sec2_id} 的名称: test1'
    # 加上一个警告说明:
    #   未知 变量/常量 "{sec2_id}" 查看, 忽略
FunctionEnd

Section test1 sec1_id
SectionEnd

Section test2 sec2_id
SectionEnd

4.6.1.3 SectionEnd

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

4.6.1.4 SectionIn

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

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

InstType "完全"
InstType "最小化"

Section "区段 1"
SectionIn 1 2
SectionEnd

Section "区段 2"
SectionIn 1
SectionEnd

4.6.1.5 SectionGroup

[/e] section_group_name [index_output]

该命令插入一个区段组。区段组必须以 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, 插件, 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, 插件, File 和 WriteRegBin 不能用于该回调函数。

例子:

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

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

组件选项被改变包括组件和安装类型被改变。

4.7.2.2.8 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) (width|height) [padding]

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

AddBrandingImage 仅增加图像到标识的位置，若要使图像以标志图像显示请使用 SetBrandingImage 命令。

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

[font_face [height [weight] [/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 (按钮), and 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

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

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

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

show details text

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

接受变量。如果使用了变量，使用的变量必须在安装页面 (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 会被临时更改为该值)。例如: "文件 $\r$\n$0 不能写入$\r$\n祝你下次好运。"。

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

4.8.1.18 Icon

[路径\]图标文件.ico

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

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 指定值。查询注册表时，该命令将自动截去引号。如果该字符串以 ".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 共用。

4.8.1.24 InstType

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

把一个安装类型添加到安装类型列表里，或禁止自定义安装类型。最多可以增加到 32 类，每一个类型都需要指定安装类型名称。如果以 'un.' 作前缀那么它就是一个卸载程序安装类型。在组件页面显示之前，你可以使用在运行时需要处理的用户变量而不是难以改变的代码来作为安装类型名称，这样你可以动态的改变安装类型的名称。另一个在运行时更改 InstType 名称的方法是 InstTypeSetText 命令。 所不同的是使用 InstTypeSetText 你可以保留你自己宝贵的用户变量。第一个类型为默认类型 (通常为 '典型安装')。如果指定了 /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, yeah!)。要定义多语言许可协议请使用 LicenseLangString 。

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

你可以使用 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 MiscButtonText

[上一步文本 [下一步文本] [取消按钮文本] [关闭按钮文本]]

替换这四个 (> 上一步、下一步 <、取消、关闭)。如果留空参数，将使用默认值代替。

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

4.8.1.30 Name

名称 [双与名称]

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

 Name "Foo & Bar" "Foo && Bar"

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

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

4.8.1.31 OutFile

[路径\]安装程序.exe

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

4.8.1.32 RequestExecutionLevel

none|user|highest|admin

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

建议使用 RequestExecutionLevel，至少微软要求所有应用程序都应标明执行级别。未标明级别的安装程序将运行于兼容模式，(兼容模式下执行环境所在的)当前用户 "开始菜单" 文件夹中该程序的快捷方式会被自动转移到所有用户 "开始菜单" 文件夹中。如果你的安装程序不需要向系统目录安装文件或向注册表 HKLM 主键下写入键值，那么应该指定为 user 执行级别。

更多相关信息可以在 MSDN 上找到，关键字包括 "UAC", "requested execution level", "vista manifest" 和 "vista security" 。

4.8.1.33 SetFont

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

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

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

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

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

4.8.1.34 ShowInstDetails

\\hide|show|nevershow

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

4.8.1.35 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 。

欲了解更多信息查看 section 4.12 。

4.8.1.37 SilentUnInstall

normal|silent

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

欲了解更多信息查看 section 4.12 。

4.8.1.38 SpaceTexts

[req text [avail text]]

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

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

4.8.1.39 SubCaption

[page_number subcaption]

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

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

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

4.8.1.40 UninstallButtonText

文本

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

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

4.8.1.41 UninstallCaption

标题

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

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

4.8.1.42 UninstallIcon

[路径\]图标.ico

设置卸载程序的图标。

4.8.1.43 UninstallSubCaption

页面代号 子标题

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

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

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

4.8.1.44 UninstallText

文本 [子文本]

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

文本: 控件上方的文本

子文本: 卸载定位旁边的文本

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

4.8.1.45 WindowIcon

on|off

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

4.8.1.46 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 覆盖标记总为 off !

而下面的例子才是正确覆盖。

${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 (默认) 使用压缩算法，是一个快速简单的方法。默认的压缩级别它消耗大约 300 KB 内存。

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

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

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

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

4.8.2.5 SetCompressorDictSize

字典大小(单位:MB)

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

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.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" "� 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.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" 某些参数'

4.9.1.3 ExecShell

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

使用 ShellExecute [译者注: 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 会把变量设为返回代码(并且仅当产生错误时放置一个错误标记；如果产生错误则该用户变量的内容为未指定)。注意:如果该命令包含空格，你要用引号来把他们包括起来。例如: ExecWait '"$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 开关将改变输出名称。X 可以包含变量，它可以是一个完整的路径或一个相对路径(在这种情况下，由 SetOutPath 被附加到 $OUTDIR)。当使用了 /oname= 开关时只能指定一个文件。如果输出名称包含了空格，你需要用双引号把参数括起来，包括 /oname，就像下面例子显示的那样。
  • 支持通配符。
  • 如果使用了 /r 开关，匹配的文件和目录会在子目录里被递归的搜索。如果不确切说明是一个路径 (例如 File /r something)，那么当前目录将被递归搜索。如果确切说明是一个路径 (例如 File /r something\*.*)，路径最后部分将被作为符合条件匹配的目录而剩余部分由目录递归搜索。如果目录名匹配则所有包含的内容都会被递归添加,目录结构也会被保持。
  • 使用 /x 开关可以用来排除文件或目录。
  • 如果使用了 /a 开关，则被添加的文件的属性将会保持。
  • 如果覆盖模式被设定为 'try' 并且文件不能覆盖，那么 File 命令将会置一个错误标记，或者如果覆盖模式被设定为 'on' 并且文件不能覆盖并用户选择了忽略时，也会放置一个错误标记。
  • 如果使用了 /nonfatal 开关且当文件未找到时使用警告来代替错误。
File something.exe
File /a something.exe
File *.exe
File /r *.dat
File /r data
File /oname=temp.dat somefile.ext
File /oname=$TEMP\temp.dat somefile.ext
File "/oname=$TEMP\name with spaces.dat" somefile.ext
File /nonfatal "一个可能不存在的文件"
File /r /x CVS myproject\*.*
File /r /x *.res /x *.obj /x *.pch source\*.*

注意: 在使用了 /r 开关后，所有匹配的目录和文件都会被搜索。不管是否使用通配符它都会执行，即使所给的路径与一个目录完全符合。也就是说，以下的目录结构:

 something
  file.dat
  another.dat
 dir
  something
   dir2
    file2.dat
 another
   something
    readme.txt

在使用这个 File 用法时:

File /r something

会在根目录下匹配名为 something 的目录，以及 dir 目录中的 something 文件和 another 目录中的 something 目录。只在根目录中匹配名为 something 的目录时，应该这样:

File /r something\*.*

当添加了 \*.* 时，会将它作为匹配条件，并且 something 会被当成文件夹进行搜索。当仅指定 something 时，当前目录会被递归搜索所有的 something 目录，这样 another\something 目录就会匹配。

4.9.1.6 Rename

[/REBOOTOK] 源文件 目标文件

移动时(比如，目标文件已存在)，则该文件在系统重启后才被移动到目标。如果文件在重启后才被移动，则会放置一个重启的标记。当文件不能被重命名时(并且没有使用 /REBOOTOK)或者原文件不存在时，会放置一个错误标记。

如果没有指定绝对路径则使用当前路径代替。当前路径可以由上一个 SetOutPath 指令来设置。[译者注:即使用 SetOutPath 设置当前路径，默认使用上一个 SetOutPath 指令设置当前路径。在创建快捷方式时需要注意这个问题，涉及到快捷方式的起始位置。]如果你没有使用 SetOutPath 那么当前路径为 $EXEDIR 。

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

4.9.1.7 ReserveFile

[/nonfatal] [/r] [/x file|通配符 [...]] 文件 [文件...]

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

欲了解更多关于参数的信息，请查看 File 。

4.9.1.8 RMDir

[/r] [/REBOOTOK] 目录名

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

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

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

SetOutPath $TEMP\dir
RMDir $TEMP\dir

而下面的例子将成功地删除该目录。

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

警告: 在卸载程序中使用 RMDir /r $INSTDIR 是不安全的。虽然用户不太可能会选择将程序安装到 Program Files 文件夹中，但假如这样的话，这个命令将会递归删除整个 Program Files 文件夹，包括其他和卸载程序没有任何关系的程序(目录)。用户还可以安装除了程序文件之外的其他文件并希望它们能被卸载程序删除。可用的 解决方案 可以轻松地实现只卸载由安装程序释放的唯一文件。

4.9.1.9 SetOutPath

输出路径

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

SetOutPath $INSTDIR
File program.exe

4.9.2 注册表、INI 文件指令

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

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

4.9.2.1 DeleteINISec

文件 区段名

从 "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\My Company\My Software"
DeleteRegKey /ifempty HKLM "Software\A key that might have subkeys"

4.9.2.4 DeleteRegValue

根键 子键 键名

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

DeleteRegValue HKLM "Software\My Company\My Software" "some value"

4.9.2.5 EnumRegKey

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

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

StrCpy $0 0
loop:
  EnumRegKey $1 HKLM Software $0
  StrCmp $1 "" done
  IntOp $0 $0 + 1
  MessageBox MB_YESNO|MB_ICONQUESTION "$1$\n$\n更多?" IDYES loop
done:

4.9.2.6 EnumRegValue

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

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

StrCpy $0 0
loop:
  ClearErrors
  EnumRegValue $1 HKLM Software\Microsoft\Windows\CurrentVersion $0
  IfErrors 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 并输出到用户变量 $x 。有效的根键值在后面的 WriteRegStr 列出。如果字串不存在时会放置一个错误标记并把 $x 设为空字符串。如果该值存在但是 DWORD，则会转换为字串类型并放置一个错误标记。

ReadRegDWORD $0 HKLM Software\NSIS VersionBuild

4.9.2.12 ReadRegStr

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

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

ReadRegStr $0 HKLM Software\NSIS ""
DetailPrint "NSIS is installed at: $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\My Company\My Software" "Binary Value" DEADBEEF01223211151

4.9.2.15 WriteRegDWORD

根键 子键 项 值

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

WriteRegDWORD HKLM "Software\My Company\My Software" "DWORD Value" 0xDEADBEEF

4.9.2.16 WriteRegStr

根键 子键 项 值

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

WriteRegStr HKLM "Software\My Company\My Software" "String Value" "dead beef"

4.9.2.17 WriteRegExpandStr

根键 子键 项 值

把字符串写入注册表。 root_key 必须为下面列表之一:

  • 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

如果 根键 是 SHCTX 或 SHELL_CONTEXT, 当 SetShellVarContext 设置为 all 时，它将被替换成HKLM ；当 SetShellVarContext 设置为 current 时，它将被替换成 HKCU 。

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

WriteRegExpandStr HKLM "Software\My Company\My Software" "Expand String Value" "%WINDIR%\notepad.exe"

4.9.3 常规用途指令

4.9.3.1 CallInstDLL

DLL文件 函数

从一个 NSIS 扩展动态链接库里调用一个 函数 。查看 实例插件 的例子可以知道如何来创建。扩展动态链接库可以访问堆栈和变量。注意: 要自动释放并调用 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\My Company"
CreateShortCut "$SMPROGRAMS\My Company\My Program.lnk" "$INSTDIR\My Program.exe" \
  "some command line parameters" "$INSTDIR\My Program.exe" 2 SW_SHOWNORMAL \
  ALT|CONTROL|SHIFT|F5 "a description"

4.9.3.5 GetDLLVersion

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

从 "文件名" DLL (或其他包含版本信息的可执行文件) 取得版本信息。成功时把版本信息高位 Dwords 和低位 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

localfilename 用户变量(高位 DWORD 输出) 用户变量(低位 DWORD 输出)

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

4.9.3.7 GetFileTime

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

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

4.9.3.8 GetFileTimeLocal

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

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

4.9.3.9 GetFullPathName

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

把指定的文件完整路径信息输出到用户变量。如果参数的部分路径未找到，则会放置一个错误位标记并清空输出变量。如果指定了 /SHORT ，路径将会被转换为短文件名格式。如果没有指定 /SHORT ，路径不会被转换为短文件名格式。要获得长文件名，使用 System 插件调用 GetLongPathName 函数。请注意，GetLongPathName 仅适用于 Windows 98, Windows 2000 及以上。

StrCpy $INSTDIR $PROGRAMFILES\NSIS
SetOutPath $INSTDIR
GetFullPathName $0 ..
DetailPrint $0 # will print C:\Program Files
GetFullPathName /SHORT $0 $INSTDIR
DetailPrint $0 # will print C:\Progra~1\NSIS

StrCpy $0 C:\Progra~1\NSIS
System::Call 'kernel32::GetLongPathName(t r0, t .r1, i ${NSIS_MAX_STRLEN}) i .r2'
StrCmp $2 error +2
StrCpy $0 $1
DetailPrint $0 # will print C:\Program Files\NSIS, where supported

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: This will only appear 1 time."
label:
  DetailPrint "#2: This will appear before and after message #1."
  Call :.global_label
FunctionEnd

Section
  Call func
  Return

.global_label:
  DetailPrint "#3: The global label was called"
SectionEnd

4.9.4.3 ClearErrors

清除错误位标记。

ClearErrors
IfErrors 0 +2
  MessageBox MB_OK "此消息框将永远不会显示"

4.9.4.4 GetCurrentAddress

用户变量(输出)

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

Function func
  DetailPrint "function"
  IntOp $0 $0 + 2
  Call $0
  DetailPrint "function end"
FunctionEnd

Section
  DetailPrint "section"
  DetailPrint "section"
  GetCurrentAddress $0
  Goto callFunc

  DetailPrint "back to section"
  Return

callFunc:
  Call func
  DetailPrint "section end"
SectionEnd

4.9.4.5 GetFunctionAddress

用户变量(输出) 函数名

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

Function func
  DetailPrint "function"
FunctionEnd

Section
  GetFunctionAddress $0 func
  Call $0
SectionEnd

4.9.4.6 GetLabelAddress

用户变量(输出) 标记

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

label:
DetailPrint "label"
GetLabelAddress $0 label
IntOp $0 $0 + 4
Goto $0
DetailPrint "done"

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 on 命令行启动来设置。

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

4.9.4.13 IntCmp

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

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

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与值2相等时跳转的标记 [值1小与值2时跳转的标记] [值1大与值2时跳转的标记]

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

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_USERICON - 显示安装程序图标
  • MB_TOPMOST - 使消息框在最前端显示
  • MB_SETFOREGROUND - 设置前景
  • MB_RIGHT - 右对齐文本
  • MB_RTLREADING - RTL 阅读次序
  • MB_DEFBUTTON1 - 默认为按钮 1
  • MB_DEFBUTTON2 - 默认为按钮 2
  • MB_DEFBUTTON3 - 默认为按钮 3
  • MB_DEFBUTTON4 - 默认为按钮 4

Return_check 可以为 0 (或空，或保留关闭)，或下列之一:

  • IDABORT - 中止按钮
  • IDCANCEL - 取消按钮
  • IDIGNORE - 忽略按钮
  • IDNO - 否按钮
  • IDOK - OK 按钮
  • IDRETRY - 重试按钮
  • IDYES - 是按钮

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

Use the 用 /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 "return now" 0 +2
    Return
  # do stuff
FunctionEnd

Section
  Call func
  ;"Return" will return here
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 "a string" 0 +3
  DetailPrint '$$0 == "a string"'
  Goto +2
  DetailPrint '$$0 != "a string"'

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 打开的文件的字符串。该字符串一直读取到新的一行为止(或回车新行) ，或直到读取到空的字节为止，或者直到读取的字符串满足了 "最大长度" (如果指定了的话)。字符串默认的最大长度被限定在 1024 字节之内。(可以下载或重新编译一个使用较大 NSIS_MAX_STRLEN 值的特别构建版本)。如果读取到了文件的结尾却没有得到有效的数据则输出字串被清空，并放置一个错误标记。

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

4.9.5.4 FileReadByte

句柄 用户变量(输出)

读取一个由 FileOpen 打开的文件的字节。读取的字节作为一个整数(0-255) 保存在输出变量里。如果读取到了文件的结尾却没有得到有效的数据则输出字符串被清空，并放置一个错误标记。

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

4.9.5.5 FileSeek

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

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

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

4.9.5.6 FileWrite

句柄 字符串

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

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

4.9.5.7 FileWriteByte

句柄 字符串

写入 解析为整数值的 '字符串' 到 FileOpen 打开的文件。当然你也可以直接输入整数值。下面的代码写入一个 "回车 / 换行" - 输入到文件。

FileWriteByte 文件句柄 "13" ;[译者注:回车，相当于 $\r]
FileWriteByte 文件句柄 "10" ;[译者注:换行，相当于 $\n]

果写入时产生了错误，则置一个错误标记。需要注意的是低字节的整数已经被使用，例如: 写入 256 和写入 0 一样，等等。

4.9.5.8 FindClose

句柄

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

4.9.5.9 FindFirst

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

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

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

4.9.5.10 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

错误级别

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

IfRebootFlag 0 +2
  SetErrorLevel 4

4.9.7.6 SetRegView

\\32\\|64|lastused

设置作用于 注册表命令 的注册表查看。在 Windows x64 上共有2种查看方式。一种用于 32-bit 应用程序，另一种用于 x64 应用程序。默认情况下，32-bit 应用程序运行在 x64 系统的 WOW64 模式下时，只允许使用 32-bit 查看方式。使用 SetRegView 64 将允许安装程序在 x64 中访问注册表键值。

它将影响 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 # prints C:\Program Files (x86)
SetRegView 64
ReadRegStr $0 HKLM Software\Microsoft\Windows\CurrentVersion ProgramFilesDir
DetailPrint $0 # prints 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

休眠时间(单位为:ms)

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

DetailPrint "正在睡觉...^_^"
Sleep 3000
DetailPrint "返回继续运行"

4.9.8 字符串操作指令

4.9.8.1 StrCpy

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

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

StrCpy $0 "a string" # = "a string"
StrCpy $0 "a string" 3 # = "a s"
StrCpy $0 "a string" -1 # = "a strin"
StrCpy $0 "a string" "" 2 # = "string"
StrCpy $0 "a string" "" -3 # = "ing"
StrCpy $0 "a string" 3 -4 # = "rin"

4.9.8.2 StrLen

用户变量(length output) 字符串

获取字符串的长度。

StrLen $0 "123456" # = 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 "一个字符串"

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]

数字运算,将结果输出到用户变量 $x。操作定义为下列之一:

  • + 值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 必须有一个值否则该指令将无效。需要注意的是在编译的时候编译配置文件 NSIS_CONFIG_LOG 必须设置 (scons NSIS_CONFIG_LOG=yes) (默认未设置) 来支持该指令。关于重新编译 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 位整数。第一位(低位)代表该区段当前是否选中，第二位代表该区段是否是一个区段组 (请不要修改这里除非你真的很了解), 第三位代表该区段是否是一个区段组的结尾 (同样，请不要修改)，第四位代表该区段文字是否描黑显示，第五位代表该区段是否是只读，第六位代表区段组是否自动展开，第七位代表区段组是部分选定的，第八位是部分选定区段组切换内部使用，第九位是用来反映区段名称更改。如果指定了超出范围的区段则会放置一个错误的标记。

每个标记名称都以 `SF_` 开头:

!define SF_SELECTED   1
!define SF_SECGRP     2
!define SF_SECGRPEND  4
!define SF_BOLD       8
!define SF_RO         16
!define SF_EXPAND     32
!define SF_PSELECTED  64

对于一个使用范例，请参阅 one-section.nsi 实例。

对于常用的宏和定义，请参阅 Include\Sections.nsh 。

Section test test_section_id
SectionEnd

Function .onInit
  #设置区段 'test' 为选定和只读
  IntOp $0 ${SF_SELECTED} | ${SF_RO}
  SectionSetFlags ${test_section_id} $0
FunctionEnd

4.9.13.2 SectionGetFlags

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

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

Section test test_section_id
SectionEnd

Function .onSelChange
  # 保持区段 'test' 为选定
  SectionGetFlags ${test_section_id} $0
  IntOp $0 $0 | ${SF_SELECTED}
  SectionSetFlags ${test_section_id} $0
FunctionEnd

4.9.13.3 SectionSetText

区段索引 区段文本

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

Section "" test_section_id
SectionEnd

Function .onInit
  # 把 区段名 改为 $WINDIR
  SectionSetText ${test_section_id} $WINDIR
FunctionEnd

4.9.13.4 SectionGetText

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

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

Section test test_section_id
SectionEnd

Function .onInit
  # 把 $WINDIR 附加到区段名中
  SectionGetText ${test_section_id} $0
  StrCpy $0 "$0 - $WINDIR"
  SectionSetText ${test_section_id} $0
FunctionEnd

4.9.13.5 SectionSetInstTypes

区段索引 安装类型

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

SectionSetInstTypes 0 5

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

Section test test_section_id
SectionEnd

Function .onInit
  # 使用安装类型 3 和 4 关联区段 'test'
  SectionSetInstTypes ${test_section_id} 12
FunctionEnd

4.9.13.6 SectionGetInstTypes

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

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

Section test test_section_id
SectionEnd

Function .onInit
  # 使用安装类型 5 关联区段 'test' ，优先于它已存在的关联
  SectionGetInstTypes ${test_section_id} $0
  IntOp $0 $0 | 16
  SectionSetInstTypes ${test_section_id} $0
FunctionEnd

4.9.13.7 SectionSetSize

区段索引 新大小

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

Section test test_section_id
SectionEnd

Function .onInit
  # 设置区段 'test' 所需大小为 100 字节
  SectionSetSize ${test_section_id} 100
FunctionEnd

4.9.13.8 SectionGetSize

区段索引 用户变量

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

Section test test_section_id
SectionEnd

Function .onInit
  #增加区段 'test' 所需大小 100 字节
  SectionGetSize ${test_section_id} $0
  IntOp $0 $0 + 100
  SectionSetSize ${test_section_id} $0
FunctionEnd

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 。

InstType a
InstType b

Function .onInit
  # 设置第一个安装类型的名字 $WINDIR
  InstTypeSetText 0 $WINDIR
  # 设置第二个安装类型的名字 $TEMP
  InstTypeSetText 1 $TEMP
FunctionEnd

4.9.13.12 InstTypeGetText

安装类型索引 用户变量

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

InstType a
InstType b

Function .onInit
  InstTypeGetText 0 $0
  DetailPrint $0 # prints 'a'
  InstTypeGetText 1 $0
  DetailPrint $0 # prints 'b'
FunctionEnd

4.9.14 用户界面指令

4.9.14.1 BringToFront

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

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

4.9.14.2 CreateFont

user_var(handle output) face_name [height] [weight] [/ITALIC] [/UNDERLINE] [/STRIKE]

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

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

!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

用户信息

添加 "用户信息" 字符串到安装程序的安装信息查看窗口。

DetailPrint "this message will show on the installation window"

4.9.14.4 EnableWindow

窗口句柄 (1|0)

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

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

4.9.14.5 FindWindow

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

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

FindWindow $0 "#32770" "" $HWNDPARENT
FindWindow $0 "my window class" "my window title"

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 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

Include 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 来获取控件的句柄 (HWND) 。如果要使得控件透明你可以指定 "transparent" 作为背景颜色值。你也可以指定 /BRANDING 并带或不带文本颜色和背景颜色来使得控件完全灰白 (或其他你选择的颜色)。下面是在 MUI 里用来显示标志牌颜色的实例:

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

警告: 当 XPStlye on 时,勾选按钮 (Check Boxes) 背景颜色设置为 "transparent" 可能无效。当使用某些 Windows 主题时，它的背景可能完全是黑色而不是透明的。

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

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

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

4.9.15.2 LangString

名称 语言ID 字符串

定义一个使用多语言的字符串。这意味着对每种语言来说他们的值可能不同(或者相同, 由你决定)。这允许你容易的使你的安装程序多语言化为不需要再脚本里使用大量的开关语句。

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

注意:

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

使用范例:

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

 MessageBox MB_OK "A translated message: $(message)"

4.9.15.3 LicenseLangString

名称 语言ID 许可文件路径

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

LicenseLangString license ${LANG_ENGLISH} license-english.txt
LicenseLangString license ${LANG_FRENCH} license-french.txt
LicenseLangString license ${LANG_GERMAN} license-german.txt

LicenseData $(license)


多语言

4.10 多语言

截至第 2 版 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 设置。


插件 DLLs

4.11 插件 DLLs

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

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

当插件命令执行时 NSIS 将会解压所需的插件 DLL 文件到一个临时目录 ($PLUGINSDIR)，把指定的参数全部压入(从右到左次序)，然后执行 DLL 函数。

4.11.1 使用插件命令

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

InstallOptions::dialog "ini_file_location.ini"

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

4.11.2 手动调用插件

如果你想调用一个用户硬盘或其他地方里的插件，你可以使用 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 函数里进行处理。你可以使用 GetOptions 。

!include FileFunc.nsh
!insertmacro GetParameters
!insertmacro GetOptions

Function .onInit
  ${GetParameters} $R0
  ClearErrors
  ${GetOptions} $R0 /USERNAME= $0
FunctionEnd

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

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

或:

foo.exe /S /USERNAME=带空格的字符串 /D=C:\Program Files\Foo

或:

foo.exe /S /USERNAME="带空格的字符串" /D=C:\Program Files\Foo

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


编译时的命令

第五章: 编译时的命令

  • 编译时的命令
    • !include
    • !addincludedir
    • !addplugindir
    • !appendfile
    • !cd
    • !delfile
    • !echo
    • !error
    • !execute
    • !packhdr
    • !system
    • !tempfile
    • !warning
    • !verbose
  • 预定义
    • ${__FILE__}
    • ${__LINE__}
    • ${__DATE__}
    • ${__TIME__}
    • ${__TIMESTAMP__}
    • 范围预定义
  • 读取环境变量
    • $%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 C:\MyConfig.nsi
!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 is defined"
!endif

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 built on ${DATE} > "${FILE}"'
File /oname=build.txt "${FILE}"
!delfile "${FILE}"
!undef FILE
!undef DATE

5.1.13 !warning

[信息]

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

!ifdef USE_DANGEROUS_STUFF
  !warning "using dangerous stuff"
!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 ${__FILE__}

当前脚本名称。

5.2.2 ${__LINE__}

当前行号。

5.2.3 ${__DATE__}

当脚本开始编译时当前时区的日期。

5.2.4 ${__TIME__}

当脚本开始编译时当前时区的时间。

5.2.5 ${__TIMESTAMP__}

当脚本开始编译时脚本的修改时间戳。

5.2.6 范围预定义

包含当前代码范围信息的标准预定义。

5.2.6.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.6.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.6.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.6.4 ${__PAGEEX__}

在 PageEx 范围内，被定义为页面类型。

!ifdef __PAGEEX__
  !error "这不应该在这里!"
!endif

PageEx instfiles

  !ifndef __PAGEEX__
    !error "缺少预定义!"
  !endif

  !if ${__PAGEEX__} != instfiles
    !error "页面类型错误"
  !endif

PageExEnd

5.2.6.5 ${__UNINSTALL__}

卸载程序中被定义为 区段, 函数 或 PageEx 范围。

!ifdef __UNINSTALL__
  !error "这不应该在这里!"
!endif

Function test

  !ifdef __UNINSTALL__
    !error "这不应该在这里!"
  !endif

FunctionEnd

Function un.test

  !ifndef __UNINSTALL__
    !error "缺少预定义!"
  !endif

FunctionEnd


读取环境变量

5.3 读取环境变量

5.3.1 $%envVarName%

当编译时，$%envVarName% 将会被环境变量 envVarName 替换。


条件编译

5.4 条件编译

编译器有一个定义符号列表，定义符号可以通过 !define 定义或使用 /D 命令行切换。这些定义符号可以用于条件编译 (通过 !ifdef 定义) 或用于符号替换(一种格式简单的宏)。若要用它的值替换一个符号，请使用 ${符号} (如果 "符号" 没有定义，那么不会产生转换)。这个转换为先到先得(first-come-first-served)，这意味着如果你做了:

!define 符号1 ${符号2}

如果定义了 "${符号2}" ，那么当出现那一行时，它将会被替换。否则，当 ${符号1} 被引用时，任何替换都会发生。

与定义、条件编译相关的命令:

5.4.1 !define

([/date|/utcdate] 符号 [值]) | (/math 符号 值1 运算符 值2) | (/file 符号 filename.txt)

这个命令将会向全局定义列表中添加 符号。这个效果与编译器使用 /D 命令行切换效果相似(只有在 !define 命令之后，定义才有效)。

如果使用了 /date 或 /utcdate ，值 将被传递到 strftime 中并且结果将会作为 符号 值使用。strftime 会把代表当前的时间日期转换为实际的值。例如， %H 会转换为当前时间的24小时格式。完整的可用符号列表可以在 MSDN 上查找 strftime。在 POSIX 平台，你可以使用 man strftime 来获取列表。

如果使用了 /math ，把(值1 运算符 值2)的运算结果作为 符号 的定义值。“运算符” 在这里可以是 +,-,*,&,|,^,/ 或 % 。请注意，值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 somesourcefile.cpp

5.4.2 !undef

符号

从全局定义列表中移除一个已定义的符号。请注意，取消定义符号的地方(${符号})将会自己转换为 "${符号}"。

!define SOMETHING
!undef SOMETHING

5.4.3 !ifdef

符号 [布尔逻辑符号 符号 [...]]]

当这个命令与 !endif 命令组成一对时，将会告诉编译器是否编译含在其两者之间的代码。如果 符号 被全局定义了(使用 !define 或 the /D 进行切换)，那么所含的代码将会被编译。否则，那些代码将会被跳过。布尔逻辑符号可以在更多的 宏名称 之间被指定为 & (布尔与) 或 | (布尔或) -- 优先顺序很简单，从左到右。

!define SOMETHING
!ifdef SOMETHING
  !echo "SOMETHING is defined"
!endif
!undef SOMETHING
!ifdef SOMETHING
  !echo "SOMETHING is defined" # will never be printed
!endif

5.4.4 !ifndef

符号 [布尔逻辑符号 符号 [...]]]

它与 !ifdef 正好相反。当 符号 没有被定义时，代码将会被编译。

5.4.5 !if

[!] 值 [运算符 值2]

当这个命令与 !endif 命令组成一对时，将会告诉编译器是否编译含在其两者之间的代码。如果 值 为非零或者 值 和 值2 的逻辑运算结果为真，那么所含的代码将会被编译。否则，那些代码将会被跳过。 运算符 可以是 == or != (字符串比较), <=, < > 或 >= (实数比较), && or || (布尔运算)。 如果设置了 [!] ，则逻辑运算结果取非。

!if 1 < 2
  !echo "1 is smaller than 2!!"
!else if ! 3.1 > 1.99
  !error "this line should never appear"
!else
  !error "neither should this"
!endif

5.4.6 !ifmacrodef

宏名称 [布尔逻辑符号 宏名称 [...]]]

当这个命令与 !endif 命令组成一对时，将会告诉编译器是否编译在其两者之间的代码。如果宏 宏名称 存在，那么所含的代码将会被编译。否则，那些代码将会被跳过。布尔逻辑符号可以在更多的 宏名称 之间被指定为 & (布尔与) 或 | (布尔或) -- 优先顺序很简单，从左到右。

!macro SomeMacro
!macroend
!ifmacrodef SomeMacro
  !echo "SomeMacro is defined"
!endif

5.4.7 !ifmacrondef

宏名称 [布尔逻辑符号 宏名称 [...]]]

它与 !ifmacrodef 正好相反。当 宏名称 不存在时，代码块将会被编译。

5.4.8 !else

[if|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

这个命令用于关闭以 !if, !ifdef, !ifndef, !ifmacrodef 或 !ifmacrondef 起始的代码块。

5.4.10 !insertmacro

宏名称 [参数] [...]

插入一个由 !macro 创建的宏的内容。如果创建的宏带有参数，那么你必须按宏的需求向它传送足够的参数。

!macro Print text
  DetailPrint "${text}"
!macroend
!insertmacro Print "some text"
!insertmacro Print "some more text"

5.4.11 !macro

宏名称 [参数][...]

创建一个名为 "宏名称" 的宏。所有在 !macro 与 !macroend 之间的代码行都会被保存。若要稍后插入宏，请使用 !insertmacro 。!macro 定义可以有一个或多个定义的参数。这些参数可以按相同的方式被访问，宏参数会被依次定义(例如：${PARMNAME})且在宏结束的时候依次取消定义。

!macro SomeMacro parm1 parm2 parm3
  DetailPrint "${parm1}"
  MessageBox MB_OK "${parm2}"
  File "${parm3}"
!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"


新式用户界面(Modern UI)

附录 A: 新式用户界面(Modern UI)

NSIS 2 使得你更容易的创建一个自定义用户界面的安装程序。Modern UI (新式用户界面) 就像是一个 Windows 向导那样的界面。 这个新式用户界面以新页面 (欢迎、完成、开始菜单) 和组件选择页面的一个描述区域为特色。这些界面和图形都可以通过提供的设置自定义。 使用 Modern UI 的宏和语言文件使得写一个新式界面的脚本变得简单。

详细信息和文档请查看 Modern UI 2 自述文件。

NSIS 2.34 带来了新式用户界面一个新的版本，新式用户界面-第2版 (Modern UI 2)。它更快速且更扩展性更好。它允许用插件增加新型的页面甚至使用一个简单的 NSH 头文件改变现有的页面。它还可以使用 nsDialogs 比以前使用类似的插件 - InstallOptions 更快速。

旧版本详细信息和文档请查看 Modern UI 自述文件。


DLL/TLB 库的安装

附录 B: DLL/TLB 库的安装

  • 介绍
  • 库的安装
    • 介绍
    • 参数
    • 选项
    • 注意事项
    • 例子
  • 库的卸载
    • 介绍
    • 参数
    • 选项
    • 例子
  • Visual Basic 6 运行库


介绍

B.1 介绍

安装动态连接库(DLL)和类型库(TLB)可以使用 Library 头文件。 必要时, 将执行以下操作:

  • 文件复制
  • 重启后文件复制
  • 版本检查
  • 注册和取消注册
  • 重启后注册和取消注册
  • 共享 DLL 的计数
  • Windows 文件保护检查

这些宏保存在头文件 Library.nsh 里，因此首先你需要将该头文件包含到你的脚本里:

!include Library.nsh

请注意，library 宏在非 Windows 平台下是有限制的。在非 Windows 平台下编译时，DLL 版本信息是必需的。


库的安装

B.2 库的安装

B.2.1 介绍

InstallLib 宏用来安装一个库。如果在安装过程中发生了错误将会放置一个错误标记。

如果需要询问用户是否重新启动计算机，可以使用带一个完成页面的 MUI 或使用 IfRebootFlag 并在你自己的页面或对话框上进行提示。

B.2.2 参数

库类型 是否共享 安装方式 本地文件 目标文件 临时目录

库类型

The type of the library

DLL - 动态链接库 (DLL)
REGDLL - 要注册的 DLL
REGEXE - 使用 /regserver 注册的 EXE COM 服务程序
TLB - 类型库或包含类型库(LIBRARY)的 DLL
REGDLLTLB - 要注册并包含类型库的 DLL

是否共享

指定要安装的库是否与其它应用程序共享

NOTSHARED - 该库不共享
$VARNAME - 当应用程序第一次安装时为空， 安装时将使共享库计数增加。

安装方式

指定安装方式

REBOOT_PROTECTED

  • 正在使用时等待重新启动后更新文件 (所需的系统文件)。
  • 当文件没有 Windows 文件保护时更新文件。

NOREBOOT_PROTECTED

  • 当文件正在使用时警告用户。用户将可以关闭使用该文件的应用程序。
  • 当文件没有 Windows 文件保护时更新文件。

REBOOT_NOTPROTECTED

  • 正在使用时等待重新启动后更新文件 (所需的系统文件)。
  • 不检查 Windows 文件保护直接更新文件。

NOREBOOT_NOTPROTECTED

  • 当文件正在使用时警告用户。用户将可以关闭使用该文件的应用程序。
  • 不检查 Windows 文件保护直接更新文件。

本地文件

编译时文件的位置

目标文件

在用户的系统里需要更新文件的位置

临时目录

当系统需要重新启动时用来保存临时文件的目录。

要支持 Windows 9x/ME ，该目录应该和目标文件位于同一个磁盘区(volume)里。 Windows 临时目录可以位于任何磁盘区(volume)，所以你不能使用该目录。

B.2.3 选项

在插入 InstallLib 宏之前，定义以下内容，可以更改它们原来定义的操作。

B.2.3.1 LIBRARY_X64

  • 用于 Windows x64 系统中的 DLL 安装。
  • 警告: 它会重置文件系统的重定向。

B.2.3.2 LIBRARY_SHELL_EXTENSION

  • 在插入 InstallLib 宏之前定义它将在注册后调用带 SHCNE_ASSOCCHANGED 的 SHChangeNotify 函数。
  • 它可以在安装了环境扩展或更改了文件关联后刷新环境。

B.2.3.3 LIBRARY_COM

  • 在插入 InstallLib 宏之前定义它将在注册后调用 CoFreeUnusedLibraries 函数。
  • 当安装了 COM 库后它可以从内存里卸载所有不需要的库文件。

B.2.3.4 LIBRARY_IGNORE_VERSION

  • 在插入 InstallLib 宏之前定义它，将忽略文件的版本信息。即使它已经存在，也会安装。
  • 可在需要旧版本或者指定版本时使用它。
  • 在 DLL 文件需要安装到 $SYSDIR 目录时不推荐使用。

B.2.4 注意事项

  • 如果你想要支持 Windows 9x/ME ，那么你只能使用短文件名(8.3)。
  • 警告: 当部署 DLL 时，总是使用可再开发组件的文件。不要从你的系统目录里复制文件。

B.2.5 例子

B.2.5.1 取消共享 DLL

 !insertmacro InstallLib REGDLL NOTSHARED REBOOT_NOTPROTECTED dllname.dll $SYSDIR\dllname.dll $SYSDIR

B.2.5.2 共享 DLL

 ;如果应用程序已安装，请把 $ALREADY_INSTALLED 设为一个非零的值。
 ;例如:

 IfFileExists "$INSTDIR\MyApp.exe" 0 new_installation ;Replace MyApp.exe with your application filename
   StrCpy $ALREADY_INSTALLED 1
 new_installation:

 !insertmacro InstallLib REGDLL $ALREADY_INSTALLED REBOOT_NOTPROTECTED dllname.dll $SYSDIR\dllname.dll $SYSDIR


库的卸载

B.3 库的卸载

B.3.1 介绍

UnInstallLib 宏用来卸载一个库。如果在卸载过程中发生了错误将会放置一个错误标记。

B.3.2 参数

库类型 是否共享 卸载方式 文件

库类型

库的类型

DLL - 动态链接库 (DLL)
REGDLL - 要注册的 DLL
REGEXE - 使用 /unregserver 注册的 EXE COM 服务程序
TLB - 类型库或包含类型库(LIBRARY)的 DLL
REGDLLTLB - 要注册并包含类型库的 DLL

是否共享

指定要安装的库是否与其它应用程序共享

NOTSHARED - 该库不共享
SHARED - T该库是共享的且仅在共享库计数减少到不再使用时才移除。

卸载方式

指定卸载方式

NOREMOVE

  • 该库不应该被删除。你应该在公共的或重要的系统文件(比如 Visual Basic/C++/MFC 运行库)使用该选项。

REBOOT_PROTECTED

  • 正在使用时等待重新启动后移除文件 (所需的系统文件)。
  • 当文件没有 Windows 文件保护时移除文件。

NOREBOOT_PROTECTED

  • 当文件正在使用时警告用户。用户将可以关闭使用该文件的应用程序。
  • 当文件没有 Windows 文件保护时移除文件。

REBOOT_NOTPROTECTED

  • 正在使用时等待重新启动后移除文件 (所需的系统文件)。
  • 不检查 Windows 文件保护直接移除文件。

NOREBOOT_NOTPROTECTED

  • 当文件正在使用时警告用户。用户将可以关闭使用该文件的应用程序。
  • 不检查 Windows 文件保护直接移除文件。

文件

用户系统里要卸载的文件位置。

B.3.3 选项

在插入 UnInstallLib 宏之前，定义以下内容，可以更改它们原来定义的操作。

B.3.3.1 LIBRARY_X64

  • 用于 Windows x64 系统中的 DLL 卸载。
  • 警告: 它会重置 RegSetView 和文件系统的重定向。

B.3.3.2 LIBRARY_SHELL_EXTENSION

  • 在插入 UninstallLib 宏之前定义它,会在反注册后调用带 SHCNE_ASSOCCHANGED 的 SHChangeNotify 函数。
  • 它可以在卸载了环境扩展或更改了文件关联后刷新环境。

B.3.3.3 LIBRARY_COM

  • 在插入 UninstallLib 宏之前定义它，会在反注册后调用 CoFreeUnusedLibraries 函数。当卸载了 COM 库后，它可以从内存里卸载所有不需要的库文件。

B.3.4 例子

 !insertmacro UnInstallLib REGDLL SHARED REBOOT_NOTPROTECTED $SYSDIR\dllname.dll


Visual Basic 6 运行库

B.4 Visual Basic 6 运行库

VB6RunTime.nsh 新头文件可以用于安装 VB6 运行库。 获取最新的运行库，下载 vb6runtime.zip 并解压此文件。

 !include VB6RunTime.nsh

 Var AlreadyInstalled

 Section "-Install VB6 run-time files"

   ;如果应用程序已经安装，请把 $AlreadyInstalled 设为一个非零的值。 例如:
   IfFileExists "$INSTDIR\MyApp.exe" 0 new_installation ;把 MyApp.exe 替换成你的应用程序文件名
     StrCpy $AlreadyInstalled 1
   new_installation:

   !insertmacro VB6RunTimeInstall C:\vb6runtimes $AlreadyInstalled ;把 C:\vb6runtimes 替换成库文件所在位置

 SectionEnd

 Section "-un.Uninstall VB6 run-time files"

   !insertmacro VB6RunTimeUnInstall

 SectionEnd

备注:

  • 你可能必须安装附加文件，例如 Visual Basic 应用程序使用用户界面控件 OCX 文件运行那样。
  • 安装运行库时需要管理员或高级用户权限，使用 Multi-User 头文件可以验证这些权限是否可用。
  • 在必要的时候，添加一个带有完成页面的 MUI 或使用另外一个检查(查看 IfRebootFlag) 允许用户重新启动计算机。


常用脚本

附录 C: 常用脚本

  • 获取 Internet Explorer 版本
  • 判断 .NET Framework 是否已安装?
  • 判断 Macromedia Flash Player 是否已安装?
  • 连接到 Internet
  • 获取安装程序文件名
  • 禁止多个安装程序实例
  • 更多


获取 Internet Explorer 版本

C.1 获取 Internet Explorer 版本

 ; GetIEVersion
 ;
 ; 基于 Yazno's 的函数，http://yazno.tripod.com/powerpimpit/
 ; 返回到堆栈顶
 ; 1-6 (已安装的 IE 版本)
 ; or
 ; '' (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.2 判断 .NET Framework 是否已安装?

 ; IsDotNETInstalled
 ;
 ; 基于 GetDotNETVersion
 ;   http://nsis.sourceforge.net/Get_.NET_Version
 ;
 ; 用法:
 ;   Call IsDotNETInstalled
 ;   Pop $0
 ;   StrCmp $0 1 found.NETFramework no.NETFramework

 Function IsDotNETInstalled
   Push $0
   Push $1

   StrCpy $0 1
   System::Call "mscoree::GetCORVersion(w, i ${NSIS_MAX_STRLEN}, *i) i .r1"
   StrCmp $1 0 +2
     StrCpy $0 0

   Pop $1
   Exch $0
 FunctionEnd


判断 Macromedia Flash Player 是否已安装?

C.3 判断 Macromedia Flash Player 是否已安装?

 ; IsFlashInstalled
 ;
 ; By Yazno, http://yazno.tripod.com/powerpimpit/
 ; 返回值到堆栈顶
 ; 0 (Flash 未安装)
 ; or
 ; 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.4 连接到 Internet

 ; ConnectInternet (使用 Dialer 插件)
 ; 作者： 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.5 获取安装程序文件名

 System::Call 'kernel32::GetModuleFileNameA(i 0, t .R0, i 1024) i r1'
 ;$R0 将包含了安装程序全名


禁止多个安装程序实例

C.6 禁止多个安装程序实例

把下列代码放到你的 .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.7 更多

更多的常用函数你可以在 the 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 "uninstaller set error level $0"

如果你不这样做，那么你就只能知道卸载程序失败是否复制本身到临时文件夹。


添加卸载信息到添加/删除程序面板

D.2 添加卸载信息到添加/删除程序面板

在 HKLM\Software\Microsoft\Windows\CurrentVersion\Uninstall 下创建一个以你的产品名为名的项，就可以向控制面板中的"添加/删除程序"添加一个条目。 对于 Windows NT (NT4/2000/XP), 可能还要在 HKCU 下创建项，而且这将只能显示给当前用户。 这里有若干可以写入关于你的应用程序和卸载程序的信息的值项。 可以使用 WriteRegStr 命令(对于字符串)或 WriteRegDWORD 命令(对 DWORD 值)写入一个值。例如:

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

请注意：Call、Get 和 Debug 函数不能使用 GCC 编译,因此需要下载 Windows 版本的 NSIS 然后解压 System.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 & large 型整数 (已知的为 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 相对应；

每个参数由类型，输入和输出指定。可以用一个点跳过输入或输出。例如:

字符串 (一个字符数组的指针), 输入为 'happy calling':

t 'happy calling'

字符串 (一个字符数组的指针),输入从 $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 脚本中使用这个函数了。

首先, 你必须将输出目录更改为你要用的 DLL 所在的目录。如果 DLL 在系统路径中，那么它也能工作，但并没有经过测试。

下面的代码段会将 'condmgr.dll' 释放到一个临时目录中，然后执行 CmGetHotSyncExecPath 函数，并显示返回的数据。 保存这个脚本

; **** snip ****
Function loadDll

  SetOutPath $TEMP\eInspect             ; 创建临时目录
  File bin\CondMgr.dll                  ; 释放 dll
  StrCpy $1 ${NSIS_MAX_STRLEN}          ; 分配内存到 $0
  System::Call 'CondMgr::CmGetHotSyncExecPath(t, *i) i(.r0, r1r1).r2'
  DetailPrint '路径: "$0"'
  DetailPrint "路径长度: $1"
  DetailPrint "返回值: $2"

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.5 如何读取 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 ""
  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 "${RegQueryValueEx}(r0, '${VALUE}', 0, .r1, 0, .r2) .r3"

  StrCmp $3 0 read
    MessageBox MB_OK|MB_ICONSTOP "不能查询注册表值! ($3)"
    Goto done

read:

  StrCmp $1 ${REG_MULTI_SZ} multisz
    MessageBox MB_OK|MB_ICONSTOP "注册表值不是 REG_MULTI_SZ! ($3)"
    Goto done

multisz:

  StrCmp $2 0 0 multiszalloc
    MessageBox MB_OK|MB_ICONSTOP "R注册表值为空! ($3)"
    Goto done

multiszalloc:

  System::Alloc $2
  Pop $1

  StrCmp $1 0 0 multiszget
    MessageBox MB_OK|MB_ICONSTOP "不能分配足够的内存! ($3)"
    Goto done

multiszget:

  System::Call "${RegQueryValueEx}(r0, '${VALUE}', 0, n, r1, r2) .r3"

  StrCmp $3 0 multiszprocess
    MessageBox MB_OK|MB_ICONSTOP "无法查询注册表值数据! ($3)"
    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 $1

  StrCmp $0 0 noClose
    System::Call "${RegCloseKey}(r0)"

noClose:

SectionEnd

written by KiCHiK


常用头文件

附录 E: 常用头文件

  • 文件函数头文件
    • 介绍
    • Locate
    • GetSize
    • DriveSpace
    • GetDrives
    • GetTime
    • GetFileAttributes
    • GetFileVersion
    • GetExeName
    • GetExePath
    • GetParameters
    • GetOptions
    • GetOptionsS
    • GetRoot
    • GetParent
    • GetFileName
    • GetBaseName
    • GetFileExt
    • BannerTrimPath
    • DirState
    • RefreshShellIcons
  • 文本函数头文件
    • 介绍
    • LineFind
    • LineRead
    • FileReadFromEnd
    • LineSum
    • FileJoin
    • TextCompare
    • TextCompareS
    • ConfigRead
    • ConfigReadS
    • ConfigWrite
    • ConfigWriteS
    • FileRecode
    • TrimNewLines
  • 文字函数头文件
    • 介绍
    • WordFind
    • WordFindS
    • WordFind2X
    • WordFind2XS
    • WordFind3X
    • WordFind3XS
    • WordReplace
    • WordReplaceS
    • WordAdd
    • WordAddS
    • WordInsert
    • WordInsertS
    • StrFilter
    • StrFilterS
    • VersionCompare
    • VersionConvert


文件函数头文件

E.1 文件函数头文件

E.1.1 介绍

包含头文件:

!include "FileFunc.nsh"

调用函数:

Section Install
     ${GetFileExt} "C:\My Downloads\Index.html" $R0
     ; $R0="html"
SectionEnd

Section un.Install
     ${GetParent} "C:\My Downloads\Index.html" $R0
     ; $R0="C:\My Downloads"
SectionEnd

E.1.2 Locate

  • 使用过滤和大小选项，查找文件、目录和空目录。

语法:

${Locate} "[Path]" "[Options]" "Function"

"[Path]"      ; Disk or Directory
              ;
"[Options]"   ; /L=[FD|F|D|DE|FDE]
              ;     /L=FD    - Locate Files and Directories (default)
              ;     /L=F     - Locate Files only
              ;     /L=D     - Locate Directories only
              ;     /L=DE    - Locate Empty Directories only
              ;     /L=FDE   - Locate Files and Empty Directories
              ; /M=[mask]
              ;     /M=*.*         - Locate all (default)
              ;     /M=*.doc       - Locate Work.doc, 1.doc ...
              ;     /M=Pho*        - Locate PHOTOS, phone.txt ...
              ;     /M=win???.exe  - Locate winamp.exe, winver.exe ...
              ;     /M=winamp.exe  - Locate winamp.exe only
              ; /S=No:No[B|K|M|G]
              ;     /S=      - Don't locate file size (faster) (default)
              ;     /S=0:0B  - Locate only files of 0 Bytes exactly
              ;     /S=5:9K  - Locate only files of 5 to 9 Kilobytes
              ;     /S=:10M  - Locate only files of 10 Megabyte or less
              ;     /S=1G    - Locate only files of 1 Gigabyte or more
              ; /G=[1|0]
              ;     /G=1     - Locate with subdirectories (default)
              ;     /G=0     - Locate without subdirectories
              ; /B=[0|1]
              ;     /B=0     - Banner isn't used (default)
              ;     /B=1     - Banner is used. Callback when function
              ;                start to search in new directory
"Function"    ; Callback function when found

Function "Function"
    ; $R9    "path\name"
    ; $R8    "path"
    ; $R7    "name"
    ; $R6    "size"  ($R6="" if directory, $R6="0" if file with /S=)

    ; $R0-$R5  are not used (save data in them).
    ; ...

    Push $var    ; If $var="StopLocate" Then exit from function
FunctionEnd

注意:
- Error flag if disk or directory isn't exist
- Error flag if syntax error
- See also Locate plugin

例子 (查找一个文件):

Section
    ${Locate} "C:\ftp" "/L=F /M=RPC DCOM.rar /S=1K" "Example1"
    ; 'RPC DCOM.rar' file in 'C:\ftp' with size 1 Kb or more

    IfErrors 0 +2
    MessageBox MB_OK "Error" 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$\nFind next?' IDYES +2
    StrCpy $0 StopLocate

    Push $0
FunctionEnd

例子 (把结果写入一个文本文件):

Section
    GetTempFileName $R0
    FileOpen $R1 $R0 w
    ${Locate} "C:\ftp" "/S=:2M /G=0" "Example2"
    ; folders and all files with size 2 Mb or less
    ; don't scan subdirectories
    FileClose $R1

    IfErrors 0 +2
    MessageBox MB_OK "Error" IDOK +2
    Exec '"notepad.exe" "$R0"'
SectionEnd

Function Example2
    StrCmp $R6 '' 0 +3
    FileWrite $R1 "Directory=$R9$\r$\n"
    goto +2
    FileWrite $R1 "File=$R9  Size=$R6 Mb$\r$\n"

    Push $0
FunctionEnd

例子 (把结果写入一个 INI 文件):

Section
    GetTempFileName $R0
    ${Locate} "C:\ftp" "/L=F /S=0K" "Example3"
    ; all files in 'C:\ftp' with size detect in Kb

    IfErrors 0 +2
    MessageBox MB_OK "Error" 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 directories were removed$\n$R3 loops'
SectionEnd

Function Example4
    MessageBox MB_YESNOCANCEL 'Delete empty "$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"   ;Directory move from
    StrCpy $R1 "C:\ftp2"  ;Directory move into

    StrCpy $R2 0
    StrCpy $R3 0
    ${Locate} "$R0" "/L=F" "Example5"

    IfErrors 0 +2
    MessageBox MB_OK 'error' IDOK +4
    StrCmp $R3 0 0 +2
    MessageBox MB_OK '$R2 files were moved' IDOK +2
    MessageBox MB_OK '$R2 files were moved$\n$R3 files were NOT moved'
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"   ;Directory copy from
    StrCpy $R1 "C:\ftp2"  ;Directory copy into
    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"'     ;view log
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"     ;Directory structure from
    StrCpy $R1 "C:\ftp2"    ;Directory structure into
    StrLen $R2 $R0

    ${Locate} "$R0" "/L=D" "Example7"

    IfErrors 0 +2
    MessageBox MB_OK 'error'
SectionEnd

Function Example7
    StrCpy $1 $R9 '' $R2
    CreateDirectory '$R1$1'

    Push $0
FunctionEnd

例子 (带 Banner 的查找 - 需要 NxS 插件):

Section
    nxs::Show /NOUNLOAD `$(^Name) Setup` /top `Setup searching something$\r$\nPlease wait... If you can..` /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]"      ; Disk or Directory
              ;
"[Options]"   ; /M=[mask]
              ;     /M=*.*         - Find all (default)
              ;     /M=*.doc       - Find Work.doc, 1.doc ...
              ;     /M=Pho*        - Find PHOTOS, phone.txt ...
              ;     /M=win???.exe  - Find winamp.exe, winver.exe ...
              ;     /M=winamp.exe  - Find winamp.exe only
              ; /S=No:No[B|K|M|G]
              ;     /S=      - Don't find file size (faster) (default)
              ;     /S=0:0B  - Find only files of 0 Bytes exactly
              ;     /S=5:9K  - Find only files of 5 to 9 Kilobytes
              ;     /S=:10M  - Find only files of 10 Megabyte or less
              ;     /S=1G    - Find only files of 1 Gigabyte or more
              ; /G=[1|0]
              ;     /G=1     - Find with subdirectories (default)
              ;     /G=0     - Find without subdirectories
              ;
$var1         ; Result1: Size
$var2         ; Result2: Sum of files
$var3         ; Result3: Sum of directories

注意:
- Error flag if disk or directory isn't exist
- Error flag if syntax error
- See also Locate plugin

例子 (1):

Section
    ; Find file size "C:\WINDOWS\Explorer.exe" in kilobytes

    ${GetSize} "C:\WINDOWS" "/M=Explorer.exe /S=0K /G=0" $0 $1 $2
    ; $0="220" Kb
    ; $1="1"   files
    ; $2=""    directories

    IfErrors 0 +2
    MessageBox MB_OK "Error"
SectionEnd

例子 (2):

Section
    ; Find folder size "C:\Installs\Reanimator\Drivers" in megabytes

    ${GetSize} "C:\Installs\Reanimator\Drivers" "/S=0M" $0 $1 $2
    ; $0="132" Mb
    ; $1="555" files
    ; $2="55"  directories

    IfErrors 0 +2
    MessageBox MB_OK "Error"
SectionEnd

例子 (3):

Section
    ; Find sum of files and folders "C:\WINDOWS" (no subfolders)

    ${GetSize} "C:\WINDOWS" "/G=0" $0 $1 $2
    ; $0=""    size
    ; $1="253" files
    ; $2="46"  directories

    IfErrors 0 +2
    MessageBox MB_OK "Error"
SectionEnd

E.1.4 DriveSpace

  • 获取驱动器的容量、已用空间或可用空间。

语法:

${DriveSpace} "[Drive]" "[Options]" $var

"[Drive]"     ; Disk to check
              ;
"[Options]"   ; /D=[T|O|F]
              ;     /D=T  - Total space (default)
              ;     /D=O  - Occupied space
              ;     /D=F  - Free space
              ; /S=[B|K|M|G]
              ;     /S=B  - size in Bytes (default)
              ;     /S=K  - size in Kilobytes
              ;     /S=M  - size in Megabytes
              ;     /S=G  - size in Gigabytes
              ;
$var          ; Result: Size

注意:
- Error flag if disk isn't exist or not ready
- Error flag if syntax error

例子:

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    Floppy Disk Drives
                ;   HDD    Hard Disk Drives
                ;   CDROM  CD-ROM Drives
                ;   NET    Network Drives
                ;   RAM    RAM Disk Drives
                ;
                ; [ALL]
                ;   Find all drives by letter (default)
                ;
"Function"      ; Callback function when found

Function "Function"
    ; $9    "drive letter"  (a:\ c:\ ...)
    ; $8    "drive type"    (FDD HDD ...)

    ; $R0-$R9  are not used (save data in them).
    ; ...

    Push $var    ; If $var="StopGetDrives" Then exit from function
FunctionEnd

例子1:

Section
    ${GetDrives} "FDD+CDROM" "Example1"
SectionEnd

Function Example1
    MessageBox MB_OK "$9  ($8 Drive)"

    Push $0
FunctionEnd

例子2:

Section
    ${GetDrives} "ALL" "Example2"
SectionEnd

Function Example2
    MessageBox MB_OK "$9  ($8 Drive)"

    Push $0
FunctionEnd

例子3 (获取驱动器的类型):

Section
    StrCpy $R0 "D:\"      ;Drive letter
    StrCpy $R1 "invalid"

    ${GetDrives} "ALL" "Example3"

    MessageBox MB_OK "Type of drive $R0 is $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]"        ; Ignored if "L" or "LS"
                ;
"[Option]"      ; [Options]
                ;   L   Local time
                ;   A   last Access file time
                ;   C   Creation file time
                ;   M   Modification file time
                ;   LS  System time (UTC)
                ;   AS  last Access file time (UTC)
                ;   CS  Creation file time (UTC)
                ;   MS  Modification file time (UTC)
                ;
$var1           ; Result1: day
$var2           ; Result2: month
$var3           ; Result3: year
$var4           ; Result4: day of week name
$var5           ; Result5: hour
$var6           ; Result6: minute
$var7           ; Result7: seconds

注意:
- Error flag if file isn't exist
- Error flag if syntax error
- See also Time plugin

例子 (获取本地时间):

Section
    ${GetTime} "" "L" $0 $1 $2 $3 $4 $5 $6
    ; $0="01"      day
    ; $1="04"      month
    ; $2="2005"    year
    ; $3="Friday"  day of week name
    ; $4="16"      hour
    ; $5="05"      minute
    ; $6="50"      seconds

    MessageBox MB_OK 'Date=$0/$1/$2 ($3)$\nTime=$4:$5:$6'
SectionEnd

例子 (获取文件时间):

Section
    ${GetTime} "$WINDIR\Explorer.exe" "C" $0 $1 $2 $3 $4 $5 $6
    ; $0="12"       day
    ; $1="10"       month
    ; $2="2004"     year
    ; $3="Tuesday"  day of week name
    ; $4="2"        hour
    ; $5="32"       minute
    ; $6="03"       seconds

    IfErrors 0 +2
    MessageBox MB_OK "Error" IDOK +2
    MessageBox MB_OK 'Date=$0/$1/$2 ($3)$\nTime=$4:$5:$6'
SectionEnd

例子 (获取系统时间):

Section
    ${GetTime} "" "LS" $0 $1 $2 $3 $4 $5 $6
    ; $0="01"      day
    ; $1="04"      month
    ; $2="2005"    year
    ; $3="Friday"  day of week name
    ; $4="11"      hour
    ; $5="05"      minute
    ; $6="50"      seconds

    MessageBox MB_OK 'Date=$0/$1/$2 ($3)$\nTime=$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 'Date=$0/$1/$2 ($3)$\nTime=$4:$5:$6 $7'
SectionEnd

E.1.7 GetFileAttributes

  • 获取文件或目录的属性。

语法:

${GetFileAttributes} "[File]" "[Attributes]" $var

"[File]"          ; File or directory
                  ;
"[Attributes]"    ; "ALL"  (default)
                  ;  -all attributes of file combined with "|" to output
                  ;
                  ; "READONLY|HIDDEN|SYSTEM|DIRECTORY|ARCHIVE|
                  ; DEVICE|NORMAL|TEMPORARY|SPARSE_FILE|REPARSE_POINT|
                  ; COMPRESSED|OFFLINE|NOT_CONTENT_INDEXED|ENCRYPTED"
                  ;  -file must have specified attributes
                  ;
$var              ; Result:
                  ;    $var=attr1|attr2|... (if used "ALL")
                  ;    $var=1   file has specified attributes
                  ;    $var=0   file has no specified attributes

注意:
- Error flag if file doesn't exist

例子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]"      ; Executable file (*.exe *.dll ...)
$var                ; Result: Version number

注意:
- Error flag if file doesn't exist
- Error flag if file doesn't contain version information

例子:

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

  • 获取安装程序路径名 ($EXEDIR 在 Windows 98/Me 下有效)。

语法:

${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]"     ; command line parameters
                   ;
"[Option]"         ; option name
                   ;
$var               ; Result: option string

注意:
- Error flag if option not found
- First option symbol it is delimiter

例子1:

Section
    ${GetOptions} "/S /T" "/T"  $R0

    IfErrors 0 +2
    MessageBox MB_OK "Not found" IDOK +2
    MessageBox MB_OK "Found"
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 GetOptionsS

  • 与 GetOptions 相同，但区分大小写。

E.1.14 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.15 GetParent

  • 获取父目录。

语法:

${GetParent} "[PathString]" $var

例子:

Section
    ${GetParent} "C:\Program Files\Winamp\uninstwa.exe" $R0
    ; $R0="C:\Program Files\Winamp"
SectionEnd

E.1.16 GetFileName

  • 获取目录路径的最后一部分。

语法:

${GetFileName} "[PathString]" $var

Example:

Section
    ${GetFileName} "C:\Program Files\Winamp\uninstwa.exe" $R0
    ; $R0="uninstwa.exe"
SectionEnd

E.1.17 GetBaseName

  • 获取文件名(无扩展名)。

语法:

${GetBaseName} "[FileString]" $var

例子:

Section
    ${GetBaseName} "C:\ftp\program.exe" $R0
    ; $R0="program"
SectionEnd

E.1.18 GetFileExt

  • 获取文件扩展名。

语法:

${GetFileExt} "[FileString]" $var

例子:

Section
    ${GetFileExt} "C:\ftp\program.exe" $R0
    ; $R0="exe"
SectionEnd

E.1.19 BannerTrimPath

  • 修剪字符串路径。

语法:

${BannerTrimPath} "[PathString]" "[Option]" $var

"[PathString]"    ;
                  ;
"[Option]"        ; [Length][A|B|C|D]
                  ;
                  ; Length  -Maximum string length
                  ;   A     -Trim center path (default)
                  ;           (C:\root\...\third path)
                  ;           If A mode not possible Then will be used B mode
                  ;   B     -Trim right path
                  ;           (C:\root\second path\...)
                  ;           If B mode not possible Then will be used C mode
                  ;   C     -Trim right string
                  ;           (C:\root\second path\third p...)
                  ;   D     -Trim right string + filename
                  ;           (C:\root\second p...\third path)
                  ;           If D mode not possible Then will be used C mode
                  ;
$var              ; Result:  Trimmed path

例子:

Section
    ${BannerTrimPath} "C:\Server\Documents\Terminal\license.htm" "35A" $R0
    ;$R0=C:\Server\...\Terminal\license.htm
SectionEnd

例子 (Banner 插件):

!include "WinMessages.nsh"
!include "FileFunc.nsh"

Section
    Banner::show "Starting..."
    Banner::getWindow
    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"

Section
    nxs::Show /NOUNLOAD `$(^Name) Setup`\
      /top `Setup searching something$\nPlease wait$\nIf you can...`\
      /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.20 DirState

  • 检查目录是否完整、为空或不存在。

语法:

${DirState} "[path]" $var

"[path]"      ; Directory
$var          ; Result:
              ;    $var=0  (empty)
              ;    $var=1  (full)
              ;    $var=-1 (directory not found)

例子:

Section
    ${DirState} "$TEMP" $R0
    ; $R0="1"  directory is full
SectionEnd

E.1.21 RefreshShellIcons

  • 在更改文件关联后，你可以调用这个函数立即刷新 Shell 。

语法:

${RefreshShellIcons}

例子:

Section
    WriteRegStr HKCR "Winamp.File\DefaultIcon" "" "$PROGRAMFILES\Winamp\WINAMP.EXE,2"

    ${RefreshShellIcons}
SectionEnd


文本函数头文件

E.2 文本函数头文件

E.2.1 介绍

包含头文件:

!include "TextFunc.nsh"

调用函数:

Section Install
    ${LineRead} "C:\a.log" "-1" $R0
    ; $R0="Last line$\r$\n"
SectionEnd

Section un.Install
    ${TrimNewLines} "Last line$\r$\n" $R0
    ; $R0="Last line"
SectionEnd

E.2.2 LineFind

  • 在文本文件中查找指定的行，并在回调函数中编辑或查看他们。

语法:

${LineFind} "[File1]" "[File2|/NUL]" "[LineNumbers]" "Function"

"[File1]"         ; Input text file
                  ;
"[File2|/NUL]"    ; [File2]
                  ;   Output text file
                  ;   If empty then File2=File1
                  ; [/NUL]
                  ;   No output text file (only read File1)
                  ;
"[LineNumbers]"   ; [No|-No|No:No|{No}|{-No}|{No:No}]
                  ;   1:-1     all lines to change (default)
                  ;   2        second line from start
                  ;   -3       third line from end
                  ;   5:9      range of lines from 5 to 9
                  ;   {2}      only second line from start to output
                  ;   {-3}     only third line from end to output
                  ;   {5:9}    only range of lines from 5 to 9 to output
                  ;
"Function"        ; Callback function for specified lines

Function "Function"
    ; $R9       current line
    ; $R8       current line number
    ; $R7       current line negative number
    ; $R6       current range of lines
    ; $R5       handle of a file opened to read
    ; $R4       handle of a file opened to write ($R4="" if "/NUL")

    ; you can use any string functions
    ; $R0-$R3  are not used (save data in them).
    ; ...

    Push $var      ; If $var="StopLineFind"  Then exit from function
                   ; If $var="SkipWrite"     Then skip current line (ignored if "/NUL")
FunctionEnd

注意:
- Error flag if input file doesn't exist
- Error flag if output file path doesn't exist
- Ranges must be specified on growth (2 4:5 9:-8 -5:-4 -2:-1)
- Output file will not be updated if no changes made.

例子1 (删除前两个符号):

Section
    ${LineFind} "C:\a.log" "C:\a-edited.log" "3:-1" "Example1"
    IfErrors 0 +2
    MessageBox MB_OK "Error"
SectionEnd

Function Example1
    ${TrimNewLines} '$R9' $R9
    StrCpy $R9 $R9 '' 2
    StrCpy $R9 '$R9$\r$\n'
    ;start from 3 line and delete first two symbols

    Push $0
FunctionEnd

例子2 (显示更改的行):

Section
    ${LineFind} "C:\a.log" "a.log" "{5:12 15 -6:-5 -1}" "Example2"
    IfErrors 0 +2
    MessageBox MB_OK "Error"
SectionEnd

Function Example2
    ${TrimNewLines} '$R9' $R9
    StrCpy $R9 "$R9   ~Changed line ($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 "Error"
SectionEnd

Function Example3
    StrCpy $0 SkipWrite

    Push $0
FunctionEnd

例子4 (插入行):

Section
    ${LineFind} "C:\a.log" "" "10" "Example4
    IfErrors 0 +2
    MessageBox MB_OK "Error"
SectionEnd

Function Example4
    FileWrite $R4 "---First Line---$\r$\n"
    FileWrite $R4 "---Second Line ...---$\r$\n"

    Push $0
FunctionEnd

例子5 (在文件内使用更改计数进行替换 - 需要 "WordFunc.nsh"):

!include "WordFunc.nsh"

Section
    StrCpy $R0 0
    ${LineFind} "C:\a.log" "C:\logs\a.log" "1:-1" "Example5"
    IfErrors 0 +2
    MessageBox MB_OK "Error" IDOK +2
    MessageBox MB_OK "Changed lines=$R0"
SectionEnd

Function Example5
    StrCpy $1 $R9

    ${WordReplace} '$R9' ' ' '_' '+*' $R9

    StrCmp $1 $R9 +2
    IntOp $R0 $R0 + 1
    ;$R0   count of changed lines

    Push $0
FunctionEnd

例子6 (行字符串的剪切或删除):

Section
    ${LineFind} "\a.log" "C:\logs\a.log" "" "Example6"
    IfErrors 0 +2
    MessageBox MB_OK "Error" IDOK +2
    MessageBox MB_OK "Processed lines=$R1:$R2"
SectionEnd

Function Example6
    ;(Cut lines from a line to another line (also including that line))
    StrCmp $R0 finish stop
    StrCmp $R0 start finish
    StrCmp $R9 'Start Line$\r$\n' 0 skip
    StrCpy $R0 start
    StrCpy $R1 $R8
    goto code
    finish:
    StrCmp $R9 'Finish Line$\r$\n' 0 code
    StrCpy $R0 finish
    StrCpy $R2 $R8
    goto code
    skip:
    StrCpy $0 SkipWrite
    goto output
    stop:
    StrCpy $0 StopLineFind
    goto output

    ;;(Delete lines from a line to another line (also including that line))
    ; StrCmp $R0 finish code
    ; StrCmp $R0 start finish
    ; StrCmp $R9 'Start Line$\r$\n' 0 code
    ; StrCpy $R0 start
    ; StrCpy $R1 $R8
    ; goto skip
    ; finish:
    ; StrCmp $R9 'Finish Line$\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 "Error"
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]"         ; Input text file
                 ;
"[LineNumber]"   ; [No|-No]
                 ;   3    line number from start
                 ;   -5   line number from end
                 ;
$var             ; Result: Line

注意:
- Error flag if input file doesn't exist
- Error flag if line number not found

例子:

Section
    ${LineRead} "C:\a.log" "-1" $R0
    ; $R0="Last line$\r$\n"
SectionEnd

E.2.4 FileReadFromEnd

  • 从尾部逐行读取文本文件。

语法:

${FileReadFromEnd} "[File]" "Function"

"[File]"      ; Input text file
"Function"    ; Callback function

Function "Function"
    ; $9       current line
    ; $8       current line number
    ; $7       current line negative number

    ; $R0-$R9  are not used (save data in them).
    ; ...

    Push $var      ; If $var="StopFileReadFromEnd"  Then exit from function
FunctionEnd

注意:
- Error flag if input file doesn't exist

例子1:

Section
    ${FileReadFromEnd} "C:\a.log" "Example1"

    IfErrors 0 +2
    MessageBox MB_OK "Error"
SectionEnd

Function Example1
    MessageBox MB_OKCANCEL '"Line"=[$9]$\n   "#"=[$8]$\n  "-#"=[$7]' IDOK +2
    StrCpy $0 StopFileReadFromEnd

    Push $0
FunctionEnd

例子2 (Reverse text file):

Section
    GetTempFileName $R0
    FileOpen $R1 $R0 w
    ${FileReadFromEnd} "C:\a.log" "Example2"
    FileClose $R1

    IfErrors 0 +2
    MessageBox MB_OK "Error" 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]"      ; Input file
$var          ; Result: Sum of lines

注意:
- Error flag if input file doesn't exist

例子:

Section
    ${LineSum} "C:\a.log" $R0
    ; $R0="54"
SectionEnd

E.2.6 FileJoin

  • 联接两个文件到一个文件中(文件1 + 文件2 = 文件3)。

语法:

${FileJoin} "[File1]" "[File2]" "[File3]"

"[File1]"     ; Input File1
"[File2]"     ; Input File2
"[File3]"     ; Output File3
              ;  If [File3]="" Then add [File2] to [File1]

注意:
- Error flag if input files don't exist
- Error flag if output file path doesn't exist

例子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      Compare these lines
"[File2]"     ; File2      Compare with these lines
"[Options]"   ; (line-by-line):
              ; FastDiff   Compare line N (File1) with line N (File2)
              ;            Call function if Different lines found
              ; FastEqual  Compare line N (File1) with line N (File2)
              ;            Call function if Equal lines found
              ; (line number independent):
              ; SlowDiff   Compare line N (File1) with all lines (File2)
              ;            Call function if line N (File1) Different
              ; SlowEqual  Compare line N (File1) with all lines (File2)
              ;            Call function if line N (File1) Equal
"Function"    ; Callback function

Function "Function"
    ; $9    "Line File1"
    ; $8    "Line number"
    ; $7    "Line File2"  (empty if SlowDiff)
    ; $6    "Line number" (empty if SlowDiff)

    ; $R0-$R9  are not used (save data in them).
    ; ...

    Push $var    ; If $var="StopTextCompare"  Then exit from function
FunctionEnd

注意:
- Error flag if File1 or File2 doesn't exist
- Error flag if syntax error

例子 (不同或相等):

Section
    StrCpy $R0 ''
    ${TextCompare} "C:\1.txt" "C:\2.txt" "FastDiff" "Example1"
    IfErrors 0 +2
    MessageBox MB_OK "Error" IDOK +4

    StrCmp $R0 NotEqual 0 +2
    MessageBox MB_OK "Files differ" IDOK +2
    MessageBox MB_OK "Files identical"
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 "Error" 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 "Error" 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 "Error" IDOK end

    FileWrite $R3 "$\r$\n$R1 | $R0$\r$\n"
    ${TextCompare} "$R1" "$R0" "SlowDiff" "Example4"
    FileClose $R3
    IfErrors 0 +2
    MessageBox MB_OK "Error" 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 "Error" 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 "Error"
SectionEnd

Function Example6
    MessageBox MB_OKCANCEL '$$9    "Line File1" =[$9]$\n$$8    "Line #"      =[$8]$\n$$7    "Line File2" =[$7]$\n$$6    "Line #"      =[$6]' IDOK +2
    StrCpy $0 StopTextCompare

    Push $0
FunctionEnd

E.2.8 TextCompareS

  • 与 TextCompare 相同，但区分大小写。

E.2.9 ConfigRead

  • 读取配置文件中项名称值。

语法:

${ConfigRead} "[File]" "[Entry]" $var

"[File]"      ; config file
              ;
"[Entry]"     ; entry name
              ;
$var          ; Result:  Value

注意:
- Error flag if entry not found
- Error flag if file doesn't exist

例子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.10 ConfigReadS

  • 和 ConfigRead 相同，但区分大小写。

E.2.11 ConfigWrite

  • 写入配置文件中项名称值。

语法:

${ConfigWrite} "[File]" "[Entry]" "[Value]" $var

"[File]"      ; config file
              ;
"[Entry]"     ; entry name
              ;
"[Value]"     ; value name
              ;  if "" then delete Entry
              ;
$var          ; Result:
              ;    $var=CHANGED  Value is written
              ;    $var=DELETED  Entry is deleted
              ;    $var=ADDED    Entry and Value are added
              ;    $var=SAME     Entry and Value already exist

注意:
- Error flag if file doesn't exist
- Error flag if file can't be opened

例子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.12 ConfigWriteS

  • 和 ConfigWrite 相同，但区分大小写。

E.2.13 FileRecode

  • 将文本文件从 DOS 格式重新编码为 Windows 格式，反之亦然。

语法:

${FileRecode} "[File]" "[Format]"

"[File]"        ;
                ;
"[Format]"      ; OemToChar   -from DOS to Windows
                ; CharToOem   -from Windows to DOS

注意:
- Error flag if file doesn't exist
- Error flag if syntax error

例子:

Section
    ${FileRecode} "C:\SCANDISK.LOG" "CharToOem"
SectionEnd

E.2.14 TrimNewLines

  • 截去字符串中的换行符。

语法:

${TrimNewLines} "[string]" $var

"[string]"    ; Input string
$var          ; Result: String without '$\r' and '$\n' at the end

例子:

Section
    ${TrimNewLines} "Text line$\r$\n" $R0
    ; $R0="Text line"
SectionEnd


文字函数头文件

E.3 文字函数头文件

E.3.1 介绍

包含头文件:

!include "WordFunc.nsh"

调用函数:

Section Install
    ${WordFind} "A--H---S" "-" "+2" $R0
    ; $R0="H"
SectionEnd

Section un.Install
    ${WordReplace} "A--H---S" "-" "x" "+3*" $R0
    ; $R0="A--HxS"
SectionEnd

E.3.2 WordFind

  • 多功能字符串函数。
Strings:
"[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]
                   ;  input string
"[delimiter]"      ;[delimiter]
                   ;  one or several symbols
"[E][options]"     ;[options]
                   ;  +number   : word number from start
                   ;  -number   : word number from end
                   ;  +number}  : delimiter number from start
                   ;              all space after this
                   ;              delimiter to output
                   ;  +number{  : delimiter number from start
                   ;              all space before this
                   ;              delimiter to output
                   ;  +number}} : word number from start
                   ;              all space after this word
                   ;              to output
                   ;  +number{{ : word number from start
                   ;              all space before this word
                   ;              to output
                   ;  +number{} : word number from start
                   ;              all space before and after
                   ;              this word (word exclude)
                   ;  +number*} : word number from start
                   ;              all space after this
                   ;              word to output with word
                   ;  +number{* : word number from start
                   ;              all space before this
                   ;              word to output with word
                   ;  #         : sum of words to output
                   ;  *         : sum of delimiters to output
                   ;  /word     : number of word to output
                   ;
                   ;[E]
                   ;  with errorlevel output
                   ;  IfErrors:
                   ;     $var=1  delimiter not found
                   ;     $var=2  no such word number
                   ;     $var=3  syntax error (Use: +1,-1},#,*,/word,...)
                   ;[]
                   ;  no errorlevel output (default)
                   ;  If some errors found then (result=input string)
                   ;
$var               ;output (result)

注意:
- Accepted numbers 1,01,001,...

Example (通过数字查找文字):

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 = Start position of word (11)
    StrLen $1 ':\lo'          ; $1 = Word length (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       ; errorlevel 1?
    MessageBox MB_OK 'delimiter not found' IDOK end
    StrCmp $R0 2 0 +2       ; errorlevel 2?
    MessageBox MB_OK 'no such word number' IDOK end
    StrCmp $R0 3 0 +2       ; errorlevel 3?
    MessageBox MB_OK 'syntax error'

    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 'Found' IDOK end
    notfound:
    MessageBox MB_OK 'Not found'

    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 'Found' IDOK end
    notfound:
    MessageBox MB_OK 'Not found'

    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

  • 在两个分隔符之间查找文字。
Strings:
"[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]
                   ;  input string
"[delimiter1]"     ;[delimiter1]
                   ;  first delimiter
"[delimiter2]"     ;[delimiter2]
                   ;  second delimiter
"[E][options]"     ;[options]
                   ;  +number   : word number from start
                   ;  -number   : word number from end
                   ;  +number}} : word number from start all space
                   ;              after this word to output
                   ;  +number{{ : word number from end all space
                   ;              before this word to output
                   ;  +number{} : word number from start
                   ;              all space before and after
                   ;              this word (word exclude)
                   ;  +number*} : word number from start
                   ;              all space after this
                   ;              word to output with word
                   ;  +number{* : word number from start
                   ;              all space before this
                   ;              word to output with word
                   ;  #         : sum of words to output
                   ;  /word     : number of word to output
                   ;
                   ;[E]
                   ;  with errorlevel output
                   ;  IfErrors:
                   ;     $var=1  no words found
                   ;     $var=2  no such word number
                   ;     $var=3  syntax error (Use: +1,-1,#)
                   ;[]
                   ;  no errorlevel output (default)
                   ;  If some errors found then (result=input string)
                   ;
$var               ;output (result)

例子 (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" ("\...];" not found)

    IfErrors 0 noerrors
    MessageBox MB_OK 'Errorlevel=$R0' IDOK end

    noerrors:
    MessageBox MB_OK 'No errors'

    end:
SectionEnd

E.3.5 WordFind2XS

  • 与 WordFind2X 相同，但区分大小写。

E.3.6 WordFind3X

  • 在两个分隔符之间，查找包含一个字符串的文字。

语法:

${WordFind3X} "[string]" "[delimiter1]" "[center]" "[delimiter2]" "[E][options]" $var

"[string]"         ;[string]
                   ;  input string
"[delimiter1]"     ;[delimiter1]
                   ;  first delimiter
"[center]"         ;[center]
                   ;  center string
"[delimiter2]"     ;[delimiter2]
                   ;  second delimiter
"[E][options]"     ;[options]
                   ;  +number   : word number from start
                   ;  -number   : word number from end
                   ;  +number}} : word number from start all space
                   ;              after this word to output
                   ;  +number{{ : word number from end all space
                   ;              before this word to output
                   ;  +number{} : word number from start
                   ;              all space before and after
                   ;              this word (word exclude)
                   ;  +number*} : word number from start
                   ;              all space after this
                   ;              word to output with word
                   ;  +number{* : word number from start
                   ;              all space before this
                   ;              word to output with word
                   ;  #         : sum of words to output
                   ;  /word     : number of word to output
                   ;
                   ;[E]
                   ;  with errorlevel output
                   ;  IfErrors:
                   ;     $var=1  no words found
                   ;     $var=2  no such word number
                   ;     $var=3  syntax error (Use: +1,-1,#)
                   ;[]
                   ;  no errorlevel output (default)
                   ;  If some errors found then (result=input string)
                   ;
$var               ;output (result)

例子 (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 'Errorlevel=$R0' IDOK end

    noerrors:
    MessageBox MB_OK 'No errors'

    end:
SectionEnd

E.3.7 WordFind3XS

  • 与 WordFind3X 相同，但区分大小写。

E.3.8 WordReplace

  • 替换或删除字符串中的文字。

语法:

${WordReplace} "[string]" "[word1]" "[word2]" "[E][options]" $var

"[string]"         ;[string]
                   ;  input string
"[word1]"          ;[word1]
                   ;  word to replace or delete
"[word2]"          ;[word2]
                   ;  replace with (if empty delete)
"[E][options]"     ;[options]
                   ;  +number  : word number from start
                   ;  -number  : word number from end
                   ;  +number* : word number from start multiple-replace
                   ;  -number* : word number from end multiple-replace
                   ;  +        : replace all results
                   ;  +*       : multiple-replace all results
                   ;  {        : if exists replace all delimiters
                   ;               from left edge
                   ;  }        : if exists replace all delimiters
                   ;               from right edge
                   ;  {}       : if exists replace all delimiters
                   ;               from edges
                   ;  {*       : if exists multiple-replace all
                   ;               delimiters from left edge
                   ;  }*       : if exists multiple-replace all
                   ;               delimiters from right edge
                   ;  {}*      : if exists multiple-replace all
                   ;               delimiters from edges
                   ;
                   ;[E]
                   ;  with errorlevel output
                   ;  IfErrors:
                   ;     $var=1  word to replace not found
                   ;     $var=2  no such word number
                   ;     $var=3  syntax error (Use: +1,-1,+1*,-1*,+,+*,{},{}*)
                   ;[]
                   ;  no errorlevel output (default)
                   ;  If some errors found then (result=input string)
                   ;
$var               ;output (result)

例子 (替换):

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* or +2* or +3* or +4* or +5* or +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" (no such word number "+3")

    IfErrors 0 noerrors
    MessageBox MB_OK 'Errorlevel=$R0' IDOK end

    noerrors:
    MessageBox MB_OK 'No errors'

    end:
SectionEnd

E.3.9 WordReplaceS

  • 与 WordReplace 相同，但区分大小写。

E.3.10 WordAdd

  • 添加来自字符串2的文字到字符串1中。如果它在字符串1中不存在，则添加到字符串1中；如果它在字符串1中存在，则先删除对于文字然后再添加到字符串1中。

语法:

${WordAdd} "[string1]" "[delimiter]" "[E][options]" $var

"[string1]"          ;[string1]
                     ;  string for addition or removing
"[delimiter]"        ;[delimiter]
                     ;  one or several symbols
"[E][options]"       ;[options]
                     ;  +string2 : words to add
                     ;  -string2 : words to delete
                     ;
                     ;[E]
                     ;  with errorlevel output
                     ;  IfErrors:
                     ;     $var=1  delimiter is empty
                     ;     $var=3  syntax error (use: +text,-text)
                     ;[]
                     ;  no errorlevel output (default)
                     ;  If some errors found then (result=input string)
                     ;
$var                 ;output (result)

例子 (添加):

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 "No new words found to add"
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 "No words found to delete"
SectionEnd

例子 (使用错误级别输出):

Section
    ${WordAdd} "C:\io.sys C:\logo.sys" "" "E-C:\logo.sys" $R0
    ; $R0="1" (delimiter is empty "")

    IfErrors 0 noerrors
    MessageBox MB_OK 'Errorlevel=$R0' IDOK end

    noerrors:
    MessageBox MB_OK 'No errors'

    end:
SectionEnd

E.3.11 WordAddS

  • 与 WordAdd 相同，但区分大小写。

E.3.12 WordInsert

  • 在字符串里插入文字。

语法:

${WordInsert} "[string]" "[delimiter]" "[word]" "[E][options]" $var

"[string]"          ;[string]
                    ;  input string
"[delimiter]"       ;[delimiter]
                    ;  one or several symbols
"[word]"            ;[word]
                    ;  word to insert
"[E][options]"      ;[options]
                    ;  +number  : word number from start
                    ;  -number  : word number from end
                    ;
                    ;[E]
                    ;  with errorlevel output
                    ;  IfErrors:
                    ;     $var=1  delimiter is empty
                    ;     $var=2  wrong word number
                    ;     $var=3  syntax error (Use: +1,-1)
                    ;[]
                    ;  no errorlevel output (default)
                    ;  If some errors found then (result=input string)
                    ;
$var                ;output (result)

例子 (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" (wrong word number "+4")

    IfErrors 0 noerrors
    MessageBox MB_OK 'Errorlevel=$R0' IDOK end

    noerrors:
    MessageBox MB_OK 'No errors'

    end:
SectionEnd

E.3.13 WordInsertS

  • 与 WordInsert 相同，但区分大小写。

E.3.14 StrFilter

  • 将字符串转换为大写或小写。
  • 设置过滤符号。

语法:

${StrFilter} "[string]" "[options]" "[symbols1]" "[symbols2]" $var

"[string]"       ;[string]
                 ;  input string
                 ;
"[options]"      ;[+|-][1|2|3|12|23|31][eng|rus]
                 ;  +   : convert string to uppercase
                 ;  -   : convert string to lowercase
                 ;  1   : only Digits
                 ;  2   : only Letters
                 ;  3   : only Special
                 ;  12  : only Digits  + Letters
                 ;  23  : only Letters + Special
                 ;  31  : only Special + Digits
                 ;  eng : English symbols (default)
                 ;  rus : Russian symbols
                 ;
"[symbols1]"     ;[symbols1]
                 ;  symbols include (not changeable)
                 ;
"[symbols2]"     ;[symbols2]
                 ;  symbols exclude
                 ;
$var             ;output (result)

注意:
- Error flag if syntax error
- Same symbol to include & to exclude = to exclude

例子 (大写字母):

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|%"       ;only Letters + |%
SectionEnd

例子 (过滤2):

Section
    ${StrFilter} "123abc 456DEF 7890|%#" "13" "af" "4590" $R0
    ; $R0="123a 6F 78|%#"  ;only Digits + Special + af - 4590
SectionEnd

例子 (过滤3):

Section
    ${StrFilter} "123abc 456DEF 7890|%#" "+12" "b" "def" $R0
    ; $R0="123AbC4567890"  ;only Digits + Letters + b - def
SectionEnd

例子 (过滤4):

Section
    ${StrFilter} "123abc懒� 456DEF沅� 7890|%#" "+12rus" "�" "沐" $R0
    ; $R0="123懒�456�7890"  ;only Digits + Letters + � - 沐
SectionEnd

例子 (英语字母 + 俄语字母):

Section
    ${StrFilter} "123abc懒� 456DEF沅� 7890|%#" "2rus" "" "" $R0
    ; $R0="懒裸溴"        ;only Russian Letters
    ${StrFilter} "123abc懒� 456DEF沅� 7890|%#" "2" "$R0" "" $R0
    ; $R0="abc懒翫EF沅�"  ;only English + Russian Letters
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]"        ; First version
"[Version2]"        ; Second version
$var                ; Result:
                    ;    $var=0  Versions are equal
                    ;    $var=1  Version1 is newer
                    ;    $var=2  Version2 is newer

例子:

Section
    ${VersionCompare} "1.1.1.9" "1.1.1.01" $R0
    ; $R0="1"
SectionEnd

E.3.17 VersionConvert

  • 将版本号转换成数字格式然后再比较。

语法:

${VersionConvert} "[Version]" "[CharList]" $var

"[Version]"         ; Version
                    ;
"[CharList]"        ; List of characters, which will be replaced by numbers
                    ; "abcdefghijklmnopqrstuvwxyz" (default)
                    ;
$var                ; Result: converted version

注意:
- Converted letters are separated with dot
- If character is non-digit and not in list then it will be converted to dot

例子1:

Section
    ${VersionConvert} "9.0a" "" $R0
    ; $R0="9.0.01"

    ${VersionConvert} "9.0c" "" $R1
    ; $R1="9.0.03"

    ${VersionCompare} "$R0" "$R1" $R2
    ; $R2="2"   version2 is newer
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"   version1 is newer
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"   version1 is newer
SectionEnd


更新纪录和发行说明

附录 F: 更新纪录和发行说明

  • 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 Release Candidate 4
    • 更改日志
  • 2.0 Release Candidate 3
    • 更改日志
  • 2.0 Release Candidate 2
    • 更改日志
  • 2.0 Release Candidate 1
    • 发行说明
    • 更改日志
  • 2.0 Beta 4
    • 发行说明
    • 更改日志
  • 2.0 Beta 3
  • 2.0 Beta 2
  • 2.0 Beta 1
  • 2.0 Beta 0
  • 2.0 Alpha 7
  • 2.0 Alpha 6
  • 2.0 Alpha 5
  • 2.0 Alpha 4
  • 2.0 Alpha 3
  • 2.0 Alpha 2
  • 2.0 Alpha 1
  • 2.0 Alpha 0
  • 旧版本


2.44

F.1 2.44

2009年2月21日发行

F.1.1 更改日志

F.1.1.1 主要更改

  • Fixed a bug introduced in 2.43 causing script build issues with some icons (bug #2572035)

F.1.1.2 次要更改

  • Fixed nsDialogs CreateTimer documentation (bug #2595565)
  • Global labels didn't work when declared in unused functions (bug #2593369)


2.43

F.2 2.43

2009年2月5日发行

F.2.1 发行说明

  • A few 次要更改 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.2.2 更改日志

F.2.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.2.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.2.2.3 翻译

  • Added Esperanto
  • Bulgarian fixes

F.2.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.2.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.3 2.42

2008年12月20日发行

F.3.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.3.2 更改日志

F.3.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.3.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.3.2.3 翻译

  • Minor English grammar improvements (bug #2323452)

F.3.2.4 构建系统

  • Full System compatibility with GCC (patch #2193442)


2.41

F.4 2.41

2008年11月20号发行

F.4.1 更改日志

F.4.1.1 次要更改

  • Fixed LangDLL memory leaks for invalid input (bug #1939573)
  • Fixed uninstaller generation on big-endian systems (bug #2166401, bug #2167958)

F.4.1.2 翻译

  • Brazilian Portuguese corrections
  • Consistency fixes for Simple Chinese (patch #2189117)

F.4.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.5 2.40

2008年10月10号发行

F.5.1 更改日志

F.5.1.1 主要更改

  • Service pack macros added to WinVer in version 2.39 now work (bug #2070708, patch #2095363)

F.5.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.5.1.3 翻译

  • Portuguese corrections (bug #2086988)
  • Simplified Chinese corrections (patch #2056906)


2.39

F.6 2.39

2008年8月16日发行

F.6.1 更改日志

F.6.1.1 主要更改

  • Added !define /file and !searchparse (patch #2016254)
  • Added service pack macros (AtLeastServicePack, IsServicePack, AtMostServicePack) to WinVer.nsh (patch #2036802)

F.6.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.7 2.38

2008年7月12日发行

F.7.1 更改日志

F.7.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.7.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.7.1.3 Modern UI

  • Document page leave callback function (bug #1964719)
  • Fixed MUI_FINISHPAGE_CANCEL_ENABLED
  • Fixed wasted variable warnings (bug #1995024)

F.7.1.4 翻译

  • Fixed French 翻译 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.8 2.37

2008年7月12日发行

F.8.1 更改日志

F.8.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.8.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.8.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.8.1.4 翻译

  • Brazilian Portuguese updates
  • Polish updates (patch #1927421)
  • Slovak updates (patch #1939669)
  • Spanish updates

F.8.1.5 构建系统

  • SCons requirement upgraded to 0.98


2.36

F.9 2.36

2008年3月29日发行

F.9.1 发行说明

  • nsDialogs is picking up its pace and offers lots of new macros in this release. Keep the patches and requests coming!

F.9.2 更改日志

F.9.2.1 主要更改

  • nsExec: Support for x64 disabled redirection (RFE #1778973, bug #1889317)

F.9.2.2 Modern UI

  • Added missing MUI_UNFUNCTION_DESCRIPTION_BEGIN and MUI_UNFUNCTION_DESCRIPTION_END
  • Fixed start menu page setting the error flag (bug #1891106)

F.9.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.9.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.9.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.9.2.6 翻译

  • Albanian updates (patch #1919360)
  • French fixes (patch #1916564)
  • Polish updates (patch #1894983)

F.9.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.10 2.35

2008年2月8日发行

F.10.1 更改日志

F.10.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.10.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.10.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.11 2.34

2007年12月24号发行

F.11.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.11.2 更改日志

F.11.2.1 主要更改

  • Modern UI 2: Simpler code, easier to extend and makes use of the faster nsDialogs

F.11.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.11.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.11.2.4 翻译

  • Bulgarian updates
  • German fixes

F.11.2.5 构建系统

  • Fixed build issues on Mac OS (bug #1851365)
  • Fixed endianity issues introduced in version 2.32 (bug #1851365)


2.33

F.12 2.33

2007年11月17号发行

F.12.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.12.2 更改日志

F.12.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.12.2.2 次要更改

  • Modern UI: Allow MUI_LANGDLL_ALLLANGUAGES to be defined after insertion of MUI_LANGUAGE macro

F.12.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.12.2.4 翻译

  • Spanish updates

F.12.2.5 构建系统

  • Separate strip options for win32 and cross-platform binaries


2.32

F.13 2.32

2007年11月9日发行

F.13.1 发行说明

  • Vista PNG icons are now supported without the need for any special tricks.

F.13.2 更改日志

F.13.2.1 主要更改

  • Added support for mismatching installer and uninstaller icons
  • NSIS source code is now hosted on Subversion instead of CVS

F.13.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.13.2.3 实用程序和插件

  • nsDialogs: Added link support

F.13.2.4 翻译

  • Bulgarian corrections
  • Fixed Japanese and Norwegian Nynorsk MUI line breaks (bug #1817289)

F.13.2.5 构建系统

  • Check compiler's -m32 flag before the linker's to avoid gcc segfault


2.31

F.14 2.31

2007年11月9日发行

F.14.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.14.2 更改日志

F.14.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.14.2.2 实用程序和插件

  • MakeNSISW: Fixed command line parsing error (bug #1796053)

F.14.2.3 翻译

  • Korean corrections
  • Persian improvements (patch #1776386)
  • Romanian improvements (patch #1783853)

F.14.2.4 构建系统

  • Fixed build failures with MinGW's GCC 4 (bug #1800834)


2.30

F.15 2.30

2007年8月25日发行

F.15.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.15.2 更改日志

F.15.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.15.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.15.2.3 实用程序和插件

  • Various nsDialogs improvements including RTL support, more macros in nsDialogs.nsh and initial documentation

F.15.2.4 翻译

  • Catalan returns
  • Danish corrections
  • Slovak corrections (patch #1762627)

F.15.2.5 构建系统

  • More HPUX fixes (bug #1755148, bug #1753063, bug #1758873, patch #1758863)
  • Ignore known failing tests by default on POSIX


2.29

F.16 2.29

2007年7月14日发行

F.16.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.16.2 更改日志

F.16.2.1 主要更改

  • Added nsDialogs - a replacement for InstallOptions

F.16.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.16.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.16.2.4 翻译

  • Added International Spanish

F.16.2.5 构建系统

  • Added support for HPUX (patch #1714416)


2.28

F.17 2.28

07年7月14日发行

F.17.1 更改日志

F.17.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.17.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.17.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.17.1.4 翻译

  • Valencian and Catalan are no longer installed (patch #1558822)

F.17.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.18 2.27

2007年5月5日发行

F.18.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.18.2 更改日志

F.18.2.1 主要更改

  • Fixed a bug introduced in 2.26 that made $PROGRAMFILES and $COMMONFILES unavailable in the uninstaller

F.18.2.2 次要更改

  • Disable the X button on InstallOptions pages when CancelEnabled is 0
  • Fixed incomplete MessageBox usage line (bug #1709460)

F.18.2.3 构建系统

  • Added TOOLSET option to allow selection of specific build tools (e.g. scons TOOLSET=mingw)


2.26

F.19 2.26

2007年4月27日发行

F.19.1 发行说明

  • Installation on x64 systems is now fully supported with $PROGRAMFILES64, SetRegView and Library's LIBRARY_X64 option.

F.19.2 更改日志

F.19.2.1 主要更改

  • Added LIBRARY_X64 option for InstallLib and UnInstallLib for installing and uninstalling x64 libraries
  • Added $PROGRAMFILES32, $PROGRAMFILES64, $COMMONFILES32 and $COMMONFILES64

F.19.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.19.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.19.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.19.2.5 翻译

  • Added Afrikaans translation (patch #1699558)
  • French corrections (patch #1676101)
  • German corrections

F.19.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.20 2.25

2007年3月31日发行

F.20.1 更改日志

F.20.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.20.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.20.1.3 新/更改的命令

  • Added bitwise operators support for !define /math (RFE #1669513)
  • __PAGEEX__ contains the page type (patch #1644712)

F.20.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.20.1.5 翻译

  • Fixed Galician language files (bug #1663795)

F.20.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.21 2.24

2007年2月17日发行

F.21.1 更改日志

F.21.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.21.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.21.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.21.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.21.1.5 翻译

  • Added Galician translation (patch #1631765)

F.21.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.22 2.23

2007年1月13号发行

F.22.1 更改日志

F.22.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.22.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.22.1.3 构建系统

  • Fixed build failures on mingw32 (bug #1610773)
  • Fixed build problems with MSTOOLKIT=yes


2.22

F.23 2.22

2006年11月27日发行

F.23.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.23.2 更改日志

F.23.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.23.2.2 新/更改的命令

  • Added `highest` option for RequestExecutionLevel

F.23.2.3 翻译

  • Added Uzbek translation
  • Fixed corruption in Lithuanian (bug #1602673)
  • Minor Breton fixes
  • Slovenian corrections (patch #1590108)

F.23.2.4 构建系统

  • Added Microsoft Visual C++ 2005 Express support
  • SCons requirement upgraded to 0.96.93


2.21

F.24 2.21

06年10月20号发行

F.24.1 更改日志

F.24.1.1 主要更改

  • Added WinVer.nsh for easy Windows version comparisons
  • Upgraded to lzma sdk 4.43 for faster compression

F.24.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.24.1.3 新/更改的命令

  • Added RequestExecutionLevel (RFE #1524709)

F.24.1.4 翻译

  • Added Valencian translation (patch #1558822)
  • Bulgarian corrections
  • Slovenian corrections

F.24.1.5 构建系统

  • SCons requirement upgraded to 0.96.92


2.20

F.25 2.20

2006年9月9日发行

F.25.1 更改日志

F.25.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.25.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.25.1.3 构建系统

  • Fixed NSIS_CONFIG_CONST_DATA_PATH being ignored on POSIX platforms (bug #1515592)


2.19

F.26 2.19

2006年8月6日发行

F.26.1 更改日志

F.26.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.26.1.2 新/更改的命令

  • Made !if compare strings case insensitively, like StrCmp and !ifdef

F.26.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.26.1.4 翻译

  • Added Norwegian Nynorsk translation (patch #1503208)
  • Fixed typos in the French translation (bug #1531874)


2.18

F.27 2.18

2006年8月6日发行

F.27.1 更改日志

F.27.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.27.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.28 2.17

2006年5月19号发行

F.28.1 更改日志

F.28.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.28.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.29 2.16

2006年4月7日发行

F.29.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.29.2 更改日志

F.29.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.29.2.2 新/更改的命令

  • Added /utcdate switch to !define for UTC dates (RFE #1459210)

F.29.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.29.2.4 翻译

  • Added Basque translation
  • Minor Slovenian fixes

F.29.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.30 2.15

2006年3月4日发行

F.30.1 更改日志

F.30.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.30.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.30.1.3 翻译

  • Added proper language identifier for Breton
  • Breton translation mprovements
  • Bulgarian translation mprovements
  • Fixed Czech grammer mistakes (patch #1427189)
  • Fixed Italian typo (patch #1416988)
  • Updated Mongolian

F.30.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.31 2.14

2006年1月24日发行

F.31.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.31.2 更改日志

F.31.2.1 主要更改

  • Fixed a bug that corrupted $TEMP under Windows 9x and NT and caused InitPluginsDir to fail (bug #1412159)

F.31.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.32 2.13

2006年1月21日发行

F.32.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.32.2 更改日志

F.32.2.1 主要更改

  • Default $LANGUAGE value is now based on user's UI language instead of locale (bug #1324734)

F.32.2.2 新/更改的命令

  • Added StrCmpS for case sensitive string comparison (patch #1381929)

F.32.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.32.2.4 实用程序和插件

  • Fixed System plug-in documentation of callback functions (bug #1403608)
  • Fixed System plug-in heap corruption (bug #1403601)

F.32.2.5 翻译

  • Mongolian translation mprovements

F.32.2.6 构建系统

  • Better installation under POSIX with proper ${NSISDIR} detection and appropriate directory paths (/usr/bin, /usr/share/doc, etc.)


2.12

F.33 2.12

2005年12月17号发行

F.33.1 更改日志

F.33.1.1 主要更改

  • Fixed compile-time assertion failure for big uninstallers (bug #1380447)
  • Tutorial enhancements (including bug #1366431)

F.33.1.2 新/更改的命令

  • Added /NONFATAL switch to !include (patch #1372048)

F.33.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.33.1.4 实用程序和插件

  • Added drag & drop support for zip2exe
  • Better drag & drop error handling in MakeNSISw
  • Fixed Math plug-in array issues (bug #1235875)

F.33.1.5 翻译

  • Added browse button Danish translation
  • Breton translation fixes and improvements
  • Fixed finish button Swedish translation

F.33.1.6 构建系统

  • Fixed endianess detection problem on POSIX platforms (bug #1370179)
  • Generated installers use nsis-VERSION-setup.exe template


2.11

F.34 2.11

2005年11月12号发行

F.34.1 发行说明

  • Rebuilding existing installers that use SetOverwrite ifdiff, might falsely overwrite files once

F.34.2 更改日志

F.34.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.34.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.34.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.34.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.34.2.5 翻译

  • Slovenian 翻译 fixes and improvements

F.34.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.35 2.10

2005年10月4日发行

F.35.1 更改日志

F.35.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.35.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.35.1.3 翻译

  • Fixed a bug in Slovenian 翻译 that caused lots of missing language string warnings
  • Fixed typos in Serbian 翻译
  • Fixed typos in Thai 翻译
  • Updated Simple Chinese 翻译

F.35.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.36 2.09

2005年8月26日发行

F.36.1 更改日志

F.36.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.36.1.2 新/更改的命令

  • Var can now be used in sections and functions, but only with the /GLOBAL flag

F.36.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.36.1.4 翻译

  • Renamed Malaysian to Malay
  • Update Thai 翻译 to the latest version
  • Updated Kurdish MUI 翻译 to the latest version

F.36.1.5 构建系统

  • Fixed a number of build problems on POSIX platforms which caused plug-ins to malfunction and installers to crash


2.08

F.37 2.08

2005年7月23日发行

F.37.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.37.2 更改日志

F.37.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.37.2.2 次要更改

  • Added Bosnian and Kurdish 翻译
  • 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 翻译
  • 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.37.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.38 2.07

2005年6月20号发行

F.38.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.38.2 更改日志

F.38.2.1 主要更改

  • Added /SOLID switch for SetCompressor
  • New 构建系统 (see appendix G)
  • Stubs (exeheads) are no longer compiled into makensis.exe, but kept in the Stubs folder

F.38.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.38.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.38.2.4 Include Files

  • More messages in WinMessages.nsh (Shengalts Aleksander)
  • Some more useful macros in Colors.nsh (Joel)

F.38.2.5 实用程序和插件

  • Fixed halibut segfaults on PowerPC (patch #1180886)
  • Math: Fixed memory leak (brainsucker)
  • zip2exe: upgraded to zlib 1.2.2

F.38.2.6 翻译

  • Added Malaysian 翻译 (Azwa)
  • Added Welsh 翻译 (Rhoslyn Prys)
  • Fixed Breton NLF file (credits weren't commented)
  • Fixed duplicate accelerator in French 翻译 (bug #1168652)
  • Improved French 翻译 (bug #1220277)
  • Updated Russian 翻译 (Dmitry)
  • Updated 翻译 credits (patch #1223362)


2.06

F.39 2.06

2005年3月19号发行

F.39.1 更改日志

F.39.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.39.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.39.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.39.1.4 实用程序和插件

  • AdvSplash: Fixed a small memory leak (Thanks Takhir)
  • StartMenu: Added support for SetCtlColors (RFE #711900)


2.05

F.40 2.05

2005年2月4日发行

F.40.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.40.2 更改日志

F.40.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.40.2.2 次要更改

  • Added Breton 翻译
  • 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.41 2.04

2005年1月7日发行

F.41.1 更改日志

F.41.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.41.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.42 2.03

2004年12月3号发行

F.42.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.42.2 更改日志

F.42.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.42.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.42.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.43 2.02

2004年10月23号发行

F.43.1 更改日志

F.43.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.43.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.43.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.43.1.4 实用程序和插件

  • Banner: Fixed some cases where the banner would not show on the foreground


2.01

F.44 2.01

2004年9月24日发行

F.44.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.44.2 更改日志

F.44.2.1 主要更改

  • Compiler (makensis) supports POSIX platforms (Linux, *BSD, Mac OS X, etc.)
  • New system for DLL/TLB library setup

F.44.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.44.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.44.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.45 2.0

2004年2月7日发行

F.45.1 发行说明

  • Finnish, Bulgarian and Thai language files are outdated and do not contain all needed 翻译

F.45.2 更改日志

F.45.2.1 Changes from 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.45.2.2 Changes from 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.46 2.0 Release Candidate 4

2004年2月2日发行

F.46.1 更改日志

F.46.1.1 主要更改

  • Fixed MBCS mishandling in exehead, InstallOptions and nsExec

F.46.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.46.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.47 2.0 Release Candidate 3

2004年1月26日发行

F.47.1 更改日志

F.47.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.47.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.48 2.0 Release Candidate 2

2004年1月5日发行

F.48.1 更改日志

F.48.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.48.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.49 2.0 Release Candidate 1

2003年12月27日发行

F.49.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.49.2 更改日志

F.49.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.49.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.50 2.0 Beta 4

2003年11月19号发行

F.50.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.50.2 更改日志

F.50.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.50.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.50.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.50.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.51 2.0 Beta 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.52 2.0 Beta 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.53 2.0 Beta 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.54 2.0 Beta 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.55 2.0 Alpha 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.56 2.0 Alpha 6

2002年8月10日发行

  • Fixed two bugs with the plug-in mechanism
  • Fixed infinite loop bug


2.0 Alpha 5

F.57 2.0 Alpha 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.58 2.0 Alpha 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.59 2.0 Alpha 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.60 2.0 Alpha 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.61 2.0 Alpha 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.62 2.0 Alpha 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.63 旧版本

NSIS 1.x 版本历史


构建 NSIS

附录 G: 构建 NSIS

NSIS 从版本 2.07 起引进了一个新的构建系统，基于 SCons。新的构建系统可以一次性的构建整 NSIS 程序包而不再需要一个工程一个工程的去构建。它使你可以进行多个同步的工作，在 Windows 和 POSIX 上安装而不需要安装程序并方便的带调试符号编辑。

  • 常规构建
  • 在 Windows 上构建
  • 在 POSIX 上构建
  • 每日构建


常规构建

G.1 常规构建

源代码和各自 NSIS 发行版本 是分开提供的，你可以在 SVN 找到。

要构建 NSIS 首先要安装 Python 和 SCons 。目前，支持的 SCons 版本是 0.96.93。任何高于 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


在 Windows 上构建

G.2 在 Windows 上构建

SCons 将会自动检测并使用 Microsoft Visual C++ 。如果你在寻找免费的编译器来编译 NSIS, 我们推荐 Microsoft Visual C++ 2005 Express Edition。

当使用 Microsoft Visual C++ Toolkit 2003 时, 添加 MSTOOLKIT=yes 到构建命令行:

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++ 可能也可以编译，但并没有经过测试。

将用户帮助文档编译成 CHM 格式文件， hhc.exe 必须存在于相应的路径中。(hhc.exe是 HTML Help Workshop 的组件。)

要创建 NSIS 菜单, 安装 wxWidgets 2.8, 创建一个包含 wxWidgets 安装目录路径名为 WXWIN 的环境变量, 运行 Contrib\NSIS Menu\wx\wxbuild.bat 然后像往常一样构建 NSIS。

对于 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, 和 Source\exehead\fileform.h 传递给 scons 的选项必须是相同的。每日构建版本和压缩发行版本都是使用默认选项构建的。

目前, 使用 GCC 不能创建 System 插件的 Call, Get 和 Debug 函数，只能使用 MSVC 。当使用 GCC 构建时，要么下载一个版本的 MSVC-compiled，要么写一个你需要调用函数的插件。你可以使用以下的标记跳过构建 System 插件:

scons SKIPPLUGINS=System

要创建一个对应版本的 NSIS 菜单,安装 wxWidgets 2.8 然后像往常一样构建 NSIS。 wx-config 必须存在于相应的路径中。


每日构建

G.4 每日构建

在 Windows 环境下没必要自己动手去构建 NSIS 最新的 CVS 版本，你可以使用 每日构建版本 。每日构建版本每天都会基于 SVN 上的最新源代码自动生成。前尚不提供非 Windows 平台下的每日构建版本。


致谢名单

附录 H: 致谢名单

  • 程序员
  • 资源设计师
  • 翻译人员
  • 文档编写者


程序员

H.1 程序员

Justin Frankel aka 0xDEADBEEF

  • 创建 NSIS

Amir "make me stop" Szekely aka KiCHiK

  • 多语言 NSIS
  • RTF 许可协议文本
  • 新的页面系统
  • 图标和位图对完整色彩的支持
  • 标志图像
  • 自定义界面 UI
  • 一个支持 zlib 和 bzip2 的 makensis.exe

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

  • 新的插件系统
  • "Copy to clipboard" context menu for the Details window
  • License text initial focus

Ramon aka Ramon18

  • 版本信息资源命令
  • 可声明的用户变量
  • 许多界面的修正
  • InstallOptions 改进

nnop@newmail.ru

Ryan Geiss

Andras Varga

Drew Davidson

Peter Windridge

Yaroslav Faybishenko

Jeff Doozan

  • NSIS 2 新的 TreeView

Nike (nike@sendmail.ru)

  • Halibut 对 HTML 帮助的支持

Diego Pedroso aka deguix

  • 新的 NSIS Wiki 百科全书

Shengalts Aleksander aka Instructor

Stuart Welch aka Afrow UK

David Weiss aka Comm@nder21

Anders Kjersem


资源设计师

H.2 资源设计师

Nikos Adamamas

  • 新的现代图标

Jan T. Sott / whyEye.org

  • 许多的图标和选择框标志


翻译人员

H.3 翻译人员

阿尔巴尼亚语[Albanian] - Besnik Bleta

南非荷兰语[Afrikaans] - Friedel Wolff

阿拉伯语[Arabic] - asdfuae, Rami Kattan

巴斯克语[Basque] - Iñaki San Vicente

白俄罗斯语[Belarusian] - Sitnikov Vjacheslav

波斯尼亚语[Bosnian] - Salih CAVKIC

布里多尼语[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

世界语[Esperanto] - Felipe Castro

爱沙尼亚语[Estonian] - izzo

波斯语[Farsi] - Masoud Alinaqian, FzerorubigD, Elnaz Sarbar

芬兰语[Finnish] - AKX, Eclipser

法语[French] - veekee, Sebastien Delahaye, Jerome Charaoui

加利西亚语[Galician] - Ramon Flores

德语[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)

冰岛语[Icelandic] - Gretar Orri Kristinsson

印度尼西亚语[Indonesian] - ariel825010106

意大利语[Italian] - Orfanik, sanface, Alessandro Staltari, Lorenzo Bevilacqua

日语[Japanese] - Dnanako, Takahiro Yoshimura

朝鲜语[Korean] - dTomoyo, linak, koder

库尔德语[Kurdish] - Erdal Ronahi

拉脱维亚语[Latvian] - Valdis Griíis, Kristaps Meòìelis

立陶宛语[Lithuanian] - NorCis, Vytautas Krivickas, Danielius Scepanskis

卢森堡语[Luxembourgish] - Jo Hoeser

马其顿语[Macedonian] - Sasko Zdravkin

蒙古语[Mongolian] - Bayarsaikhan Enkhtaivan

挪威语[Norwegian] - Jonas Christoffer Lindstrom, Jan Ivar Beddari

挪威语(尼诺斯克语)[Norwegian Nynorsk] - Vebjørn Sture

波兰语[Polish] - Piotr Murawski, Rafa³ Lampe, cube, SYSTEMsoft Group

葡萄牙语[Portuguese] - DragonSoull, Dre', Ramon

巴西葡萄牙语[Portuguese Brasil] - Layout do Brasil, deguix

罗马尼亚语[Romanian] - Sorin Sbarnea, Cristian Pirvu, George Radu, Vlad Rusu

俄语[Russian] - Sergey `Timon` Kusnetsov, Nik Medved, Scam, THRaSH, Dmitry Yerokhin

塞尔维亚语[Serbian] - Srdjan Obucina

塞尔维亚语(拉丁文)[Serbian Latin] - Srdjan Obucina, Vladan Obradovic

斯洛伐克语[Slovak] - trace, Kypec, Marián Hikaník

斯洛文尼亚语[Slovenian] - Janez Dolinar, Martin Sebotnjak

西班牙语[Spanish] - MoNKi, Lobo Lunar, Darwin Rodrigo Toledo Cáceres

瑞典语[Swedish] - Peter Gustafsson, Magnus Bonnevier, Rickard Angbratt

泰国语[Thai] - SoKoOLz, TuW@nNu (asdfuae)

简体和繁体中文 [Traditional & Simplified Chinese] - Kii Ali

土耳其语[Turkish] - Bertan Kodamanoglu, Cagatay Dilsiz, Fatih BOY

乌克兰语[Ukrainian] - Yuri Holubow, Nash-Soft

乌兹别克语[Uzbek] - Emil Garipov (emil.garipov@gmail.com)

巴伦西亚语[Valencian] - Bernardo Arlandis Mañó

威尔士语[Welsh] - Rhoslyn Prys, Meddal.com


文档编写者

H.4 文档编写者

Sebastian Armbrust aka flizebogen

  • 教程


许可协议

附录 I: 许可协议

  • 版权
  • 适用许可协议
  • zlib/libpng 许可协议
  • bzip2 许可协议
  • 通用公共许可证 版本1.0
  • LZMA 压缩模块特殊例外声明


版权

I.1 版权

版权所有 (C) 1995-2009 贡献者

More detailed copyright information can be found in the individual source code files.


适用许可协议

I.2 适用许可协议

  • All NSIS source code, plug-ins, documentation, examples, header files and graphics, with the exception of the compression modules and where otherwise noted, are licensed under the zlib/libpng license.
  • The zlib compression module for NSIS is licensed under the zlib/libpng license.
  • The bzip2 compression module for NSIS is licensed under the bzip2 license.
  • The lzma compression module for NSIS is licensed under the Common Public License version 1.0.


zlib/libpng 许可协议

I.3 zlib/libpng 许可协议

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.


bzip2 许可协议

I.4 bzip2 许可协议

Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met:

  1. Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer.
  2. 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.
  3. Altered source versions must be plainly marked as such, and must not be misrepresented as being the original software.
  4. The name of the author may not be used to endorse or promote products derived from this software without specific prior written permission.

THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.

Julian Seward, Cambridge, UK.

jseward@acm.org


通用公共许可证 版本1.0

I.5 通用公共许可证 版本1.0

THE ACCOMPANYING PROGRAM IS PROVIDED UNDER THE TERMS OF THIS COMMON PUBLIC LICENSE ("AGREEMENT"). ANY USE, REPRODUCTION OR DISTRIBUTION OF THE PROGRAM CONSTITUTES RECIPIENT'S ACCEPTANCE OF THIS AGREEMENT.

1. DEFINITIONS

"Contribution" means:

a) in the case of the initial Contributor, the initial code and documentation distributed under this Agreement, and b) in the case of each subsequent Contributor:

i) changes to the Program, and

ii) additions to the Program;

where such changes and/or additions to the Program originate from and are distributed by that particular Contributor. A Contribution 'originates' from a Contributor if it was added to the Program by such Contributor itself or anyone acting on such Contributor's behalf. Contributions do not include additions to the Program which: (i) are separate modules of software distributed in conjunction with the Program under their own license agreement, and (ii) are not derivative works of the Program.

"Contributor" means any person or entity that distributes the Program.

"Licensed Patents " mean patent claims licensable by a Contributor which are necessarily infringed by the use or sale of its Contribution alone or when combined with the Program.

"Program" means the Contributions distributed in accordance with this Agreement.

"Recipient" means anyone who receives the Program under this Agreement, including all Contributors.

2. GRANT OF RIGHTS

a) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free copyright license to reproduce, prepare derivative works of, publicly display, publicly perform, distribute and sublicense the Contribution of such Contributor, if any, and such derivative works, in source code and object code form.

b) Subject to the terms of this Agreement, each Contributor hereby grants Recipient a non-exclusive, worldwide, royalty-free patent license under Licensed Patents to make, use, sell, offer to sell, import and otherwise transfer the Contribution of such Contributor, if any, in source code and object code form. This patent license shall apply to the combination of the Contribution and the Program if, at the time the Contribution is added by the Contributor, such addition of the Contribution causes such combination to be covered by the Licensed Patents. The patent license shall not apply to any other combinations which include the Contribution. No hardware per se is licensed hereunder.

c) Recipient understands that although each Contributor grants the licenses to its Contributions set forth herein, no assurances are provided by any Contributor that the Program does not infringe the patent or other intellectual property rights of any other entity. Each Contributor disclaims any liability to Recipient for claims brought by any other entity based on infringement of intellectual property rights or otherwise. As a condition to exercising the rights and licenses granted hereunder, each Recipient hereby assumes sole responsibility to secure any other intellectual property rights needed, if any. For example, if a third party patent license is required to allow Recipient to distribute the Program, it is Recipient's responsibility to acquire that license before distributing the Program.

d) Each Contributor represents that to its knowledge it has sufficient copyright rights in its Contribution, if any, to grant the copyright license set forth in this Agreement.

3. REQUIREMENTS

A Contributor may choose to distribute the Program in object code form under its own license agreement, provided that:

a) it complies with the terms and conditions of this Agreement; and

b) its license agreement:

i) effectively disclaims on behalf of all Contributors all warranties and conditions, express and implied, including warranties or conditions of title and non-infringement, and implied warranties or conditions of merchantability and fitness for a particular purpose;

ii) effectively excludes on behalf of all Contributors all liability for damages, including direct, indirect, special, incidental and consequential damages, such as lost profits;

iii) states that any provisions which differ from this Agreement are offered by that Contributor alone and not by any other party; and

iv) states that source code for the Program is available from such Contributor, and informs licensees how to obtain it in a reasonable manner on or through a medium customarily used for software exchange.

When the Program is made available in source code form:

a) it must be made available under this Agreement; and

b) a copy of this Agreement must be included with each copy of the Program.

Contributors may not remove or alter any copyright notices contained within the Program.

Each Contributor must identify itself as the originator of its Contribution, if any, in a manner that reasonably allows subsequent Recipients to identify the originator of the Contribution.

4. COMMERCIAL DISTRIBUTION

Commercial distributors of software may accept certain responsibilities with respect to end users, business partners and the like. While this license is intended to facilitate the commercial use of the Program, the Contributor who includes the Program in a commercial product offering should do so in a manner which does not create potential liability for other Contributors. Therefore, if a Contributor includes the Program in a commercial product offering, such Contributor ("Commercial Contributor") hereby agrees to defend and indemnify every other Contributor ("Indemnified Contributor") against any losses, damages and costs (collectively "Losses") arising from claims, lawsuits and other legal actions brought by a third party against the Indemnified Contributor to the extent caused by the acts or omissions of such Commercial Contributor in connection with its distribution of the Program in a commercial product offering. The obligations in this section do not apply to any claims or Losses relating to any actual or alleged intellectual property infringement. In order to qualify, an Indemnified Contributor must: a) promptly notify the Commercial Contributor in writing of such claim, and b) allow the Commercial Contributor to control, and cooperate with the Commercial Contributor in, the defense and any related settlement negotiations. The Indemnified Contributor may participate in any such claim at its own expense.

For example, a Contributor might include the Program in a commercial product offering, Product X. That Contributor is then a Commercial Contributor. If that Commercial Contributor then makes performance claims, or offers warranties related to Product X, those performance claims and warranties are such Commercial Contributor's responsibility alone. Under this section, the Commercial Contributor would have to defend claims against the other Contributors related to those performance claims and warranties, and if a court requires any other Contributor to pay any damages as a result, the Commercial Contributor must pay those damages.

5. NO WARRANTY

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, THE PROGRAM IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED INCLUDING, WITHOUT LIMITATION, ANY WARRANTIES OR CONDITIONS OF TITLE, NON-INFRINGEMENT, MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. Each Recipient is solely responsible for determining the appropriateness of using and distributing the Program and assumes all risks associated with its exercise of rights under this Agreement, including but not limited to the risks and costs of program errors, compliance with applicable laws, damage to or loss of data, programs or equipment, and unavailability or interruption of operations.

6. DISCLAIMER OF LIABILITY

EXCEPT AS EXPRESSLY SET FORTH IN THIS AGREEMENT, NEITHER RECIPIENT NOR ANY CONTRIBUTORS SHALL HAVE ANY LIABILITY FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING WITHOUT LIMITATION LOST PROFITS), HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OR DISTRIBUTION OF THE PROGRAM OR THE EXERCISE OF ANY RIGHTS GRANTED HEREUNDER, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGES.

7. GENERAL

If any provision of this Agreement is invalid or unenforceable under applicable law, it shall not affect the validity or enforceability of the remainder of the terms of this Agreement, and without further action by the parties hereto, such provision shall be reformed to the minimum extent necessary to make such provision valid and enforceable.

If Recipient institutes patent litigation against a Contributor with respect to a patent applicable to software (including a cross-claim or counterclaim in a lawsuit), then any patent licenses granted by that Contributor to such Recipient under this Agreement shall terminate as of the date such litigation is filed. In addition, if Recipient institutes patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Program itself (excluding combinations of the Program with other software or hardware) infringes such Recipient's patent(s), then such Recipient's rights granted under Section 2(b) shall terminate as of the date such litigation is filed.

All Recipient's rights under this Agreement shall terminate if it fails to comply with any of the material terms or conditions of this Agreement and does not cure such failure in a reasonable period of time after becoming aware of such noncompliance. If all Recipient's rights under this Agreement terminate, Recipient agrees to cease use and distribution of the Program as soon as reasonably practicable. However, Recipient's obligations under this Agreement and any licenses granted by Recipient relating to the Program shall continue and survive.

Everyone is permitted to copy and distribute copies of this Agreement, but in order to avoid inconsistency the Agreement is copyrighted and may only be modified in the following manner. The Agreement Steward reserves the right to publish new versions (including revisions) of this Agreement from time to time. No one other than the Agreement Steward has the right to modify this Agreement. IBM is the initial Agreement Steward. IBM may assign the responsibility to serve as the Agreement Steward to a suitable separate entity. Each new version of the Agreement will be given a distinguishing version number. The Program (including Contributions) may always be distributed subject to the version of the Agreement under which it was received. In addition, after a new version of the Agreement is published, Contributor may elect to distribute the Program (including its Contributions) under the new version. Except as expressly stated in Sections 2(a) and 2(b) above, Recipient receives no rights or licenses to the intellectual property of any Contributor under this Agreement, whether expressly, by implication, estoppel or otherwise. All rights in the Program not expressly granted under this Agreement are reserved.

This Agreement is governed by the laws of the State of New York and the intellectual property laws of the United States of America. No party to this Agreement will bring a legal action under this Agreement more than one year after the cause of action arose. Each party waives its rights to a jury trial in any resulting litigation.


LZMA 压缩模块特殊例外声明

I.6 LZMA 压缩模块特殊例外声明

Igor Pavlov and Amir Szekely, the authors of the LZMA compression module for NSIS, expressly permit you to statically or dynamically link your code (or bind by name) to the files from the LZMA compression module for NSIS without subjecting your linked code to the terms of the Common Public license version 1.0. Any modifications or additions to files from the LZMA compression module for NSIS, however, are subject to the terms of the Common Public License version 1.0.


简体中文用户手册说明

附录 J: 简体中文用户手册说明

NSIS 2.24 简体中文用户手册的翻译源自英文原版 NSIS 2.24 用户手册，手册中 NSIS 2.22 至 2.37 部分全部翻译内容均由 zhfi、X-Star 完成；手册中 NSIS 2.22 至 2.14 部分全部翻译内容均由 Engine 完成；手册中 NSIS 2.14 及先前版本的全部翻译内容均由蓝色网际(和汉化新世纪论坛上的一些网友)完成。此次更新补充了2.44的最新内容，对原版索引关键字做了整理，让你更容易找到实际需要的知识信息，需要说明的是调整时并没有删节任何原版文档信息。

简体中文手册更新于：2009年4月28日

  • 致谢
  • NSIS 交流
  • NSIS 相关网站
  • 翻译反馈
  • 免责声明


致谢

J.1 致谢

在制作 NSIS 2.44 简体中文手册时，参考了以下几位的翻译 在此表示感谢:

蓝色网际

  • 2.14 简体中文手册

Engine

  • 2.22 简体中文手册

Zhfi

  • 2.37 简体中文手册

感谢以下朋友在制作简体中文手册时，对我的帮助:

  • Zhfi
  • Engine
  • Ansifa
  • 似水年华

特别鸣谢:

  • 汉化新世纪论坛

http://bbs.hanzify.org

  • 完美者精品论坛

http://bbs.wmzhe.com

  • 梦想吧技术论坛

http://www.dreams8.com


NSIS 交流

J.2 NSIS 交流

相关论坛:

  • NSIS 官方论坛
  • 汉化新世纪论坛之 『安装与补丁』 版块
  • 梦想吧技术论坛之 『NSIS 专栏』 版块

QQ 交流群:

  • NSIS 新手1号群: 18163599 (已满)
  • NSIS 新手2号群: 59445212


NSIS 相关网站

J.3 NSIS 相关网站

  • NSIS 官方网站
  • NSIS 官方论坛
  • NSIS 开发中心
  • NSIS 插件页面
  • NSIS 所有版本下载地址
  • Unicode NSIS 开发网站


翻译反馈

J.4 翻译反馈

本人水平有限，难免存在翻译不当之处，还望大家及时指正。

QQ : 43461163

E-mail : 43461163#qq.com (请将 # 替换成 @)


免责声明

J.5 免责声明

本人不承担任何由于用户使用不当或第三方发布行为而造成的损失。

如需转载或重新打包本手册，无需通知本人，但请在必要位置注明手册出处。

X-Star

QQ : 43461163

E-mail : 43461163#qq.com (请将 # 替换成 @)


Index

这是最后一页，请返回 上一页 | 或 目录

NSIS 2.44 简体中文用户手册

NSIS 2.24 简体中文用户手册的翻译源自英文原版 NSIS 2.24 用户手册，手册中 NSIS 2.22 至 2.37 部分全部翻译内容均由 zhfi、X-Star 完成；手册中 NSIS 2.22 至 2.14 部分全部翻译内容均由 Engine 完成；手册中 NSIS 2.14 及先前版本的全部翻译内容均由蓝色网际(和汉化新世纪论坛上的一些网友)完成。此次更新补充了2.44的最新内容，对原版索引关键字做了整理，让你更容易找到实际需要的知识信息，需要说明的是调整时并没有删节任何原版文档信息。

简体中文手册更新于：2009年4月28日

这是最后一页，请返回 上一页 | 或 目录