二. 简单的NSIS安装包

新建脚本:向导

我们先从一个简单的NSIS安装包开始吧,就像前面(NSIS介绍)所说,我们虽然看过用户手册,可要写安装脚本无从下手,那我们的编辑工具HM NIS Edit就派上用场了。

打开HM NIS Edit,点击菜单“文件”->“新建脚本:向导”,会有向导一步步让我们输入信息,最后根据我们的输入生成.nsi脚本文件,下面我们一步步演示:

新建脚本:脚本文件

最后生成的脚本文件我们保存为MyApp.nsi,打开查看脚本(对照着上面截图中设置的项再配合用户手册查看,你会知道一个完整的脚本文件的基本结构和基本的指令用法)

; Script generated by the HM NIS Edit Script Wizard.; HM NIS Edit Wizard helper defines
!define PRODUCT_NAME "My application"
!define PRODUCT_VERSION "1.0"
!define PRODUCT_PUBLISHER "My company, Inc."
!define PRODUCT_WEB_SITE "http://www.mycompany.com"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"; MUI 1.67 compatible ------
!include "MUI.nsh"; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"; Welcome page
!insertmacro MUI_PAGE_WELCOME
; License page
!insertmacro MUI_PAGE_LICENSE "E:\ZZL\ADWeb\安装包制作\Licence.txt"
; Directory page
!insertmacro MUI_PAGE_DIRECTORY
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
; Finish page
!insertmacro MUI_PAGE_FINISH; Uninstaller pages
!insertmacro MUI_UNPAGE_INSTFILES; Language files
!insertmacro MUI_LANGUAGE "SimpChinese"; MUI end ------Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "Setup.exe"
InstallDir "$PROGRAMFILES\My application"
ShowInstDetails show
ShowUnInstDetails showSection "MainSection" SEC01SetOutPath "$INSTDIR"SetOverwrite tryFile "E:\ZZL\ADWeb\安装包制作\Release\404.aspx"File "E:\ZZL\ADWeb\安装包制作\Release\Default.aspx"File "E:\ZZL\ADWeb\安装包制作\Release\Error.aspx"SetOutPath "$INSTDIR\Images"File "E:\ZZL\ADWeb\安装包制作\Release\Images\1_close.png"File "E:\ZZL\ADWeb\安装包制作\Release\Images\1_open.png"File "E:\ZZL\ADWeb\安装包制作\Release\Images\add.png"SetOutPath "$INSTDIR\Scripts"File "E:\ZZL\ADWeb\安装包制作\Release\Scripts\CommonScript.js"SetOutPath "$INSTDIR\SystemLog"File "E:\ZZL\ADWeb\安装包制作\Release\SystemLog\LogStatisticsDetail.aspx"File "E:\ZZL\ADWeb\安装包制作\Release\SystemLog\SystemLogList.aspx"File "E:\ZZL\ADWeb\安装包制作\Release\SystemLog\SystemLogStatistics.aspx"SetOutPath "$INSTDIR"File "E:\ZZL\ADWeb\安装包制作\Release\Web.config"
SectionEndSection -PostWriteUninstaller "$INSTDIR\uninst.exe"WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
SectionEndFunction un.onUninstSuccessHideWindowMessageBox MB_ICONINFORMATION|MB_OK "$(^Name) 已成功地从你的计算机移除。"
FunctionEndFunction un.onInitMessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "你确实要完全移除 $(^Name) ,其及所有的组件?" IDYES +2Abort
FunctionEndSection UninstallDelete "$INSTDIR\uninst.exe"Delete "$INSTDIR\Web.config"Delete "$INSTDIR\SystemLog\SystemLogStatistics.aspx"Delete "$INSTDIR\SystemLog\SystemLogList.aspx"Delete "$INSTDIR\SystemLog\LogStatisticsDetail.aspx"Delete "$INSTDIR\Scripts\CommonScript.js"Delete "$INSTDIR\Images\add.png"Delete "$INSTDIR\Images\1_open.png"Delete "$INSTDIR\Images\1_close.png"Delete "$INSTDIR\Error.aspx"Delete "$INSTDIR\Default.aspx"Delete "$INSTDIR\404.aspx"RMDir "$INSTDIR\SystemLog"RMDir "$INSTDIR\Scripts"RMDir "$INSTDIR\Images"RMDir "$INSTDIR"DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"SetAutoClose true
SectionEnd

