每一个 NSIS 安装程序包含一个或多个区段。所有的这些区段都使用下面的这些命令来创建、修改和结束。
大小(单位为:KB)
告诉安装程序当前的区段需要一个额外的 "大小" KB 磁盘空间。仅在一个区段里有效(在区段外或函数里无效)。
Section AddSize 500 SectionEnd
[/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
该命令关闭当前打开的区段。
安装类型索引 [安装类型索引] [RO]
该命令指定当前区段默认为哪一种安装类型 (详细信息查看 InstType) 允许的状态入口。可以指定多个 (它们会被组合起来)。如果指定 RO 作为一个参数,则该区段将被设为只读区段,意味着用户不能去改变它的状态。使用 InstType 可知第一种安装类型是索引 1,下一个是编号 2,以此类推。
InstType "完全" InstType "最小化" Section "区段 1" SectionIn 1 2 SectionEnd Section "区段 2" SectionIn 1 SectionEnd
[/e] section_group_name [index_output]
该命令插入一个区段组。区段组必须以 SectionGroupEnd 来关闭,并且可以包含一个或多个区段。如果区段组名称以一个 ! 开头,则区段组名称以粗体字显示。如果指定了 /e ,该区段组的所有区段默认将被展开。如果指定区段组索引输出,该参数将被 !defined 为区段索引 (然后可以对它使用 SectionSetText 等)。如果名字以 'un.' 为前缀,则该区段组为卸载程序区段组。
SectionGroup "区段组" Section "区段 1" SectionEnd Section "区段 2" SectionEnd SectionGroupEnd
关闭一个以 SectionGroup 打开的区段组。
一个特别的名为 “Uninstall” 的区段只能是被创建用于产生一个卸载程序。该区段应该用来从系统里移除由安装程序安装的所有文件、注册表健等等。下面是一个简单的卸载区段例子:
Section "Uninstall" Delete $INSTDIR\Uninst.exe ; 删除自我 (看下面的解释为什么可以这样) Delete $INSTDIR\myApp.exe RMDir $INSTDIR DeleteRegKey HKLM SOFTWARE\myApp SectionEnd
第一个 Delete 指令是可以正常执行的 (删除卸载程序本身),因为执行卸载程序的时候它会复制一个副本到系统临时目录并执行副本来完成卸载。
需要注意的是在卸载程序的代码里, $INSTDIR 包含了卸载程序所在的位置。你不需要在安装程序里给该变量重复赋值。