当前位置: 首页 > 文档资料 > NSIS 用户手册 >

5.1 编译器命令

优质
小牛编辑
121浏览
2023-12-01

这些命令在用途和功能性方面与 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 加壳软件 (例如 PetiteUPX) 压缩可执行文件。请先指定一个临时文件名 (例如 "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

上一步 | 目录 | 下一步