想必大家都用过WinAMP 来播放MP3音乐,也都熟悉了WinAMP 的安装界面。它的安装程序小巧玲珑,简单直观。想为你自己编的程序制作一个这样的安装界面吗?完全可以,因为有免费的NSIS。它的全称是Nullsoft Installation System,和著名的WinAMP一样,都是出自Nullsoft公司之手,而且它也是免费的,不存在任何时间限制或功能限制。
NSIS安装程序使用‘MakeNSIS’程序来编译一个 NSIS 脚本(.NSI) 成为一个可执行的安装程序的。
makensis 命令的语法:[b]Makensis [/LICENSE] [/PAUSE] [/NOCONFIG] [/CMDHELP [command]][/Ddefine ...] [Script.nsi | -][/b]
/LICENSE -显示许可协议页面。
/PAUSE -使 Makensis 在退出前暂停,当从 Windows 直接执行时有用(自动安装的外壳扩展名使用它)。
/NOCONFIG -禁止包含[在makensis.exe 的路径下]nsisconf.nsi。没有此参数,安装程序的默认值从 nsisconf.nsi 设置。查看 NSIS 配置文件。
/CMDHELP -打印基本的命令使用信息(若指定某命令),或全部命令(若未指定命令)。
使用 /D 开关一次或多次将添加符号到全部定义列表。
为脚本名指定一个破折号(-)将告诉 Makensis 使用标准的输入作为来源。
注意 NSIS 开发工具包安装程序可能已经设置了你的电脑,所以你可以在资源管理器里通过简单地右键点击一个 .nsi 文件并选择“编译”来编译它。
.NSI 脚本格式一个 NSIS 脚本文件(.nsi) 只是一个有一系列命令的文本文件。
其中以 ; 或 # 开始的行是注释行。
非注释行的格式是 'command [parameters]' ,但在一个 ; 或 # 后的任何内容都视为注释。
作为数字的参数,使用十进制(数字)或十六进制(加前缀 0x ,例如0x12345AB),或八进制 (数字开始以 0,没有 x)。
要表示带有空格的字符串,使用引号。引号只有包含参数的特性,(若开始了一个参数)。引号可以是单引号、双引号、向后单引号。
例子:
MessageBox MB_OK "I'll be happy"
MessageBox MB_OK 'And he said to me "Hi there!"'
要延伸一个命令超过多行,在每行的末端使用反斜线符号用于连接到下一行。例如:
MessageBox MB_YESNO|MB_ICONQUESTION
"Remove all files in your NSIS directory? (If you have anything
you created that you want to keep, click No)"
IDNO NoRemoveLabel
若一个名为 "nsisconf.nsi" 的文件位于与 makensis.exe 相同的目录下,它将会被包含任何脚本之前 (除非使用了 /NOCONFIG 命令行参数)。安装程序属性:下面的命令调整安装程序的属性。这些属性控制安装程序的外观和功能,包括哪个页面存在于安装程序中,在每个页面的每个部分显示什么文本,安装程序如何命名,安装程序使用什么图标,默认的安装程序路径,输出什么安装程序文件以及更多。
除了 InstallDir,其它属性都不允许使用 $r 和 $n 以外的变量。OutFile 指定 MakeNSIS 将生成的安装程序文件。这只是 MakeNSIS 制作的文件名称和位置,不影响安装程序的内容。
Name 设置所安装的程序的名称。名称通常简单地使用产品名,像 'MyApp' 或 'CrapSoft MyApp'。
Caption 设置安装程序显示的标题栏。默认的是 'Name Setup',这里 Name 是由 Name 命令指定的。然而你可以用例如 'MyApp Installer' 或其它内容取代它。
Icon 设置安装程序的图标。图标必须包含一个 32x32x16 色的图标资源 (它可以包含其他图标,但它们将被忽略)。
[b]BGGradient [off] | [
[ | notext]][/b]
指定是否使用梯度填充的背景窗口。若 'off',安装程序将不显示背景窗口。若不指定参数,默认使用蓝色梯度背景。你可以使用top_color 和 bottom_color 来制作一个梯度颜色。
. Top_color 和 bottom_color 用RRGGBB 指定(十六进制方式, 象在 HTML 里一样,只去掉前导符 '#',因为 # 用于表示注释)。'textcolor' 用于指定文本颜色,'notext' 用于关闭大字背景文本。
SilentInstall normal|silent|silentlog
指定是否安装程序将是寂静的。若是 'silent' 或 'silentlog',全部区段被静悄悄地安装,安装程序将没有任何画面显示。(出错时仍将显示 MessageBoxes ,脚本将仍可以显示它要的任何内容)。注意若设置为 'normal' 而用户以带 /S 开关的命令行方式运行,也将表现为 SilentInstall 'silent' 寂静方式。
CRCCheck on|off
指定是否安装程序安装前执行自身的CRC。可用的参数为 'on' 和 'off'。
InstallDir
设置默认的安装路径。到变量区段查看可用在这里的变量
LicenseData
指定一个文本文件,用作许可协议。注意文本必须是DOS 文本格式!
[b]ComponentText [][/b]
指定在组件列表上方的字符串。它可以是提醒用户实际将安装的内容。若不指定此参数,或者ComponentText 命令被忽略,将不显示组件页面,全部节将被安装。
InstType (/NOCUSTOM | screen.width/2)this.style.width=screen.width/2;" border=0>
添加一个安装类型到安装类型列表,或者禁止自定义安装类型。最多可以有8种安装类型,每个都可以指定一个安装名称。每个类型都被编号,从1开始。第一个类型是默认的(一般是“典型安装”)。若指定了 /NOCUSTOM 开关,将禁止自定义安装,用户只能从已定制的安装类型中选择一个。
EnabledBitmap
设置组件页的列表框的可用状态。它必须是一个16色的位图(可以是任意尺寸,但最好是20X20大小。别的尺寸将被自动更改)。
DisabledBitmap
设置组件页的列表框的禁用状态。它必须是一个16色的位图(可以是任意尺寸,但最好是20X20大小。别的尺寸将被自动更改)。
DirShow show|hide
指定是否用户将看到目录选择页面。注意若指定为 'hide',安装程序将仍旧检查安装路径的合法有效性。若路径无效,将会显示目录选择页面。要完全禁止目录选择页面的显示,指定DirText 不加参数 (当安装程序安装内容到 $SYSDIR 时,这样很有用)。
[b]DirText [][/b]
指定在目录选择区域上方的一个字符串。若未指定此命令或无参数,目录选择页将永不可见,即使DirShow show 被指定了。
InstallColors (/windows | ( screen.width/2)this.style.width=screen.width/2;" border=0>)
设置安装信息画面的颜色(默认的是 00FF00 000000. 使用RRGGBB (十六进制,象在 HTML里那样,只是去掉前缀 '#',因为 # 用于注释)。注意若只指定了 "/windows" 参数,将使用默认的窗口颜色。
AutoCloseWindow true|false
设置当安装完成后,安装窗口是否自动关闭。可以是'false' 或 'true'。
ShowInstDetails hide|show|nevershow
设置是否显示安装程序的详细内容。可以是'hide' (默认值)以隐藏详细信息,但用户也可以查看。'nevershow'禁止用户查看它们。若设置了SetDetailsView,此参数将不起作用。
UninstallText
指定在反安装程序的首页显示的文本。
UninstallExeName
指定反安装程序的可执行名称。反安装程序将在安装完毕时创建在 $INSTDIR 。注意要创建一个反安装程序,必须在脚本里创建Uninstall 区段。
UninstallIcon
设置反安装程序的图标。图标必须包含一个32x32x16 色的图标资源 (也可以包含其它图标,但它们都将被忽略)。
编译器标记(Compiler flags):
下面的命令更改编译器如何生成代码并压缩资料。这些命令在脚本的任何地方都可用。
SetOverwrite on|off|try|ifnewer
此命令决定是否覆盖任何已有的文件。若是'off', 将不覆盖已有文件,若是'try', 将覆盖可以写的文件,无法写入的文件被跳过。若是 'ifnewer', 将只覆盖旧文件。
SetCompress auto|force|off
决定是否压缩资料。若设置为'auto',若压缩后文件变小,将进行压缩。若为 'force',将始终压缩资料文件。
SetDatablockOptimize on|off
此命令告诉编译器是否做数据块优化。这样的话可能会节约部分空间。
SetDateSave on|off
设置文件日期/时间,决定是否保存文件最后的写入时间和日期,安装后文件的日期就是此日期。
区段(Section):
每个 NSIS 安装程序包含一个或多个区段。通常包括下面三行:
[b]Section [][/b]
开始一个新区段。若 section_name 是空的或以一个 – 开始,那么这将是一个必需的区段,用户看不见,也无法禁止它。若区段名称是'Uninstall',它是一个特定的反安装区段。
SectionIn
此命令指定当前区段在哪个安装类型启用。例如 1258 或 1,2,5,8 或 1-2-5-8 或 1 2 5 8 都可以说明当前区段在1,2,5,8安装类型里起用。
SectionEnd
此命令关闭当前打开的区段。
函数(Functions):
函数类似于区段,它包含一个或更多的指令。它不直接被安装程序调用,而是从区段里用 Call 命令调用。(注意:有部分特殊的 Callback 函数可以被安装程序直接调用)。
函数必须在区段外声明。
以 "." 开始(例如. ".Whatever"screen.width/2)this.style.width=screen.width/2;" border=0> 的函数名通常为 callback 函数保留。
以 "un." 开始的函数名是由反安装程序生成的函数。因此一般的安装区段或函数无法调用它。,反安装区段和反安装函数也无法调用一般函数。
它的一般格式如下:
Function
创建并打开名为 function_name 的函数。
FunctionEnd
结束当前打开的函数。
**************************例子makensis.nsi******************************
;定义程序的辅版本
!define VER_MINOR "61"
;定义程序的主版本
!define VER_MAJOR 1
;关闭压缩与数据优化
!ifdef NO_COMPRESSION
SetCompress off
SetDatablockOptimize off
!endif
;关闭数据CRC校验
!ifdef NO_CRC
CRCCheck off
!endif
;字体文件
!ifdef PIG_LATIN
!include piglatin.nsh
!else ifdef CAPS
!include caps.nsh
!endif
;安装程序名
Name "NSIS"
;安装程序标题
Caption "Nullsoft 安装系统 - 安装"
;生成的安装程序名称
OutFile HA_nsis${VER_MAJOR}${VER_MINOR}.exe
;安装程序画面颜色
!ifdef uglyinstaller
BGGradient 000000 308030 FFFFFF
InstallColors FF8080 000000
InstProgressFlags smooth colored
!endif
;许可协议文件标题
LicenseText "在安装软件之前, 你必须先阅读下面的许可协议:"
;许可协议内容
LicenseData 汉化说明.txt
;安装组件标题
ComponentText "现在将安装 Nullsoft 安装系统 v${VER_MAJOR}.${VER_MINOR} 到你的计算机:"
;安装类型
InstType 典型安装
InstType "完整安装 (含源代码)"
;InstType /NOCUSTOM
;InstType /COMPONENTSONLYONCUSTOM
;不自动关闭窗口
AutoCloseWindow false
;显示详细的安装信息
ShowInstDetails show
;显示详细的反安装信息
ShowUninstDetails show
;选择安装目录
DirText "请选择一个安装 NSIS 的目录(或者使用默认目录):"
;覆盖目标目录里已有的文件
SetOverwrite on
;设置数据保存日期
SetDateSave on
;设置UPX压缩数据
!ifdef HAVE_UPX
!packhdr tmp.dat "upxupx --best --compress-icons=1 tmp.dat"
!endif
;设置安装目录
InstallDir $PROGRAMFILESNSIS
;增加安装注册键
InstallDirRegKey HKLM SOFTWARENSIS ""
;必须安装区段
Section "NSIS 发展系统 (必须安装)"
SectionIn 1 2
SetOutPath $INSTDIR
File makensis.exe
File makensis.htm
File license.txt
File 汉化说明.txt
SectionEnd
;推荐安装区段
Section "NSIS 脚本范例 (推荐安装)"
SectionIn 1 2
SetOutPath $INSTDIR
File nsisconf.nsi
File makensis.nsi
File example1.nsi
File example2.nsi
File viewhtml.nsi
File waplugin.nsi
File bigtest.nsi
File uglytest.nsi
File primes.nsi
File piglatin.nsh
File caps.nsh
File upgradedll.nsh
File functions.htm
File bitmap1.bmp
File bitmap2.bmp
File main.ico
File uninst.ico
SectionEnd
;开始菜单和桌面图标区段
Section "开始菜单 + 桌面图标"
SectionIn 1 2
SetOutPath $SMPROGRAMSNSIS
Delete "$SMPROGRAMSNSISNSIS Home Page.lnk"
WriteINIStr "$SMPROGRAMSNSISNSIS 主页.url"
"InternetShortcut" "URL" "
CreateShortCut "$SMPROGRAMSNSIS卸载 NSIS.lnk"
"$INSTDIRuninst-nsis.exe"
CreateShortCut "$SMPROGRAMSNSISNSIS 使用说明文档.lnk"
"$INSTDIRmakensis.htm"
CreateShortCut "$DESKTOPMakeNSIS.lnk" "$INSTDIRMakensis.exe" '/CD /PAUSE'
SectionEnd
;启动时弹出画面区段
Section "启动屏幕支持"
SectionIn 1 2
SetOutPath $INSTDIR
File splash.exe
File splash.txt
IfFileExists $SMPROGRAMSNSIS 0 NoShortCuts
CreateShortCut "$SMPROGRAMSNSIS启动屏幕帮助.lnk"
"$INSTDIRsplash.txt"
NoShortCuts:
SectionEnd
;“安装成功”函数
Function .onInstSuccess
MessageBox MB_YESNO|MB_ICONQUESTION
"安装已经完成. 现在要查看自述文件吗?"
IDNO NoReadme
ExecShell open '$INSTDIRmakensis.htm'
NoReadme:
FunctionEnd
;反安装标题与反安装程序名
!ifndef NO_UNINST
UninstallText "现在将 NSIS 从你的系统中删除:"
UninstallExeName uninst-nsis.exe
;反安装区段
Section Uninstall
ReadRegStr $1 HKCR ".nsi" ""
StrCmp $1 "NSISFile" 0 NoOwn ; only do this if we own it
ReadRegStr $1 HKCR ".nsi" "backup_val"
StrCmp $1 "" 0 RestoreBackup ; if backup == "" then delete the whole key
DeleteRegKey HKCR ".nsi"
Goto NoOwn
RestoreBackup:
WriteRegStr HKCR ".nsi" "" $1
DeleteRegValue HKCR ".nsi" "backup_val"
NoOwn:
DeleteRegKey HKCR "NSISFile"
DeleteRegKey HKLM "SoftwareMicrosoftWindowsCurrentVersionUninstallNSIS"
DeleteRegKey HKLM SOFTWARENSIS
Delete $SMPROGRAMSNSIS*.lnk
Delete $SMPROGRAMSNSIS*.url
RMDir $SMPROGRAMSNSIS
Delete $DESKTOPMakeNSIS.lnk
Delete $INSTDIR*.*
RMDir /r $INSTDIRSource
RMDir $INSTDIR
; if $INSTDIR was removed, skip these next ones
IfFileExists $INSTDIR 0 Removed
MessageBox MB_YESNO|MB_ICONQUESTION
"删除你的 NSIS 目录中的所有文件吗? (如果你曾经自己
创建过文件, 如果想保存这些文件, 按'否')" IDNO Removed
Delete $INSTDIR*.* ; this would be skipped if the user hits no
RMDir /r $INSTDIR
IfFileExists $INSTDIR 0 Removed
MessageBox MB_OK|MB_ICONEXCLAMATION
"注意: $INSTDIR 目录不能被删除."
Removed:
SectionEnd
!endif