这些命令在用途和功能性方面与 C 预处理器很相似。它们都允许文件内含,条件编译,可执行的文件头部压缩,以及在构建过程期间流程执行。注意:这些命令都不允许使用变量。
[/NONFATAL] 文件
这个命令可以将一个文件包含到原始脚本中,就像是原始脚本的一部分一样。如果一个文件包含在了另一个目录中,那么当前目录仍是编译脚本的地方(不是要包含的文件所在的目录)。如果编译器无法找到文件,那么它将会在每一个包含目录中查找。欲了解更多信息,请查看 !addincludedir 。如果使用了 /nonfatal 开关的话当要包含的文件未找到的时候用警告来代替错误。
!include WinMessages.nsh !include Library.nsh !include C:\MyConfig.nsi !include ..\MyConfig.nsh !include /NONFATAL 可能存在也可能不存在的文件.nsh
目录
向包含目录列表中添加另一个“目录”。当使用 !include 时,将会按这个列表搜索。这个列表的初始值只有 ${NSISDIR}\Include 。
!addincludedir ..\include !include something.nsh
目录
NSIS 编译器用于搜索插件 DLL 的目录。
!addplugindir myplugin MyPlugin::SomeFunction
文件 文本
把 文本 附加到 文件里。
!tempfile FILE !appendfile "${FILE}" "XPStyle on$\n" !appendfile "${FILE}" "Name 'test'$\n" !include "${FILE}" !delfile "${FILE}" !undef FILE
新路径
这个命令将会令编译器更改为一个新路径 —— “新路径”。新路径可以为相对路径或绝对路径。
!cd ..\more-scripts\new
文件
此命令用于删除一个文件。
!tempfile FILE !delfile "${FILE}" !undef FILE
信息
这个命令将会回显一条用户编译脚本的消息。
!echo "hello world"
[信息]
这个命令将会发布一个脚本编译器的错误,并停止执行脚本。你也可以向这个错误添加一条消息。
!ifdef VERSION & NOVERSION !error "不能同时定义 VERSION 和 NOVERSION" !endif
命令
这个指令将调用 CreateProcess() 来执行一个 '命令'。和 !system, 不一样,它不使用命令行处理程序,所以输入、输出都被重定向并且命令行里的 'cd', 'dir' 和 'type' 等命令都不能使用。 !execute 同时也不接受执行命令的返回值。 目前, !execute 对于 !system 的好处就是当前工作路径为 UNC 的时候不会引起问题。
在 POSIX 平台,! !execute 使用 system() 就和 !system 一样。
!execute '"%WINDIR%\notepad.exe" "${NSISDIR}\license.txt"'
临时文件 命令
这个选项可以让编译器使用 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"'
命令 [比较运算符 比较值]
这个命令将会通过调用 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
符号
此命令创建一个临时文件。路径会被添加到定义列表里,名称为 符号。
!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
[信息]
这个命令将会输出一个脚本编译器的警告,但不会停止执行脚本。你也可以向这个警告添加一条消息。
!ifdef USE_DANGEROUS_STUFF !warning "using dangerous stuff" !endif
级别 | push | pop
这个命令将会设置编译输出信息的级别。 4=全部信息, 3=没有脚本信息, 2=没有信息, 1=没有警告信息, 0=无输出。
通过 push 可以把 !verbose 当前的级别压入一个特殊的堆栈。通过 pop 可以把 !verbose 保存在堆栈中的级别弹出并使用该级别。
(如果你的脚本比较大你可以在脚本开头设置 !verbose 3 来减少编译信息输出耗时,从而加快编译速度。)
!verbose push !verbose 1 !include WinMessages.nsh !verbose pop