NSIS安装制作程序

http://blog.csdn.net/byxdaz/article/details/4551356
分类: 开源软件 技术资料2009-09-14 14:43 677人阅读 评论(0) 收藏 举报

NSIS(Nullsoft Scriptable Install System)是一个开源的 Windows 系统下安装程序制作程序。它提供了安装、卸载、系统设置、文件解压缩等功能。这如其名字所指出的那样,NSIS 是通过它的脚本语言来描述安装程序的行为和逻辑的。NSIS 的脚本语言和通常的编程语言有类似的结构和语法,但它是为安装程序这类应用所设计的。

   1. NSIS的主要特点:

  —开销小,一个完整功能的安装程序仅需要 34k 的额外开销。

  —支持大多数 Windows 平台,包括:Windows 9.x,Windows NT,Windows 2000,Windows XP,Windows 2003

  —支持三大压缩算法:Zlig,BZips, LZMA

  —支持脚本

  —支持多语言

  —支持安装界面定制

  —提供可扩展的插件接口

  —支持网络安装、补丁

  —支持无人值守的安装模式

  —此外,NSIS的license允许任何用途免费使用。

  2. 开发一个NSIS的安装程序通常有以下几步:

  —确定安装的功能和界面元素

  —编写 NSIS 脚本

  —使用 NSIS 提供的 makensis 或者 makensisw 程序,将步骤 2 编写的脚本编译成可执行的安装程序

  —调试安装程序,如果有问题退到第二步重复

  —随着 NSIS 的流行,有一些第三方的 NSIS 脚本开发环境出现了,如 HMNISEdit,Venis IX。

  前者是完全开源的,后者仅对个人和非商业用途免费。在这些集成开发环境下,步骤2,3可以方便的组合在一起。

  3. NSIS 脚本的结构

  3.1 NSIS 脚本(下称 nsi 脚本)主要包含安装程序属性、页面、区段、函数。

  属性用来定义安装程序的行为和界面风格,这些属性大部分是编译时刻属性,即不能在运行时刻改变。

  页面是指安装程序的向导页面。

  示例:

  Page license

  Page components

  Page directory

  Page instfiles

  UninstPage uninstConfirm

  UninstPage instfiles

  3.2 区段是对应某种安装/卸载选项的处理逻辑,该段代码仅当用户选择相应的选项才被执行。

  卸载程序的区段名用"un."作 为前缀。

  示例:

  Section "Installer Section"

  SectionEnd

  Section "un.Uninstaller Section"

  SectionEnd

  3.3 在区段中可以使用很多指令用来完成诸如解压缩文件、读写注册表、创建目录、创建快捷方式等任务。

  但最常用的指令是 SetOutPath 和 File。前者用于指定目的位置,后者用于指定文件。

  示例:

  Section "My Program"

  SetOutPath $INSTDIR

  File "My Program.exe"

  File "Readme.txt"

  SectionEnd

  3.4 区段名的修饰符“/o”表示该区段默认不选上,“-”表示隐藏区段(匿名区段也是隐藏区段),“!”表示需要粗体显示的区段。

  SectionIn 表示该区段和安装类型之间的关系:

  SectionIn insttype_index [RO]

  RO 修饰符表示不可修改。

  3.5 子区段用于包含多个区段:

  SubSection [/e] Caption [subsection_name index output]

  修饰符“/e”用于该子区段的所有区段是否默认展开。

  3.6 函数包含了模块化的安装逻辑,在 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

  4. nsi 脚本的变量定义

  nsi 脚本的变量定义用 Var 关键字,后跟变量名,变量是全局的并且是大小写敏感的。变量引用时需要加上前缀“$”。

  除了用户自定义的变量外,nsi 脚本中与定义寄存器变量 $0~$9、$R0~$R9 用于参数传递,以及系统变量用于特定用途。

  这些变量主要有:

  $INSTDIR,$OUTDIR,$CMDLINE,$LANGUAGE 这些变量都是可写的。

  $PROGRAMFILES,$COMMONFILES,$DESKTOP,$EXEDIR,$WINDIR,$SYSDIR,$ TEMP,$STARTMENU

  $SMPROGRAMS,$SMSTARTUP,$QUICKLAUNCH,$DOCUMENTS,$SENDTO,$ RECENT,$FAVORITES

  $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。

  5. nsi脚本的编译器指令

  nsi 脚本的编译器指令主要指仅在编译时刻执行的命令。

  这些命令主要用来包含文件、条件化编译、定义常量、定义宏等。

  定义常量和宏是编译器指令最主要应用。

  定义常量的示例:

  !define VERSION "1.0.3"

  Name "My Program $"

  OutFile "My Program Installer - $.exe"

  定义宏的示例:

  !macro MyFunc UN

  Function $MyFunc

  Call $DoRegStuff

  ReadRegStr HKLM Software/MyProgram key

  DetailPrint

  FunctionEnd

  6. Modern UI

  Modern UI 是感观上模仿最新的 Windows 系统的界面风格,它由欢迎页面、结束页面和其他向导页面构成。

  7. 插件

  nsi 支持插件,通过插件可以方便的扩展 NSIS 安装程序的功能。

  NSIS 插件是用 C++、Delphi 等语言编写的 dll,在 nsi 脚本中调用 nsi 中的函数使用如下语法:

  DLLName::FunctionName "参数1" "参数2" "参数3"

  示例1:

  nsExec::ExecToLog '"$/makensis.exe" /CMDHELP'

  执行makensis.exe命令,显示该命令用法。

  示例2:

  InstallOptions::dialog "$PLUGINSDIR/test.ini"

  显示对话框

  示例3:

  NSISdl::download http://download.nullsoft.com/winamp/client/winamp291_lite.exe $R0

  下载文件

  8. NSIS 搜索插件的策略

  默认情况下 NSIS 在其安装目录的子目录 Plugins 中搜索插件,用户可以使用 !addplugindir 指定增加插件的目录位置。

  9. nsi 脚本的基本语法

  9.1 注释

  单行注释用井号“#”或分号“;”,跨行注释用可以用“C/C++”中注释语法。

  9.2 数据类型

  9.2.1 数字

  数字常量可以用十进制、十六进制(0x为前缀)、八进制(0为前缀)表示。

  颜色用类似 HTML 的中 RGB 表示法,但去 井号“#”。

  9.2.2 字符串

  字符串常量可以用引号引用,转意字符用"$/"作前缀。

  美元符号、常用转意字符换行、回车、制表符的nsi语法表示分别为:$$,$/n,$/r,$/t

  9.2.3 续行符

  nsi 脚本用行尾的反斜杠“/”表示下一行和当前行逻辑上是同一行。

  9.2.4 默认头文件

  如果在makensis同目录下有nsisconf.nsh文件,该文件会被自动包含,除非编译时指定/NOCONFIG选项。

  9.2.5 标号

  nsi 使用 GOTO 语句和 IfErrors、MessageBox、IfFileExists 及 StrCmp 进行程序控制流表示,标号是这些语句的目标语句。

  标号定义的语法:标号:语句

  标号必须定义在函数和区段中,其作用范围仅限于定义它的区段或函数。以点号“.”开头的标号是全局标号。

  9.3 相对跳转

  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"

  10. 页面

  向导页面是 NSIS 安装程序中最重要的界面元素,在 nsi 脚本中可以使用 NSIS 内置页面或者定制界面,通过脚本可以指定页面的顺序、显示样子和行为。Page指令用来定义安装程序中的页面,UninstPage用来定义,此外PageEx指令提供类是功能,但提供更多选项。页面的顺序和它在nsi脚本中出现的次序一致。

  示例:

  Page license

  Page components

  Page directory

  Page instfiles

  UninstPage uninstConfirm

  UninstPage instfiles

  规定安装程序首先显示license页面,然后显示components选择页面,接着显示安装目录选择页面。

  10.1 页面选项

  不同的页面有不同的选项:

  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]

  或

  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

  11. 常用的 nsi 指令

  nsi 大致可以分为基本指令、注册表及 ini 操作指令、通用指令、流程控制指令、文件操作指令、卸载指令、字符串处理指令、多语言支持指令、重启指令。

  以下是常用的基本指令:

  (1) Delete:

  Delete [/REBOOTOK] file

  (2) Exec:

  Exec command

  (3) ExecShell:

  ExecShell action command [parameters] [SW_SHOWNORMAL | SW_SHOWMAXIMIZED | SW_SHOWMINIMIZED | SW_HIDE]ExecShell "open" 示例"http://nsis.sf.net/"

  ExecWait

  ExecWait command

  示例:

  ExecWait '"$INSTDIR/someprogram.exe"'

  ExecWait '"$INSTDIR/someprogram.exe"'

  DetailPrint "some program returned "

  (4) 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

  (5) Rename:

  Rename [/REBOOTOK] source_file dest_file

  (6) RMDir:

  RMDir [/r] [/REBOOTOK] directory_name

