| Nsis简介 |
|
日期:2007-2-9 7:20:55 人气:
[大 中 小] 推荐本页:
|
|
40NSIS (Nullsoft Scriptable Install System)是一个Open Source的Windows系统下安装程序制作程序。它提供了安装、卸载、系统设置、文件解压缩等功能。这如其名字所指出的那样,NSIS是通过它的脚 本语言来描述安装程序的行为和逻辑的。NSIS的脚本语言和通常的编程语言有类似的结构和语法,但它是为安装程序这类应用所设计的。NSIS脚本通常以 nsi为扩展名,支持include功能,头文件扩展名为nsh。NSIS (Nullsoft Scriptable Install System)是一个Open Source的Windows系统下安装程序制作程序。它提供了安装、卸载、系统设置、文件解压缩等功能。这如其名字所指出的那样,NSIS是通过它的脚本语言来描述安装程序的行为和逻辑的。NSIS的脚本语言和通常的编程语言有类似的结构和语法,但它是为安装程序这类应用所设计的。NSIS脚本通常以 nsi为扩展名,支持include功能,头文件扩展名为nsh。 NSIS的主要特点是:
开销小,一个完整功能的安装程序仅需要34k的额外开销。 支持大多数Windows平台,包括:Windows 9.x,Windows NT, Windows 2000, Windows XP, Windows 2003 支持三大压缩算法: Zlig, BZips, LZMA 支持脚本 支持多语言 支持安装界面定制 提供可扩展的插件接口 支持网络安装、补丁 支持无人值守的安装模式 此外,NSIS的license允许任何用途免费使用。 开发一个NSIS的安装程序通常有以下几步: 确定安装的功能和界面元素 编写NSIS脚本 使用NSIS提供的makensis或者makensisw程序,将步骤2编写的脚本编译成可执行的安装程序 调试安装程序,如果有问题退到第二步重复 随着NSIS的流行,有一些第三方的NSIS脚本开发环境出现了,如HM NIS Edit,Venis IX前者是完全开源的,后者仅对个人和非商业用途免费。在这些集成开发环境下,步骤2,3可以方便的组合在一起。 NSIS脚本的结构 NSIS脚本(下称nsi脚本)主要包含安装程序属性、页面、区段、函数。 属性用来定义安装程序的行为和界面风格,这些属性大部分是编译时刻属性,即不能在运行时刻改变。 页面是指安装程序的向导页面,示例: Page license Page components Page directory Page instfiles UninstPage uninstConfirm UninstPage instfiles 区段是对应某种安装/卸载选项的处理逻辑,该段代码仅当用户选择相应的选项才被执行。卸载程序的区段名用"un."作为前缀,示例如下: Section "Installer Section" SectionEnd Section "un.Uninstaller Section" SectionEnd 在区段中可以使用很多指令用来完成诸如解压缩文件、读写注册表、创建目录、创建快捷方式等任务,但最常用的指令是SetOutPath和File,前者用于指定目的位置,后者用于指定文件。示例: Section "My Program" SetOutPath $INSTDIR File "My Program.exe" File "Readme.txt" SectionEnd 区段名的修饰符/o表示该区段默认不选上,-表示隐藏区段(匿名区段也是隐藏区段),!表示需要粗体显示的区段。 SectionIn表示该区段和安装类型之间的关系: SectionIn insttype_index [insttype_index] ... [RO] RO修饰符表示不可修改。 子区段用于包含多个区段 SubSection [/e] Caption [subsection_name index output] 修饰符/e用于该子区段的所有区段是否默认展开。
函数包含了模块化的安装逻辑,在nsi脚本中函数分为两种:用户自定义函数和回调函数。用户自定义函数仅当是Call指令调用时才被执行,如果函数体中没有abort语句,则安装程序执行完了用户自定义函数,继续运行Call语句和指令。 用户自定义函数的语法如下: Function <函数名> # some commands FunctionEnd 函数的调用则使用以下语法: Call <函数名> 可见无论是函数的定义还是函数的调用都没有参数传递。通常nsi的参数传递是通过堆栈操作Pop,Push和20个寄存器变量$0~$9, $R0~$R9进行的。也可以通过全局变量完成参数传递。如: Var input ; Var output ; Section bla DeteailPrint "input is $input$\n" Call square DeteailPrint "square of $input is $output$\n" SectionEnd Function square output = input^2 FunctionEnd
回调函数则是由在特定的时间点触发的程序段。常用的回调函数如.onInit: Function .onInit MessageBox MB_YESNO "This will install My Program. Do you wish to continue?" IDYES gogogo Abort gogogo: FunctionEnd NSIS对于安装逻辑定义以下回调函数:.onGUIInit、.onInit、.onInstFailed、.onInstSuccess、. onGUIEnd、.onMouseOverSection、.onRebootFailed、.onSelChange、.onUserAbort、. onVerifyInstDir NSIS对于卸载逻辑定义以下回调函数:un.onGUIInit、un.onInit、un.onUninstFailed、un.onUninstSuccess、un.onGUIEnd、un.onRebootFailed、un.onUserAbort nsi脚本的变量定义 nsi脚本的变量定义用Var关键字,后跟变量名,变量是全局的并且是大小写敏感的。变量引用时需要加上前缀$。 除了用户自定义的变量外,nsi脚本中与定义寄存器变量$0~$9,$R0~$R9用于参数传递,以及系统变量用于特定用途,这些变量主要有: $INSTDIR,$OUTDIR,$CMDLINE,$LANGUAGE这些变量都是可写的。 $PROGRAMFILES,$COMMONFILES,$DESKTOP,$EXEDIR,${NSISDIR},$WINDIR,$SYSDIR,$ TEMP,$STARTMENU,$SMPROGRAMS,$SMSTARTUP,$QUICKLAUNCH,$DOCUMENTS,$SENDTO,$ RECENT,$F***ORITES,$MUSIC,$PICTURES,$VIDEOS,$NETHOOD,$FONTS,$TEMPLATES,$ APPDATA,$PRINTHOOD,$INTERNET_CACHE,$COOKIES,$HISTORY,$PROFILE,$ ADMINTOOLS,$RESOURCES,$RESOURCES_LOCALIZED,$CDBURN_AREA,$HWNDPARENT,$ PLUGINSDIR
nsi脚本中可用于调试的系统函数有MessageBoxes,DetailPrint,Dumpstate。 nsi脚本的编译器指令 nsi脚本的编译器指令主要指仅在编译时刻执行的命令。这些命令主要用来包含文件、条件化编译、定义常量、定义宏等。定义常量和宏是编译器指令最主要应用。 定义常量的示例: !define VERSION "1.0.3" Name "My Program ${VERSION}" OutFile "My Program Installer - ${VERSION}.exe" 定义宏的示例: !macro MyFunc UN Function ${UN}MyFunc Call ${UN}DoRegStuff ReadRegStr $0 HKLM Software\MyProgram key DetailPrint $0 FunctionEnd Modern UI Modern UI是感观上模仿最新的Windows系统的界面风格,它由欢迎页面、结束页面和其他向导页面构成。 插件 nsi支持插件,通过插件可以方便的扩展NSIS安装程序的功能。NSIS插件是用C++,Delphi等语言编写的dll,在nsi脚本中调用nsi中的函数使用如下语法: DLLName::FunctionName "参数1" "参数2" "参数3" 示例1: nsExec::ExecToLog '"${NSISDIR}\makensis.exe" /CMDHELP' 执行makensis.exe命令,显示该命令用法。 示例2: InstallOptions::dialog "$PLUGINSDIR\test.ini" 显示对话框 示例3: NSISdl::download http://download.nullsoft.com/winamp/client/winamp291_lite.exe $R0 下载文件 NSIS搜索插件的策略 默认情况下NSIS在其安装目录的子目录Plugins中搜索插件,用户可以使用!addplugindir指定增加插件的目录位置。 nsi脚本的基本语法 注释 单行注释用井号"#"或分号";",跨行注释用可以用c/C++中注释语法。 数据类型 数字 数字常量可以用十进制、十六进制(0x为前缀)、八进制(0为前缀)表示,颜色用类似html的中RGB表示法,但去井号"#"。 字符串 字符串常量可以用引号引用,转意字符用"$\"作前缀。美元符号、常用转意字符换行、回车、制表符的nsi语法表示分别为:$$,$\n,$\r,$\t 续行符 nsi脚本用行尾的反斜杠"\"表示下一行和当前行逻辑上是同一行 默认头文件 如果在makensis同目录下有nsisconf.nsh文件,该文件会被自动包含,除非编译时指定/NOCONFIG选项 标号 nsi使用GOTO语句和IfErrors, MessageBox, IfFileExists及StrCmp进行程序控制流表示,标号是这些语句的目标语句。标号定义的语法: 标号:语句 标号必须定义在函数和区段中,其作用范围仅限于定义它的区段或函数。以点号"."开头的标号是全局标号。 相对跳转 nsi脚本常常使用相对跳转表示条件分枝,其语法是[+-][1-9],加号表示从当前位置往前跳转,减号则表示从当前位置往后跳转。数字表示跳转的语句条数。示例: Goto +4 MessageBox MB_OK "The following message will be skipped" Goto +3 MessageBox MB_OK "You will never ever see this message box" Goto -3 MessageBox MB_OK "Done" 页面 向导页面是NSIS安装程序中最重要的界面元素,在nsi脚本中可以使用NSIS内置页面或者定制界面,通过脚本可以指定页面的顺序、显示样子和行为。 Page指令用来定义安装程序中的页面,UninstPage用来定义,此外PageEx指令提供类是功能,但提供更多选项。页面的顺序和它在nsi脚本中出现的次序一致。 示例: Page license Page components Page directory Page instfiles UninstPage uninstConfirm UninstPage instfiles 规定安装程序首先显示license页面,然后显示components选择页面,接着显示安装目录选择页面。 页面选项 不同的页面有不同的选项: License page有LicenseText,LicenseData,LicenseForceSelection; Components selection页面有ComponentText; Directory selection页面有DirText,DirVar(仅能在PageEx中使用),DirVerify; Un/Installation log页面有DetailsButtonText,CompletedText; Uninstall confirmation页面有DirVar(仅能在PageEx中使用),UninstallText 对于内置的Page,NSIS支持三个回调函数用于定制界面和验证,对于自定义页面NSIS支持两个回调函数。 Page指令语法 Page license|components|directory|instfiles|uninstConfirm) [pre_function] [show_function] [leave_function] 或者: Page custom [creator_function] [leave_function] [caption] 示例: Page license skipLicense "" stayInLicense Page custom customPage "" ": custom page" Page instfiles Function skipLicense MessageBox MB_YESNO "Do you want to skip the license page?" IDNO no Abort no: FunctionEnd Function stayInLicense MessageBox MB_YESNO "Do you want to stay in the license page?" IDNO no Abort no: FunctionEnd Function customPage GetTempFileName $R0 File /oname=$R0 customPage.ini InstallOptions::dialog $R0 Pop $R1 StrCmp $R1 "cancel" done StrCmp $R1 "back" done StrCmp $R1 "success" done error: MessageBox MB_OK|MB_ICONSTOP "InstallOptions error:$\r$\n$R1" done: FunctionEnd UninstPage指令语法 UninstPage custom [creator_function] [leave_function] [caption] OR UninstPage (license|components|directory|instfiles|uninstConfirm) [pre_function] [show_function] [leave_function]
PageEx语法 PageEx使用嵌套结构,比如: PageEx license LicenseText "Readme" LicenseData readme.rtf PageCallbacks licensePre licenseShow licenseLeave PageExEnd 常用的nsi指令 nsi大致可以分为基本指令、注册表及ini操作指令、通用指令、流程控制指令、文件操作指令、卸载指令、字符串处理指令、多语言支持指令、重启指令。 以下是常用的基本指令: Delete Delete [/REBOOTOK] file Exec Exec command ExecShell ExecShell action command [parameters] [SW_SHOWNORMAL | SW_SHOWMAXIMIZED | SW_SHOWMINIMIZED | SW_HIDE]ExecShell "open" 示例"http://nsis.sf.net/" ExecWait ExecWait command [user_var(exit code)] 示例: ExecWait '"$INSTDIR\someprogram.exe"' ExecWait '"$INSTDIR\someprogram.exe"' $0 DetailPrint "some program returned $0"
File File [/nonfatal] [/a] ([/r] [/x file|wildcard [...]] (file|wildcard) [...] | /oname=file.dat infile.dat) /r选项用作递归模式,/x用于排出文件 示例: File something.exe File /a something.exe File *.exe File /r *.dat File /r data File /oname=$TEMP\temp.dat somefile.ext File /nonfatal "a file that might not exist" File /r /x CVS myproject File /r /x *.res /x *.obj /x *.pch source Rename Rename [/REBOOTOK] source_file dest_file RMDir RMDir [/r] [/REBOOTOK] directory_name
|
|
| 出处:其他网站 作者:佚名 本文章由 金电网 搜集整理发布 |
|
|