值得注意的是,从新建脚本向导的第三步有选项用户图形界面我们默认选择的是“现代”,对应脚本中引入了NSIS现代用户界面头文件(!include "MUI.nsh"),对应的安装页面中都是以!insertmacro MUI_PAGE_***开头(如:欢迎页面!insertmacro MUI_PAGE_WELCOME),详细的说明请查看NSIS Modern User Interface。

安装包:现代界面

下面我们看下安装包的效果,在HM NIS Edit界面,点击菜单“NSIS”->“编译并运行”,输出窗口会显示编译过程,如果没有出错,会直接执行编译生成的Setup.exe,安装截图如下:

从上面截图可以看到我们的安装包共有5个用户界面,这个和脚本文件中是对应的:

; Welcome page
!insertmacro MUI_PAGE_WELCOME
; License page
!insertmacro MUI_PAGE_LICENSE "E:\ZZL\ADWeb\安装包制作\Licence.txt"
; Directory page
!insertmacro MUI_PAGE_DIRECTORY
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
; Finish page
!insertmacro MUI_PAGE_FINISH

其中“安装记录页面”将实际执行安装区段中的指令,这些指令可以解压文件读取,读写注册表、INI文件或普通文件,执行Powershell脚本,创建目录,创建快捷方式等等。如果一个安装程序有多个组件,每个组件都有它自己的代码块,当用户选择了安装该组件,那么安装程序就会执行对应的代码,那么每个组件就需要对应一个区段,具体关于可选组件的信息会在以后章节介绍。我们目前只有一个安装区段,是把部署包文件放入安装目录:

Section "MainSection" SEC01SetOutPath "$INSTDIR"SetOverwrite tryFile "E:\ZZL\ADWeb\安装包制作\Release\404.aspx"File "E:\ZZL\ADWeb\安装包制作\Release\Default.aspx"File "E:\ZZL\ADWeb\安装包制作\Release\Error.aspx"SetOutPath "$INSTDIR\Images"File "E:\ZZL\ADWeb\安装包制作\Release\Images\1_close.png"File "E:\ZZL\ADWeb\安装包制作\Release\Images\1_open.png"File "E:\ZZL\ADWeb\安装包制作\Release\Images\add.png"Sleep 20000SetOutPath "$INSTDIR\Scripts"File "E:\ZZL\ADWeb\安装包制作\Release\Scripts\CommonScript.js"SetOutPath "$INSTDIR\SystemLog"File "E:\ZZL\ADWeb\安装包制作\Release\SystemLog\LogStatisticsDetail.aspx"File "E:\ZZL\ADWeb\安装包制作\Release\SystemLog\SystemLogList.aspx"File "E:\ZZL\ADWeb\安装包制作\Release\SystemLog\SystemLogStatistics.aspx"SetOutPath "$INSTDIR"File "E:\ZZL\ADWeb\安装包制作\Release\Web.config"
SectionEnd

关于界面上的信息都是我们在脚本向导中设置的(如应用程序名称、版本、公司、图标、授权信息、语言等),可以在脚本中修改:

; HM NIS Edit Wizard helper defines
!define PRODUCT_NAME "My application"
!define PRODUCT_VERSION "1.0"
!define PRODUCT_PUBLISHER "My company, Inc."
!define PRODUCT_WEB_SITE "http://www.mycompany.com"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"; MUI 1.67 compatible ------
!include "MUI.nsh"; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"

还有一些是关于安装包本身的信息(如:名称、默认安装路径、生成安装包名称、是否显示安装详情等):

Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "Setup.exe"
InstallDir "$PROGRAMFILES\ADWebManager"
InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""
ShowInstDetails show
ShowUnInstDetails show
BrandingText " MyCompany Ltd."