NSIS发布版本与源代码下载:http://nsis.sourceforge.net/Download

NSIS安装包制作教程详细版:http://download.csdn.net/source/664095

NSIS入门教程:http://blog.163.com/nine_skys/blog/static/293423252007991104695/

NSIS安装制作程序相关推荐

  1. NSIS安装制作基础教程[初级篇], 献给对NSIS有兴趣的初学者

    NSIS简介: NSIS 是"Nullsoft 脚本安装系统"(Nullsoft Scriptable Installation System)的缩写,它是一个免费的 Win32 ...

  2. NSIS安装制作基础教程

    NSIS简介: NSIS 是"Nullsoft 脚本安装系统"(Nullsoft Scriptable Installation System)的缩写,它是一个免费的 Win32 ...

  3. NSIS对卸载程序的签名

    NSIS对卸载程序的签名 方案一: 思路: 把安装脚本里的卸载部分抽出来单独做一个卸载脚本,卸载脚本编译成exe后进行签名,再把卸载程序打包进安装包,最后对安装包进行签名 步骤: 1.从安装脚本中找到 ...

  4. 安装制作工具开源软件

    Python打包工具 PyInstaller PyInstaller 是一个用来将 Python 程序打包成一个独立可执行软件包,支持 Windows.Linux 和 Mac OS X.更多PyIns ...

  5. 【小米手环7】使用 Zeus + 表盘自定义工具 为小米手环7开发和安装小程序

    有关 Zepp OS Zepp OS 是华米开发的一个 RTOS,运行在手表.手环等设备上. 最新发布的小米手环7 / 7NFC 搭载的就是由华米研发的 Zepp OS.相比与之前小米手环搭载的 RT ...

  6. 使用NSIS脚本制作一个安装包

    大部分人第一次看到NSIS脚本都是一脸懵逼的.因为它这个脚本的结构乍一看上去就非常奇怪,不作说明的话是看不懂的. 编写脚本命令的时候要非常注意,命令要按照规定写在脚本中不同的段落里,也就是说,命令的先 ...

  7. 计算机2010应用安装方法,ppt2010安装应用程序教程

    在生活,工作中,ppt被运用得淋漓尽致,自己也想做个ppt了吧,要想制作ppt首先就得有制作ppt的软件;那电脑怎么装ppt软件呢,下面学习啦给大家分享ppt2010安装应用程序的方法,希望看完本教程 ...

  8. 各种安装包打包发布工具(安装制作工具)评测

    各种安装包打包发布工具(安装制作工具)评测        作为程序员,经常遇到需要打包自己劳动成果的时候,这也算是广大码工辛苦奔波之后的杀青之作,收尾之笔.因此,安装包制作的好坏也直接关系到整个工程项 ...

  9. Visual Studio 2010制作程序安装包

    所谓程序安装包,可以简单理解为一种压缩包,即将你自己所写程序所需要的所有资源,如动态链接库dll.图标文件ico,甚至是调用的第三方可执行程序exe,打包并压缩.当用户运行该安装包时,再将相应的资源解 ...

