本文列出了 NSIS 支持的完整指令,以供查阅。
基本指令
NSIS 用于脚本的这些指令稍微的近似于 PHP 和汇编。他们没有真正的高级语言结构,但是他们的指令(对于绝大部分)却是高级的,并且你可以很容易的掌握(比如你不用担心字串的连接等等)。NSIS 为你提供了 25 个寄存器(20 个常规用途,5 个特殊用途),和一个堆栈。
Delete
1 | [/REBOOTOK] 文件 |
从目标系统删除文件(可以是文件或通配符,但必须指定一个完整的路径)。如果指定了“/REBOOTOK”并且该文件当前不可删除,则会在系统重启时删除该文件 – 如果该文件要在系统重启时删除,你还要设置一个重启的位标计。如果找到的文件不能被删除则会置一个错误位标计。但该错误位标计不是从尝试删除一个不存在的文件设置的。
Exec
命令执行一个指定的程序并且立即继续安装。注意指定的文件必须存在于目标系统而不是编译的系统。$OUTDIR 用于指定工作路径。如果该命令不能被运行则会置一个错误位标计。注意,如果该命令包含有空格,你要用引号来把他们包括起来。例如:Exec ‘“$INSTDIR\command.exe” 参数’。如果你不用引号括起来则在 Windwos 9X 下不正常或丢失参数。
ExecShell
1 | 动作 命令 [参数] [SW_SHOWNORMAL | SW_SHOWMAXIMIZED | SW_SHOWMINIMIZED] |
使用 Windows 的外壳关联来执行一个指定的程序。注意“动作”通常为“open”、“print”等等,也可以是一个空字串来使用默认动作。参数和显示类型是可选项。$OUTDIR 用于指定工作路径。如果该处理不能被运行则会置一个错误位标计。
ExecWait
1 | 命令 [用户变量(退出代码)] |
执行一个指定的程序并且等待运行处理结束。更多信息请查看 Exec。如果没有用户输出变量 ExecWait 会置一个错误位标计当程序执行返回一个非零错误代码,或者当产生错误时。如果指定了输出变量,ExecWait 会把变量置为退出代码(并且仅当产生一个错误时置一个错误位标计;如果产生一个错误则该用户变量的内容为未指定)。注意,如果该命令包含有空格,你要用引号来把他们包括起来。例如:Exec ‘“$INSTDIR\command.exe” 参数’。如果你不用引号括起来则在 Windwos 9X 下不正常或丢失参数。
File
1 | [/nonfatal] [/a] ([/r] (文件|通配符) [...] | /oname=输出路径\文件名 输入路径\文件名) |
释放文件到当前输出路径($OUTDIR).
注意输出文件名是 $OUTDIR\文件名。
如果使用了 /oname=X 开关,则输出名变为 $OUTDIR\X。当使用了 /oname= 开关时只能指定一个文件,且文件名可以使用变量(或完整路径如 $SYSDIR\whatever.dll)。
支持通配符。
如果使用了 /r 开关,文件和目录将会被递归添加。如果没有尾随通配符(如 File /r C:\whatever\mydir),则整个 mydir 目录树将会被添加到 $OUTDIR。如果要使它放到 $OUTDIR 请使用 File /r C:\whatever\mydir*.*。
如果使用了 /a 开关,被添加的文件的属性将会被保护。
如果覆盖模式被设定为 “try” 并且文件未被覆盖,那么 File 命令将会置一个错误位标计,或者如果覆盖模式被设定为 “on” 并且文件未被覆盖并且用户选择了忽略,那么也会被置一个错误位标计。
如果使用了 /nonfatal 开关,当文件未找到时使用警告来代替错误。
Rename
1 | [/REBOOTOK] 源文件 目标文件 |
把源文件重命名为目标文件。你可以用它来把用户系统里的任何地方的一个文件移动到用户系统里的任何地方,你也可以在一些驱动器上把一个目录移动到某些地方。目标文件必须为不存在否则移动失败(除非你使用了 /REBOOTOK)。如果指定了 /REBOOTOK,并且文件当时不能移动(比如,目标文件已存在),则该文件在系统重启后才被移动到目标。如果文件在重启后才被移动,会置一个重启的位标计。当文件不能被重命名时(并且没有使用 /REBOOTOK)或者原文件不存在时,会置一个错误位标计。
如果没有指定绝对路径则使用当前路径代替。当前路径可以使用 SetOutPath 指令来设置。如果你没有使用 SetOutPath 那么当前路径为 $EXEDIR。
ReserveFile
1 | [/nonfatal] [/r] 文件 [文件...] |
保存一个文件在最后使用的数据区块。之所以要把在脚本中使用到的文件,这样添加是因为要在 .onInit 函数里使用,例如使得安装程序载入变慢。这时候这个命令就非常有用了,它可以把文件包含在数据区块的顶端而不是让 NSIS 从已压缩的数据区块从头搜到脚来找这个文件,这样可以加快安装程序载入速度。
相关参数说明请查看 File。
RMDir
1 | [/r|/REBOOTOK] 目录名 |
删除指定的目录(完整的路径)。没有 /r 参数时只有在目录为空时才会被删除。如果指定了 /r,则目录会被递归删除,所以在指定目录下的所有文件和目录均被删除。如果指定了 /REBOOTOK,并且目录不能被覆盖,则当系统重启的时候会被删除 —— 如果目录需要在重启时被删除,会设一个重启的位标计。当目录不能被删除时会置一个错误的位标计。
SetOutPath
输出路径设置输出路径($OUTDIR)且当路径不存在时创建(需要时递归)。必须为全路径名,通常使用 $INSTDIR。
注册表、INI 文件指令
在下面所有的注册表指令里使用一个空字串(“”)来作为某个子健默认项,该默认项在注册表编辑器里显示为“(默认)”。
DeleteINISec
1 | INI_文件名 区段名 |
从“INI_文件名”里删除整个区段 [区段名]。如果该区段不能被删除,会置一个错误的位标计。但是如果该区段找不到时则不会置错误位标计。
DeleteINIStr
1 | INI_文件名 区段名 字串名 |
从“INI_文件名”里的 [区段名] 区段删除“字串名”字串。如果该字串不能被删除,会置一个错误的位标计。但是如果该字串找不到时则不会置错误位标计。
DeleteRegKey
1 | [/ifempty] 根键 子键 |
删除一个注册表键。如果指定了 /ifempty,则该注册表键仅当它无子键时才会被删除(否则,整个注册表键将被删除)。有效的根键值在后面的 WriteRegStr 列出。如果该键不能被删除(或如果它不存在)则会置一个错误的位标计。
DeleteRegValue
1 | 根键 子键 键名 |
删除一个注册表键值。有效的根键值在后面的 WriteRegStr 列出。如果该键值不能被删除(或如果它不存在)则会置一个错误的位标计。
EnumRegKey
1 | 用户变量(输出) 根键 子键 索引 |
把用户变量 $x 设为“根键\子键”第“索引”号注册表键名。有效的根键值在后面的 WriteRegStr 列出。当指定的“根键\子键”没有任何键时会返回一个空字串,当产生一个错误时会返回空字串并置一个错误位标计。
EnumRegValue
1 | 用户变量(输出) 根键 子键 索引 |
把用户变量 $x 设为“根键\子键”第“索引”号注册表键值。有效的根键值在后面的 WriteRegStr 列出。当指定的“根键\子键”没有任何键值时会返回一个空字串,当产生一个错误时会返回空字串并置一个错误位标计。
ExpandEnvStrings
1 | 用户变量(输出) 字串 |
把“字串”里的环境变量扩展到用户变量 $x。如果错误,该变量会被设为空值并置一个错误位标计。
FlushINI
1 | INI_文件名 |
刷新 INI 文件缓冲。Windows 9x 会保持 INI 文件在内存里。该命令强制更改立即写入磁盘。当你自己编辑一个 INI 文件的时候可以使用它,删除、移动、复制,直到你使用 WriteINIStr、DeleteINISec 或 DeleteINStr 来更改它。
ReadEnvStr
1 | 用户变量(输出) 名称 |
从环境字串“名称”读取值并把值赋给用户变量 $x。如果读取字串时有错误发生,该用户变量被设为空,并置一个错误位标计。
ReadINIStr
1 | 用户变量(输出) INI_文件名 区段名 项名 |
从“INI_文件名”的 [区段名] 区段读取“项名”的值并把该值赋给用户变量 $x。如果该项未找到时会置一个错误位标计且该用户变量被赋为空值。
ReadRegDWORD
1 | 用户变量(输出) 根键 子键 项 |
从注册表读取一个 32 位 DWORD 到用户变量 $x。有效的根键值在后面的 WriteRegStr 列出。如果 DWORD 不存在时会置一个错误位标计并把 $x 设为空字串。如果该值存在但不是 DWORD,则会作为字串类型读取并置一个错误位标计。
ReadRegStr
1 | 用户变量(输出) 根键 子键 项 |
从注册表读取一个字串值到用户变量 $x。有效的根键值在后面的 WriteRegStr 列出。如果字串不存在时会置一个错误位标计并把 $x 设为空字串。如果该值存在但是 DWORD,则会转换为字串类型并置一个错误位标计。
WriteINIStr
1 | INI_文件名 区段名 项名 值 |
把“项名”=“值”写入“INI_文件名”的 [区段名] 区段。如果 INI 文件不能写入则置一个错误的位标计。
WriteRegBin
1 | 根键 子键 项 值数据 |
该命令将会写一个区块的二进制数据到注册表。有效的根键值在后面的 WriteRegStr 列出。值数据为十六进制格式(如 DEADBEEF01223211151)。如果该二进制数据不能写入注册表则置一个错误的位标计。如果注册表键不存在则会自动创建。“值数据”不能使用变量。
WriteRegDWORD
1 | 根键 子键 项 值 |
该命令写一个 DWORD(32 位整数)到注册表(可以使用变量)。有效的根键值在后面的 WriteRegStr 列出。如果该 DWORD 不能写入注册表则置一个错误的位标计。如果注册表键不存在则会自动创建。
4.9.2.16 WriteRegStr
1 | 根键 子键 项 值 |
把字串写入注册表。详细信息请查看 WriteRegExpandStr。
4.9.2.17 WriteRegExpandStr
1 | 根键 子键 项 值 |
把字串写入注册表。根键必须为下面列表之一:
- 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
如果字串不能写入注册表则置一个错误的位标计。字串的类型为 REG_SZ 对应 WriteRegStr,或 REG_EXPAND_STR 对应 WriteRegExpandStr。如果注册表键不存在则会自动创建。
常规用途指令
CallInstDLL
1 | DLL_文件 [/NOUNLOAD] 函数名 |
从一个 NSIS 扩展动态链接库里调用一个函数名。看 Contrib\ExDLL 的样本可以知道如何来创建。扩展动态链接库可以访问堆栈和变量。使用 /NOUNLOAD 来强制安装程序保持动态链接库载入。注意: 要自动释放并调用 DLL 插件请使用插件命令来替换 CallInstDLL。
CopyFiles
1 | [/SILENT] [/FILESONLY] 目标系统文件规范 目标路径 [文件大小_单位为_kb] |
在正在安装的系统中把“目标系统文件规范”复制到“目标路径”。
如果你想从安装媒体里复制,或从系统的一个地方复制到另一个地方,你可以使用 $EXEDIR 变量来代替安装程序目录。如果复制操作需要很长时间的话你可以看到 Windows 的复制文件窗口(要禁止出现复制文件窗口使用/SILENT)。最后的参数用来指定要复制的文件的大小(单位为 kb),使安装程序可以估计所需磁盘空间。在出错,或用户退出(仅当忽略了 /SILENT 时)时,会置一个错误位标计。如果指定了 /FILESONLY 则仅复制文件。
如果没有指定绝对路径则使用当前路径代替。当前路径为最后一个 SetOutPath 指定的路径。如果没有使用任何 SetOutPath 指令则当前路径为 $EXEDIR。
CreateDirectory
要创建的路径创建(必要时递归)指定的目录。当目录不能创建时是一个错误位标计。
你也可以指定一个绝对路径。
CreateShortCut
1 | 快捷文件.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 下作为注释调用。
当快捷方式不能创建的时候会置一个错误位标计(例如路径不存在或一些其它错误)。
GetDLLVersion
1 | 文件名 用户变量(高位_DWORD_输出) 用户变量(低位_DWORD_输出) |
从“文件名” DLL(或其他包含版本信息的可执行文件)取得版本信息。成功时把版本信息高位 DWORD 和低位 DWORD 设为用户输出变量;失败时输出为空且置错误位标计。下面的例子演示了读取一个 DLL 版本并可读的版本到 $0:
1 | GetDllVersion "$INSTDIR\MyDLL.dll" $R0 $R1 |
GetDLLVersionLocal
1 | 内部文件 用户变量(高位_DWORD_输出) 用户变量(低位_DWORD_输出) |
类似于 GetDLLVersion,但它仅用于获取安装程序内部文件的信息(它实际上编译为两个 StrCpy 命令)。成功时把内部文件的版本信息高位 DWORD 和低位 DWORD 设为用户输出变量。
GetFileTime
1 | 文件名 用户变量(高位_DWORD_输出) 用户变量(低位_DWORD_输出) |
获取“文件名”的最后写入时间。成功时把时间戳信息高位 DWORD 和低位 DWORD 输出到用户输出变量;失败时输出为空且置一个错误位标计。
GetFileTimeLocal
1 | 内部文件 用户变量(高位_DWORD_输出) 用户变量(低位_DWORD_输出) |
类似于 GetFileTime,但它仅用于获取安装程序内部文件的信息(它实际上编译为两个 StrCpy 命令)。
GetFullPathName
1 | [/SHORT] 用户变量(输出) 路经或文件 |
把指定的文件完整路径信息输出到用户变量 $x。如果参数的部分路径未找到,则置一个错误位标记并清空 $x。如果指定了 /SHORT,路经将会被转换为短文件名格式。
GetTempFileName
1 | 用户变量(输出) [基本路径] |
把一个临时文件的名称输出到用户变量 $x。该文件会自动创建,所以你可以随时的覆盖它。该临时文件的名称唯一。如果你希望这个临时文件创建在另一个目录而不是 Windows 临时目录的话指定一个“基本路径”给它。你需要在完成之后手动删除它。
SearchPath
1 | 用户变量(输出) 文件名 |
由第二个参数指定的文件名的全路径输出到用户变量 $x。如果该文件不存在则会置一个错误位标记并清空 $x。使用 SearchPath() 来在系统目录里搜索文件。
SetFileAttributes
1 | 文件名 属性 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。这样所有的属性都会被擦除,该命令不支持通配符。
RegDLL
1 | DLL_文件 [入口点名称] |
载入指定的 DLL 并且调用 DllRegisterServer (或入口点名称,当指定之后)。当产生一个错误的时候会置一个错误位标计(例如不能载入 DLL,不能初始化 OLE,不能找到入口点,或者函数返回任何其它错误 ERROR_SUCCESS (=0))。
当某些要注册的 DLL 要依靠其它的位于同目录或 Windows 目录下的 DLL 时请用 SetOutPath 来设定当前目录。例如,如果 foo.dll 依靠位于 $INSTDIR 的 bar.dll 时:
1 | SetOutPath $INSTDIR |
UnRegDLL
1 | DLL_文件 |
载入指定的 DLL 并且调用 DllUnregisterServer。当产生一个错误的时候会置一个错误位标计(例如不能载入 DLL,不能初始化 OLE,不能找到入口点,或者函数返回任何其它错误 ERROR_SUCCESS (=0))。
流程控制指令
Abort
1 | [用户信息] |
取消安装,停止执行脚本,并且在状态显示里显示用户信息。注意: 你可以用于回调函数来实现一些特殊功能。页面回调也可以用 Abort 来实现特殊目的。
Call
1 | 函数名 | :标记名 |
调用“函数名”函数。如果在 Uninstall 区段,Call 仅能调用以“un.”开头的函数名。如果参数以一个“:”开始则它竟会被认为是一个标记(所以你可以在你的函数里调用一个标记 - 这样大概不会使用太多的时间)。
ClearErrors
清除错误位标记。
GetCurrentAddress
1 | 用户变量(输出) |
获取当前指令的地址(GetCurrentAddress)并且把它保存到用户输出变量。该用户变量可以传递到 Call 或 Goto。
GetFunctionAddress
1 | 用户变量(输出) 函数名 |
获取函数地址并且把它保存到用户输出变量。该用户变量可以传递到 Call 或 Goto。注意如果你 Goto 一个由 GetFunctionAddress 输出的地址,你的函数将不能返回(当你 Goto 的函数要返回时,你应该立即返回)。
GetLabelAddress
1 | 用户变量(输出) 标记 |
获取标记地址并且把它保存到用户输出变量。该用户变量可以传递到 Call 或 Goto。需要注意的是你可能仅能从你的函数里随标记调用该指令,但是你可以从任何地方调用它(可能存在不稳定因素)。需要注意的是如果你调用(Call)了 GetLabelAddress 的输出,那么直到它返回时才会被执行(明确或隐含在一个函数的结尾),然后你将回到 Call 指令的状态。.
Goto
1 | 要跳转的标记 | +偏移| -偏移| 用户变量(目标) |
如果指定了标记,则跳转到“要跳转的标记:”。
如果指定了 +偏移 或 -偏移 ,跳转会根据偏移指令相对的跳转。Goto +1 跳转到下一条指令,Goto -1 跳转到上一条指令,等等。
如果指定了用户变量,则跳转到绝对地址(通常你可以从一个函数比如 GetLabelAddress 来取得该值)。编译器位标计命令和 SectionIn 不是指令所以跳转对它们无效。
IfAbort
1 | 退出时要跳转的标记 [不是退出时要跳转的标记] |
如果调用退出时它将“返回” true。这种情况可能发生在当一个文件不能创建(或覆盖)失败而用户选择退出时或者当用户手动退出时。该函数仅能在 instfiles 页面的离开函数里调用。
IfErrors
1 | 错误时跳转 [没有错误时跳转] |
检测并清除错误位标计,如果设了错误位标计,则跳转到“错误时跳转”,否则跳转到“没有错误时跳转”。错误位标计由其它指令在产生一个错误是设置的(比如试图去删除一个正在使用的文件)。
IfFileExists
1 | 要检测的文件 文件存在时跳转 [文件不存在时跳转] |
检测“要检测的文件”是否存在(可以用通配符,或目录),并当文件存在时跳转到“文件存在时跳转”,否则跳转到“文件不存在时跳转”。如果你要检测目标是文件还是目录请使用 IfFileExists 目录*.*
IfRebootFlag
1 | [已设时跳转] [未设时跳转] |
至少需要一个参数。检测重启位标计,如果设置了重启位标计则跳转到“已设时跳转”,否则跳转到“未设时跳转”。重启位标计可以在 Delete 河 Rename,或手动设定的 SetRebootFlag 指令里设置。
IfSilent
1 | [静默安装时跳转] [非静默安装时跳转] |
至少需要一个参数。检测静默安装位标计,如果安装程序是静默安装时跳转到“静默安装时跳转”,否则跳转到“非静默安装时跳转”。静默安装位标计可以由 SilentInstall、SilentUninstall、SetSilent 和用户使用 /S 命令行启动来设置。
IntCmp
值 1 值 2 相等时跳转 [值 1 小时跳转] [值 1 大时跳转]
比较两个整数 值 1 和 值 2。如果 值 1 和 值 2 相等,则跳转到“相等时跳转”,否则如果 值 1 < 值 2,跳转到“值 1 小时跳转”,否则如果 值 1 > 值 2 ,跳转到“值 1 大时跳转”。
IntCmpU
1 | 值1 值2 相等时跳转 [值1小时跳转] [值1大时跳转] |
比较两个无符号整数 值 1 和 值 2。如果 值 1 和 值 2 相等,则跳转到“相等时跳转”,否则如果 值 1 < 值 2,跳转到“值 1 小时跳转”,否则如果 值 1 > 值 2 ,跳转到“值 1 大时跳转”。比较时作为无符号整数来比较。
MessageBox
1 | 消息框选项列表 消息框文本 [/SD 返回] [检测返回值 跳转到] [检测返回值 2 跳转到 2] |
显示一个包含“消息框文本”的消息框。“消息框选项列表”必须为下面的一个或多个,多个使用 | 来隔开(例如 MB_YESNO|MB_ICONSTOP)。
- MB_OK - 显示 OK 按钮
- MB_OKCANCEL - 显示 OK 和取消按钮
- MB_ABORTRETRYIGNORE - 显示退出、重试、忽略按钮
- MB_RETRYCANCEL - 显示重试和取消按钮
- MB_YESNO - 显示是和否按钮
- MB_YESNOCANCEL - 显示是、否、取消按钮
- MB_ICONEXCLAMATION - 显示惊叹号图标
- MB_ICONINFORMATION - 显示信息图标
- MB_ICONQUESTION - 显示问号图标
- MB_ICONSTOP - 显示终止图标
- MB_TOPMOST - 使消息框在最前端显示
- MB_SETFOREGROUND - 设置前景
- MB_RIGHT - 右对齐文本
- MB_DEFBUTTON1 - 默认为按钮 1
- MB_DEFBUTTON2 - 默认为按钮 2
- MB_DEFBUTTON3 - 默认为按钮 3
- MB_DEFBUTTON4 - 默认为按钮 4
“检测返回值”可以为 0(或空,或保留关闭),或下列之一:
- IDABORT - 退出按钮
- IDCANCEL - 取消按钮
- IDIGNORE - 忽略按钮
- IDNO - 否按钮
- IDOK - OK 按钮
- IDRETRY - 重试按钮
- IDYES - 是按钮
如果消息框的返回值为“检测返回值”,则安装程序执行跳转。
用 /SD 来指定一个上面列出的返回值当在安装程序静默安装时作为返回值。
Return
从一个函数或区段返回。
Quit
使得安装程序立即退出。在调用 Quit 后,安装程序将退出(将没有回调函数可以运行)。
SetErrors
设置错误位标计。
StrCmp
1 | 字串1 字串2相同时跳转 [不相同时跳转] |
比较(不区分大小写)“字串 1”和“字串 2”。如果两者相等,跳转到“相同时跳转”,否则跳转到“不相同时跳转”。
文件指令
FileClose
句柄关闭一个由 FileOpen 打开的文件句柄。
FileOpen
1 | 用户变量(句柄输出) 文件名 打开模式 |
打开一个“文件名”的文件,并且把句柄设置为句柄输出变量。“打开模式”为“r”(只读)“w”(写入,文件的所有内容将被清空)或“a”(附加,保持文件内容并写入)其中之一。在所有的打开模式里,文件指针都置于文件起始位置。如果文件不能被打开,则句柄输出变量为空,并置一个错误位标计。
如果没有指定绝对路径则使用当前路径。当前路径由 SetOutPath 设置。如果之前没有使用 SetOutPath 则当前路径为 $EXEDIR。
FileRead
1 | 句柄 用户变量(输出) [最大长度] |
读取一个由 FileOpen 打开的文件的字串。该字串一直读取到新的一行为止(或回车新行)。或直到读取到空的字节为止,或者直到读取的字串满足了“最大长度”(如果指定了的话)。字串的最大长度被限定在 1024 字节之内。如果读取到了文件的结尾却没有有效的数据则输出字串被清空,并置一个错误位标计。
FileReadByte
1 | 句柄 用户变量(输出) |
读取一个由 FileOpen 打开的文件的字节。读取的字节作为一个整数(0-255)保存在输出变量里。如果读取到了文件的结尾却没有有效的数据则输出字串被清空,并置一个错误位标计。
FileSeek
1 | 句柄 偏移 [模式] [用户变量(新位置)] |
定位一个由 FileOpen 打开的文件。
如果“模式”忽略或指定为“SET”,则文件指针定位到“偏移”。
如果“模式”指定为“CUR”,则文件指针向后移动“偏移”。
如果文件指定为“END”,则指针定位到相对于文件结尾 EOF(End of file)处。
如果指定了最后一个参数“用户变量(新位置)”,则新文件位置将保存在该变量中。
FileWrite
1 | 句柄 字串 |
写入一个字串到 FileOpen 打开的文件。如果写入时产生了错误,则置一个错误位标计。
FileWriteByte
1 | 句柄 字串 |
写入“字串”解释为整数的值到 FileOpen 打开的文件。当然你也可以直接输入整数值。下面的代码写入一个“回车/换行” - 输入到文件。
1 | FileWriteByte 文件句柄 "13" |
如果写入时产生了错误,则置一个错误位标计。需要注意的是整数仅低字节被使用,例如: 写入 256 和写入 0 一样,等等。
FindClose
1 | 句柄 |
关闭一个由 FindFirst 打开的搜索。
FindFirst
1 | 用户变量(句柄输出) 用户变量(文件输出) 文件匹配格式 |
按“文件匹配格式”执行一个搜索,把第一个查找到的文件放置到“用户变量(文件输出)”。也可以把搜索的句柄放到“用户变量(句柄输出)”。如果未找到任何文件,则输出都被设为空,并且置一个错误位标计。比较好的用法是使用 FindNext 和 FindClose。需要注意的是“用户变量(文件输出)”不带有路径。
FindNext
1 | 句柄 用户变量(文件输出) |
继续一个由 FindFirst 开始的搜索。句柄应该为 FindFirst 返回的值。如果搜索已完成(没有更多文件),“用户变量(文件输出)”将被设为空,并且置一个错误位标计。需要注意的是“用户变量(文件输出)”不带有路径。
卸载程序指令
WriteUninstaller
1 | [路径\]可执行文件名.exe |
由指定的文件名(路径为可选项)写入卸载程序。仅在一个安装区段或函数里有效,并且你的脚本里必须有一个卸载区段。也可以参考卸载配置。你可以调用一次或多次来写入一个或多个卸载程序(副本)。
混合指令
GetInstDirError
1 | 用户变量(错误输出) |
用于目录选择页面的离开函数。读取位标计设置看“DirVerify leave”是否已使用。可能的值:
- 0: 无错误
- 1: 无效的安装目录
- 2: 目标驱动器没有足够的空间
InitPluginsDir
初始化插件目录($PLUGINSDIR),当之前没有初始化时。
SetShellVarContext
current|all
设置 $SMPROGRAMS 的内容或其他命令解释程序目录。如果设为“current”(默认值),则使用当前用户的命令解释程序目录。如果设为“all”,则使用所有用户的命令解释程序目录。所有用户目录可能不能被所有的操作系统支持。如果所有用户的目录找不到则使用当前用户代替。请考虑一个普通用户或游客是否有正确的权限在所有用户目录里操作。仅仅管理员才有完全的权限访问所有用户目录。你可以用 UserInfo 来查看用户身份。详细信息请查看 Contrib\UserInfo\UserInfo.nsi 样例。
Sleep
休眠时间单位为毫秒在安装程序里暂停执行“休眠时间单位为毫秒”时间。“休眠时间单位为毫秒”可以是一个变量,例如 “$0”或一个数字,比如 “666”。
字串操作指令
StrCpy
1 | 用户变量(目标) 字串 [最大长度] [起始偏移] |
把用户变量 $x 设为“字串”。注意“字串”可以包含另一个变量,或该用户变量会被设置(可以用来连接字串等等)。如果指定了“最大长度”则目标字串的长度为“最大长度”(如果“最大长度”是负数,则会从字串尾部截去“最大长度”的绝对值个字符)。如果指定了起始偏移,则字串偏移到该处作为起始(如果“起始偏移”是负数,则会从尾部开始偏移)。
StrLen
1 | 用户变量(长度输出) 字串 |
把用户变量 $x 设为“字串”的长度值。
堆栈支持
Exch
1 | [用户变量 | 堆栈索引] |
当不指定参数时,交换堆栈顶部的两个单元。当指定了一个参数并且是一个用户变量时,交换堆栈顶部的单元和该参数。当指定了一个参数并且是正整数时,Exch 将会交换堆栈顶部那项和根据参数从堆栈顶部偏移到指定的那项。如果堆栈里没有足够的项来完成交换时,会产生一个致命的错误(来帮助你调试你的代码)。
Pop
1 | 用户变量(输出) |
从堆栈里弹出一个字串到用户变量 $x。如果堆栈是空的,则会置一个错误位标计。
Push
1 | 字串 |
把一个字串压入堆栈。该字串可随后从堆栈里弹出。
整数支持
IntFmt
1 | 用户变量(输出) 格式 数字字串 |
用“格式”格式格式化“数字字串”中的数字,并把输出设为用户变量 $x。例如格式化字串包含 “%08X” “%u”
IntOp
1 | 用户变量(输出) 值1 操作 [值2] |
联合值 1 和(取决于操作)值 2 到用户变量 $x。操作定义为下列之一:
+
值 1 加 值 2-
值 1 减 值 2*
值 1 乘 值 2/
值 1 除 值 2%
由 值 2 取 值 1 的模|
值 1 和 值 2 二进制“或”&
值 1 和 值 2 二进制“与”^
值 1 和 值 2 二进制“异或”~
按位取反 值 1(例如 7 变为 4294917288)!
逻辑取反 值 1(例如 7 变为 0)||
值 1 和 值 2 逻辑“或”&&
值 1 和 值 2 逻辑“与”
重启指令
Reboot
重启电脑。请小心使用该指令。如果重启时产生了错误,该函数会置一个错误位标计并继续。如果重启成功,该指令不返回任何值。
SetRebootFlag
true|false
设置重启位标计为“true”或“false”。
安装记录指令
LogSet
on|off
设置安装记录到 $INSTDIR\install.log 将会发生。
在你调用该函数之前, $INSTDIR 必须有一个值,否则该指令将无效。需要注意的是在编译的时候编译配置文件(config.h)必须设置 NSIS_CONFIG_LOG (默认未设置)来支持该指令。关于重新编译 NSIS 的详细信息请查看 编译 NSIS 源代码。
LogText
文本如果启用了安装程序记录,插入“文本”文本到记录文件。
区段管理
SectionSetFlags
1 | 区段索引 区段位标计 |
设置区段位标计。位标计为 32 位整数。第一位(低位)代表该区段当前是否选中,第二位代表该区段是否是一个子区段(请不要修改这里除非你真的很了解),第三位代表该区段是否是一个子区段的结尾(同样,请不要修改),第四位代表该区段文字是否描黑显示,第五位代表该区段是否是只读,第六位代表子区段是否自动展开。如果指定了超出范围的区段则会置一个错误的位标计。
SectionGetFlags
1 | 区段索引 用户变量(输出) |
找回该区段的位标计。位标计的描述请看上面。如果指定了超出范围的区段则会置一个错误的位标计。
SectionSetText
1 | 区段索引 区段文本 |
设置“区段索引”区段的描述。要设置一个子区段的文本,你必须在文本前加 -。如果文本设为 “”则该区段将会隐藏。如果指定了超出范围的区段则会置一个错误的位标计。
SectionGetText
1 | 区段索引 区段文本 |
把“区段索引”区段的描述保存在输出变量。如果区段为隐藏,则保存的变量为空。如果指定了超出范围的区段则会置一个错误的位标计。
SectionSetInstTypes
1 | 区段索引 安装类型 |
设置“区段索引”区段在安装类型中的默认启用状态。需要注意的是区段索引从零开始。“安装类型”的每一位都是一个告诉该区段是否属于这个安装类型的位标计。例如,如果你有 3 个安装类型并且你希望第一个区段包含在类型 1 和 3,则命令如下:
1 | SectionSetInstTypes 0 5 |
因为 5 的二进制值为 “00000101”。
如果指定了超出范围的区段则会置一个错误的位标计。
SectionGetInstTypes
1 | 区段索引 用户变量(输出) |
找回一个区段的安装类型位标计。如果处理输出的描述请看上面的关于 SectionSetInstTypes 的解释。如果指定了超出范围的区段则会置一个错误的位标计。
SectionSetSize
区段索引 新容量设置“区段索引”区段的容量。需要注意的是索引从零开始。容量的单位为 KB 且仅支持整数。
SectionGetSize
区段索引 用户变量获得“区段索引”区段的容量并把值保存在指定的用户变量里。需要注意的是索引从零开始。
SetCurInstType
安装类型索引设置当前安装类型。如果使用了一个超出范围的安装类型则不会置一个错误位标计。
SetCurInstType 仅在当前存在组件选择页面时才有效。
GetCurInstType
用户变量获取当前的安装类型并保存在指定的用户变量里。${NSIS_MAX_INST_TYPES} (默认为 32)的值意味着选择了自定义安装类型。
InstTypeSetText
1 | 安装类型索引 文本 |
设置指定的安装类型的文本。如果设置的文本为空则移除该安装类型。通过使用一个以前未使用的“安装类型索引”序号你可以创建一个新的安装类型。要在新的安装类型里添加、删除区段请看 SectionSetInstTypes。与 SectionIn 不同的是该索引从零开始,这意味着第一个安装类型索引为 0。
InstTypeGetText
1 | 安装类型索引 用户变量 |
获取指定的安装类型的文本。
用户界面指令
BringToFront
使安装程序窗口可见并把它带到其他窗口的最前端。如果一个应用程序已经执行且显示在安装程序的前面,BringToFront 将把安装程序带回到焦点。
CreateFont
1 | 用户变量(句柄输出) 字体名 [高] [宽] [/ITALIC] [/UNDERLINE] [/STRIKE] |
创建一个字体并把句柄保存在用户变量里。关于不同参数的更多信息请看 MSDN 页面关于 Win32 API 函数 CreateFont()。
DetailPrint
用户信息添加“用户信息”字串到安装程序的安装信息查看窗口。
EnableWindow
1 | 窗口句柄(HWND) (1|0) |
对指定的窗口或控件允许或禁止鼠标和键盘输入。可用的状态为 0(禁止) 或 1(允许)。
FindWindow
1 | 用户变量(窗口句柄输出) 窗口类 [窗口标题] [windowparent] [childafter] |
查找一个窗口。类似于 Win32 FindWindowEx()。由窗口类来查找(和/或窗口标题,如果指定的话)。如果指定了 windowparent 或 childafter,则查找会受到限制。如果窗口类或窗口标题指定为 “”,则它们将不能用于查找。如果窗口未找到,用户变量将返回 0 值。要实现旧式 FindWindow 行为,请和 SendMessage 一起使用。
GetDlgItem
1 | 用户变量(输出) 窗口句柄 控件ID |
在指定的对话框上根据控件 ID 获得控件句柄。如果你想获得安装程序内部的控件句柄,请先使用 FindWindow 用户变量(窗口句柄输出) "#32770" "" $HWNDPARENT
来获取窗口句柄。
HideWindow
隐藏安装程序。
IsWindow
1 | 窗口句柄 是窗口时跳转 [不是窗口时跳转] |
如果“窗口句柄”是一个窗口,则跳转到“是窗口时跳转”,否则跳转到“不是窗口时跳转”(如果指定了的话)。
SendMessage
1 | 窗口句柄 消息 第一个消息参数 第二个消息参数 [用户变量(返回值)] [/TIMEOUT=毫秒] |
发送消息到“窗口句柄”。如果指定了一个用户变量 $x 作为最后一个参数(或在 /TIMEOUT 之前的最后一个参数),SendMessage 的返回值将保存在该变量里。需要注意的是当指定“消息”时你只能用消息的整数值。如果你需要发送字串请使用“STR:字串”作为“第一个消息参数”或“第二个消息参数”。
- WM_CLOSE 16
- WM_COMMAND 273
- WM_USER 1024
Include WinMessages.nsh 来获得所有 Windows 消息定义。
要发送一个字串参数的话,在参数前面加入 STR: ,例如: “STR:一些字串” 。
使用 /TIMEOUT=毫秒 来指定持续时间,单位为毫秒。
SetAutoClose
1 | true|false |
取代默认的窗口自动关闭位标计(由 AutoCloseWindow 指定,且对于写在程序为 false)。指定“true”将使得安装程序在安装完成时立即关闭窗口,或者“false”来使它需要手动关闭。
SetBrandingImage
1 | [/IMGID=对话里的 ID 项] [/RESIZETOFIT] 位图.bmp |
把当前位图作为标志图像显示。如果没有指定 IMGID 则使用第一个找到的图像控件,或由 AddBrandingImage 建立的图像控件。需要注意的是位图必须预先存在于当前用户的机器上。可以先使用 File 指令把它释放。如果指定了 /RESIZETOFIT 则图像会自动改变尺寸到图像控件的大小。如果你使用了 AddBrandingImage 你可以得到它的大小,通过编译你的脚本并察看 AddBrandingImage 的输出,它会告诉你控件的大小。SetBrandingImage 在 .onInit 或 .onInit 调用的函数里无效。
SetDetailsView
1 | show|hide |
显示或隐藏详细信息,取决于你使用什么样的参数。它可以覆盖默认的由 ShowInstDetails 设定的详细信息察看属性。
SetDetailsPrint
1 | none|listonly|textonly|both|lastused |
为命令输出的状态信息设置一个显示模式。None 为不输出,listonly 仅在列表框显示,textonly 仅在状态条显示,both 则两者都显示(默认)。对于释放很多小的文件,推荐使用 textonly(特别在 Win9X 下启用了平滑卷动)。
SetCtlColors
1 | 句柄 [/BRANDING] [文本颜色] [transparent|背景颜色] |
对一个静态控件、编辑控件、按钮或一个对话框设置一个背景颜色和文本颜色。使用 GetDlgItem 来获取控件的句柄。如果要使得控件透明你可以指定“transparent”作为背景颜色值。你也可以指定 /BRANDING 并带或不带文本颜色和背景颜色来使得控件完全灰白(或其他你选择的颜色)。在 MUI 里用来显示标志牌。
SetSilent
1 | silent | normal |
设置安装程序为静默模式或普通模式。关于静默安装的详细信息请看 SilentInstall。仅能在 .onInit 里使用。
ShowWindow
1 | 窗口句柄 显示状态 |
设置一个窗口的显示程度。可能的“显示状态”和 Windows ShowWindow 函数相同。SW_*
常量定义于 Include\WinMessages.nsh。
多语言指令
LoadLanguageFile
1 | 语言文件.nlf |
给一个语言表的结构载入一个语言文件。所有的语言文件在 Contrib\Language Files
在你插入一个语言文件后 ${LANG_langfile} 将会被定义为语言 ID(例如: ${LANG_ENGLISH} 将会被定义为 1033)。你可以把它用于 LangString、LicenseLangString、LangDLL 和 VIAddVersionKey。
LangString
1 | 名称 语言ID 字串 |
定义一个使用多种语言的字串。这意味着它的值将对于每个语言都不同。这允许你方便的使安装程序多语言化,不需要再脚本里使用大量的开关语句。
每一个语言字串都有一个特定的名字和一个用于安装程序的分配给每一个语言的值。他们可以在脚本里用于任何运行时字串。要使用一个语言字串你所需要做的就是把 $(LangString_名称)
插入到你想插入字串的地方。
注意:
- 不像定义使用花括号 - {} 一样,语言字串使用圆括号 - ()。
- 如果你想在 .onInit 函数里更改语言,需要注意的是在 .onInit 里的语言字串将仍旧使用基于用户的默认 Windows 语言检测到的语言,因为语言的初始化在 .onInit 之后。
- 总是在你的脚本里为所有语言设置语言字串。
- 如果你把语言 ID 设为 0,则使用 LangString 或 LoadLanguageFile 最后使用的语言。
使用例子:
1 | LangString message ${LANG_ENGLISH} "英语信息" |
LicenseLangString
1 | 名称 语言ID 许可文件路径 |
用法和 LangString 一样,但它仅从一个文本、RTF 文件载入字串并且定义一个特别的仅能用于 LicenseData 的 LangString。