其中注意加一行命令BrandingText " Prolliance Ltd.",这样用户安装界面中就不是NSIS的信息了,前后对比如下:

修改脚本:标准界面

上面我们使用HM NIS Edit的向导创建了具有“现代界面”的安装包,其中脚本文件中引入了NSIS现代用户界面头文件(!include "MUI.nsh"),现在我们不要引入额外的头文件,改成NSIS标准的界面试试,就像我们查看用户手册看到的,我们可以通过Page命令(或更多高级设置如PageEx)。我们修改后的脚本文件如下:

; Script generated by the HM NIS Edit Script Wizard.; HM NIS Edit Wizard helper defines
!define PRODUCT_NAME "My application"
!define PRODUCT_VERSION "1.0"
!define PRODUCT_PUBLISHER "My company, Inc."
!define PRODUCT_WEB_SITE "http://www.mycompany.com"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"; pages
PageEx licenseLicenseText "许可页面"LicenseData "E:\ZZL\ADWeb\安装包制作\Licence.txt";LicenseForceSelection
PageExEnd
PageEx directoryDirText "目录选择页面" "目标文件夹" "浏览..."
PageExEnd
Page instfiles
UninstPage uninstConfirm
UninstPage instfiles; MUI end ------Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "Setup.exe"
InstallDir "$PROGRAMFILES\My application"
ShowInstDetails show
ShowUnInstDetails show
BrandingText " MyCompany Ltd."Section "MainSection" SEC01SetOutPath "$INSTDIR"SetOverwrite tryFile "E:\ZZL\ADWeb\安装包制作\Release\404.aspx"File "E:\ZZL\ADWeb\安装包制作\Release\Default.aspx"File "E:\ZZL\ADWeb\安装包制作\Release\Error.aspx"SetOutPath "$INSTDIR\Images"File "E:\ZZL\ADWeb\安装包制作\Release\Images\1_close.png"File "E:\ZZL\ADWeb\安装包制作\Release\Images\1_open.png"File "E:\ZZL\ADWeb\安装包制作\Release\Images\add.png"Sleep 20000SetOutPath "$INSTDIR\Scripts"File "E:\ZZL\ADWeb\安装包制作\Release\Scripts\CommonScript.js"SetOutPath "$INSTDIR\SystemLog"File "E:\ZZL\ADWeb\安装包制作\Release\SystemLog\LogStatisticsDetail.aspx"File "E:\ZZL\ADWeb\安装包制作\Release\SystemLog\SystemLogList.aspx"File "E:\ZZL\ADWeb\安装包制作\Release\SystemLog\SystemLogStatistics.aspx"SetOutPath "$INSTDIR"
SectionEndSection -PostWriteUninstaller "$INSTDIR\uninst.exe"WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
SectionEndFunction un.onUninstSuccessHideWindowMessageBox MB_ICONINFORMATION|MB_OK "$(^Name) 已成功地从你的计算机移除。"
FunctionEndFunction un.onInitMessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "你确实要完全移除 $(^Name) ,其及所有的组件?" IDYES +2Abort
FunctionEndSection UninstallDelete "$INSTDIR\uninst.exe"Delete "$INSTDIR\Web.config"Delete "$INSTDIR\SystemLog\SystemLogStatistics.aspx"Delete "$INSTDIR\SystemLog\SystemLogList.aspx"Delete "$INSTDIR\SystemLog\LogStatisticsDetail.aspx"Delete "$INSTDIR\Scripts\CommonScript.js"Delete "$INSTDIR\Images\add.png"Delete "$INSTDIR\Images\1_open.png"Delete "$INSTDIR\Images\1_close.png"Delete "$INSTDIR\Error.aspx"Delete "$INSTDIR\Default.aspx"Delete "$INSTDIR\404.aspx"RMDir "$INSTDIR\SystemLog"RMDir "$INSTDIR\Scripts"RMDir "$INSTDIR\Images"RMDir "$INSTDIR"DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"SetAutoClose true
SectionEnd