最新文章

  1. HDU1527(博弈论)
  2. saltstack state模块-状态管理
  3. 组策略部署软件----将部署的软件分类
  4. pc端常见布局样式总结(针对常见的)
  5. Hadoop配置SSH直接登录
  6. 图的邻接表存储与深度优先遍历代码实现
  7. 深究AngularJS——ng-drag、ng-drop
  8. ios 不被遮挡 阴影_为何你没见到日环食?你不知道的天象常识原来还有这么多 | 返朴...
  9. 罗永浩电商直播尘埃落定?有图有真相,坐等相声开播...
  10. 计算机基础0018,自学考试计算机用基础 0018复习资料.doc
  11. 两种语言“争霸赛”,PHP速度领先C#
  12. 关于最新上映电影的评论
  13. 西门子PLC程序下载方法简介
  14. java对接金蝶接口
  15. 科创板设立 币圈走向几何?
  16. 常见软件非功能性需求描述案例
  17. 王家林 构建spark集群
  18. 清除浮动(解决高度坍塌的问题)的方法5种
  19. MFC中CImage类显示的半透明PNG存在的问题以及处理方法
  20. 墨菲定律|马太效应|破窗理论|蝴蝶效应

热门文章

  1. html的meta用法
  2. 活跃用户数怎么计算_不懂LTV,怎么做用户增长?详解用户生命周期价值计算方法...
  3. 杭电1789贪心java实现
  4. 岛屿类-网格类问题-DFS | 力扣695. 岛屿的最大面积
  5. 关于文本编辑器我为什么墙裂推荐你使用Notepad++
  6. Spring Cloud(二) 配置Eureka Client
  7. 关于mount --bind的理解。
  8. 【转】解决:ORA-19602: cannot backup or copy active file in NOARCHIVELOG mode
  9. graphpad 折线图横坐标比例_GraphPad Prism绘制剂量反应曲线
  10. Tomcat的安装与配置(新手向)