5.1 编译器命令
这些命令在用途和功能性方面与 C 预处理器很相似。它们都允许文件内含,条件编译,可执行的头部封包,以及在构建进程期间处理执行。注意:这些命令都不允许使用变量。
5.1.1 !include
[/NONFATAL] 文件
这个命令可以将一个文件包含到脚本中,就像是脚本的一部分一样。请注意,如果一个文件包含在了另一个目录中,那么当前目录仍是编译脚本的地方 (不是要包含的文件所在的目录)。如果编译器无法找到文件,那么它将会在每一个包含目录中查找。若要得到更多信息,请查看 !addincludedir。如果使用了 /nonfatal 开关的话当要包含的文件未找到的时候用警告来代替错误。
!include WinMessages.nsh !include Library.nsh !include MyConfig.nsh !include ..\MyConfig.nsh !include /NONFATAL 可能存在也可能不存在的文件.nsh
5.1.2 !addincludedir
目录
向包含目录列表中添加另一个包含目录。当使用 !include 时,将会按这个列表搜索。这个列表的初始值只有 ${NSISDIR}\Include。
!addincludedir ..\include !include something.nsh
5.1.3 !addplugindir
目录
NSIS 编译器用于搜索插件 DLL 的目录。
!addplugindir myplugin MyPlugin::SomeFunction
5.1.4 !appendfile
文件 文本
把“文本”附加到“文件”里。
!tempfile FILE !appendfile "${FILE}" "XPStyle on$\n" !appendfile "${FILE}" "Name 'test'$\n" !include "${FILE}" !delfile "${FILE}" !undef FILE
5.1.5 !cd
新路径
这个命令将会令编译器更改为一个新路径——“新路径”。新路径可以为相对路径或绝对路径。
!cd ..\more-scripts\new
5.1.6 !delfile
文件
删除一个文件。
!tempfile FILE !delfile "${FILE}" !undef FILE
5.1.7 !echo
信息
这个命令将会回显一条用户编译脚本的消息。
!echo "hello world"
5.1.8 !error
[信息]
这个命令将会发布一个脚本编译器的错误,并停止执行脚本。你也可以向这个错误添加一条消息。
!ifdef VERSION & NOVERSION !error "不能同时定义 VERSION 和 NOVERSION" !endif
5.1.9 !execute
命令
这个指令将调用 CreateProcess() 来执行一个命令。和 !system 不一样,它不使用命令行处理程序,所以输如输出都被重定向并且命令行里的 cd、dir、type 等命令都不能使用。!execute 同时也不接受执行命令的返回值。目前 !execute 对于 !system 的好处就是当当前工作路径为 UNC 的时候不会引起问题。
在 POSIX 平台,!execute 使用 system() 就和 !system 一样。
!execute '"%WINDIR%\notepad.exe" "${NSISDIR}\license.txt"'
5.1.10 !packhdr
临时文件 命令
这个选项可以让编译器使用 EXE 加壳软件 (例如 Petite 或 UPX) 压缩可执行文件。请先指定一个临时文件名 (例如 "temp.dat") 以及命令行 (例如 "C:\Program Files\upx\upx -9 temp.dat") 压缩文件。
!packhdr "$%TEMP%\exehead.tmp" '"C:\Program Files\UPX\upx.exe" "$%TEMP%\exehead.tmp"'
5.1.11 !system
命令 [比较运算符 比较值]
这个命令将会通过调用 system() 来执行,并且如果比较过“比较值”以后的返回值为 false,那么编译将会被终止。“比较运算符”可以为 <、>、<> 或 =。
!system '"%WINDIR%\notepad.exe" "${NSISDIR}\license.txt"' !system 'echo !define something > newinclude.nsh' !include newinclude.nsh !ifdef something !echo "something 已定义!" !endif ;仅当 VPatch 返回 0(表示成功) 时继续,否则停止编译。
!system '""${NSISDIR}\Contrib\VPatch\GenPat.exe" "C:\old-file.exe" "C:\new-file.exe" "C:\patch.pat""' = 0
5.1.12 !tempfile
符号
创建一个临时文件,路径会被添加到定义列表里,名称为“符号”。
!tempfile PACKHDRTEMP !packhdr "${PACKHDRTEMP}" '"C:\Program Files\UPX\upx.exe" "${PACKHDRTEMP}"'
!tempfile FILE !define /date DATE "%H:%M:%S %d %b, %Y" !system 'echo 构建于 ${DATE} > "${FILE}"' File /oname=build.txt "${FILE}" !delfile "${FILE}" !undef FILE !undef DATE
5.1.13 !warning
[信息]
这个命令将会输出一个脚本编译器的警告,但不会停止执行脚本。你也可以向这个警告添加一条消息。
!ifdef USE_DANGEROUS_STUFF !warning "正在使用危险的东西!" !endif
5.1.14 !verbose
级别 | push | pop
这个命令将会设置编译输出信息的级别。4=全部信息,3=没有脚本信息,2=没有信息,1=没有警告信息,0=无输出。
通过 push 可以把 !verbose 当前的级别压入一个特殊的堆栈。通过 pop 可以把 !verbose 保存在堆栈中的级别弹出并使用该级别。
如果你的脚本比较大你可以在脚本开头设置 !verbose 3 来减少编译信息输出耗时,从而加快编译速度。
!verbose push !verbose 1 !include WinMessages.nsh !verbose pop