安装包:标准界面

下面我们看下标准界面的脚本生成的安装包效果,执行后在HM NIS Edit界面,点击菜单“NSIS”->“编译并运行”,输出窗口会显示编译过程,如果没有出错,会直接执行编译生成的Setup.exe,安装截图如下:

是不是比较起来“现代用户界面”,标准的界面会很丑,而且NSIS内置的标准安装界面没有欢迎、完成界面(只有许可、目录选择、组件、安装记录页面) ,另外“上一步”、“下一步”、“取消”等按钮需要额外的语言包文件来载入,不如“现代用户界面”只需要一个指令(!insertmacro MUI_LANGUAGE "SimpChinese")来指定采用的语言,所以接下来我们还是采用“现代用户界面”来制作安装包,当然这些界面上的图标,任何地方的文字都是可以定制的。

下面章节就以实际中的应用作为例子,然后由该例子展开来说明页面的定制、PowerShell命令的调用、SQL Server数据库的访问、Web应用程序的部署、失败的回滚和卸载程序的执行等等。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/432039.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ubuntu 14.04 LAMP搭建(Apache 2.47+MySQL 5.5+PHP5.5)

Ubuntu 14.04 LAMP搭建(Apache 2.47MySQL 5.5PHP5.5) 原文:Ubuntu LAMP搭建 为了数据库课程设计,只好自己搭一个数据库系统,采用LAMP方式。 一、安装 1.安装Apache sudo apt-get install apache2 Apache在安装期间会新建一个目录:/var/www&am…

C++变量未初始的后果

#include <iostream> using namespace std;void dummy(int &a) {}int main() {int i 2;while (i--){int a;dummy(a);if (i 1){a 100;}cout << a << endl;cout << &a << endl;}getchar(); } 上面程序&#xff0c;如果变量a没有初始化…

NSIS 查找文件是否存在,并设置安装路径

Var GIT Function .onInit!insertmacro MUI_LANGDLL_DISPLAYStrCpy $GIT "false"MessageBox MB_OK $9IfFileExists "C:\Program Files\Git\git-cmd.exe" 0 4MessageBox MB_OK "Git已安装"StrCpy $INSTDIR "C:\Program Files\Git"StrCp…

国内主流云主机比较

随着国内云主机技术日趋成熟&#xff0c;云主机的优势越来越明显&#xff0c;用户对云主机的态度也由观望变为乐于尝试。国内各大云主机商也放低姿态&#xff0c;产品设置和定价上逐渐迎合个人用户和中小型企业用户的需求。 云主机的诸多好处&#xff1a;集群计算、处理能力可弹…

30 个很棒的 PHP 开源 CMS 内容管理系统

本文汇集了30个优秀的开源CMS建站系统&#xff0c;采用PHP开发。以下列表不分先后顺序。 1. AdaptCMS AdaptCMS Lite 是一个开源的CMS系统&#xff0c;主要特点是易用&#xff0c;而且可以轻松和其他系统接驳&#xff0c;提供简单的扩展定制途径&#xff0c;一个简单而且功能强…

Alwayson常用脚本

1、修改实例下所有节点的数据同步模式&#xff0c;在master数据库下运行 --查找所有异步提交的辅助节点&#xff0c;修改为同步提交模式 -- SYNCHRONOUS_COMMIT 同步提交模式 -- ASYNCHRONOUS_COMMIT 异步提交模式 select ALTER AVAILABILITY GROUP [a.name] MODIFY REPLICA…

Package ‘*****‘ has no installation candidate

如果在apt源中未找到软件&#xff0c;去ubuntu的软件包搜索页面中去搜索该软件 Ubuntu – Ubuntu Packages Search https://packages.ubuntu.com/ 前面红字找到对应ubuntu版本的软件版本名称&#xff0c;后面中括号为仓库名称&#xff0c;然后写入到/etc/apt/sources.list中 …

Oracle 客户端连接服务器[转]

很多朋友在开发项目中并不是每个人用一个数据库&#xff0c;而是有单独的一台主机作为开发的数据库服务器&#xff0c;这样&#xff0c;就需要我们的开发人员去连接它。 首先是进入oracle的 Net Mananger&#xff1b; 接下来就是进行简单的设置了。。 &am…

p3d gauge 尺寸问题

1. 在panel.cfg中&#xff0c;每个window可以有多个gauge&#xff0c;window是gauge的容器 2. 在panel.cfg中&#xff0c;background_color为window背景色&#xff0c;如果设置为0&#xff0c;0&#xff0c;0&#xff0c;未被gauge覆盖的 部分会透明 3. 在panel.cfg中&#…

BZOJ2199 [Usaco2011 Jan]奶牛议会

首先建立一个2-SAT的裸模型&#xff0c;然后发现。。。tarjan没法判断?的情况 于是暴力对每一个议案check一下&#xff0c;直接dfs即可 1 /**************************************************************2 Problem: 21993 User: rausen4 Language: C5 Resu…

ubuntu 远程桌面

1. apt-get install xrdp 2. apt-get install dconf-editor 3. 启动 dconf-editor&#xff0c;org->gnome->desktop->remote-access&#xff0c;取消 “requlre-encryption”的勾选 4. 打开系统左上角的"Search your computer"&#xff0c;然后找到“Des…

记录:Android中StackOverflow的问题

最近新作的项目上线&#xff0c;出现了一个让人抓狂的问题。在此记录一下&#xff01; 现在的项目中&#xff0c;制作了一个界面非常复杂。整个结构是最外层一个Layout&#xff0c;封装了Menu键吊起的菜单&#xff0c;整个内容使用一个FrameLayout装载&#xff0c;这个layout中…

OpenDrive记录

1. junction里面只有一半的链接关系&#xff0c;也就是只有road进入junction的链接关系&#xff0c;没有junction出 去的链接关系。 拿路径搜索方法举例&#xff0c; 1&#xff09; 如果当前road的前方是junction&#xff0c;即当前road的predecessor或者successor是juncti…

JavaWeb高性能开发(一)

今日要闻: 淘宝删差评产业链 在你给出“差评”“中评”后不久&#xff0c;有人会偷偷登录你的淘宝账户&#xff0c;把你之前给过的评价删除或改成“好评”。而这种人就是“职业修改差评师” 案发前&#xff0c;李骏杰在杭州市滨江区一家科技公司上班。5 人当中&#xff0c;他主…

凸多边形的面积问题

Q&#xff1a;给定顶点坐标&#xff0c;求凸多边形的面积&#xff0c;保留两位小数。 样例输入&#xff1a; 4 3 3 3 0 1 2 1 0 样例输出 5.00 S&#xff1a; #include<stdio.h> #include<math.h> #include<stdlib.h> double dist(struct point A,struct poi…

从此明白了卷积神经网络(CNN)

卷积神经网络是一种曾经让我无论如何也无法弄明白的东西&#xff0c;主要是名字就太“高级”了&#xff0c;网上的各种各样的文章来介绍“什么是卷积”尤为让人受不了。听了吴恩达的网课之后&#xff0c;豁然开朗&#xff0c;终于搞明白了这个东西是什么和为什么。我这里大概会…

Linux 输入子系统原理理解(原创)

linux 输入子系统原理理解&#xff08;原创&#xff09; 以前学了单独的按键设备驱动以及鼠标驱动&#xff0c;实际上&#xff0c;在linux中实现这些设备驱动&#xff0c;有一种更为推荐的方法&#xff0c;就是input输入子系统。平常我们的按键&#xff0c;触摸屏&#xff0…

Logistic Regression:最基础的神经网络

一、什么是logictic regression 下面的图是Andrew Ng提供的一个用logistic regression来识别主子的图片的算法结构示意图&#xff1a; 「左边」的「x0到x12287「是输入&#xff08;input&#xff09;&#xff0c;我们称之为」特征&#xff08;feather&#xff09;」&#xff0…