1、什么是NSIS

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

     特点:

—开销小,一个完整功能的安装程序仅需要 34k 的额外开销。
—支持大多数 Windows 平台,包括:Windows 9.x,Windows NT,Windows 2000,Windows XP,Windows 2003
—支持三大压缩算法:ZLib,BZip2, LZMA
—支持脚本
—支持多语言
—支持安装界面定制
—提供可扩展的插件接口
—支持网络安装、补丁
—支持无人值守的安装模式
—此外,NSIS的license允许任何用途免费使用。

以上引自: 百度百科

2、我与NSIS的际遇

  接触NSIS是因为工作的需要,因为公司做的项目以winform为主,而winform开发这块就我一个人负责,程序开发我一个人完成,做出来了,打包怎么办呢?小公司没有什么专业弄打包这块的,所以自己想办法呗,反正老板只要结果。没办法,只好自己硬着头皮上咯。网上搜了些NSIS的资料,找到了一个学习NSIS打包的一个比较好的博客(地址:轻狂志),也学习到了一些东西。想起自己来博客园两年了,还从未在博客园上发表过自己的博客文章,所以本着突破自己的心情,也是表示向我的老乡晴天猪学习的决心,所以发表了此文,借此分享给那些需要的人吧!

3、废话不多说,直接上源码

  以下是我为我公司打包的一个广告制作管理软件的打包源码,包含mysql数据打包安装。由于怕别人说我是做广告来的,所以将公司名字给用XX注释掉了,打包完整源码如下:

  

; 该脚本使用 HM VNISEdit 脚本编辑器向导产生; 安装程序初始定义常量
!define PRODUCT_NAME "XX广告制作软件"
!define PRODUCT_VERSION "2.2"
!define PRODUCT_PUBLISHER "XX.com, Inc."
!define PRODUCT_WEB_SITE "http://www.1bsoft.com"
!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\YBest.Ads.exe"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"SetCompressor lzma; ------ MUI 现代界面定义 (1.67 版本以上兼容) ------
!include "MUI.nsh"
!include "WordFunc.nsh"; MUI 预定义常量
!define MUI_ABORTWARNING
!define MUI_ICON "ybkj.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"; 欢迎页面
!insertmacro MUI_PAGE_WELCOME
; 许可协议页面
!insertmacro MUI_PAGE_LICENSE "Readme.txt"
; 安装目录选择页面
!insertmacro MUI_PAGE_DIRECTORY
; 安装过程页面
!insertmacro MUI_PAGE_INSTFILES
; 安装完成页面
!define MUI_FINISHPAGE_RUN "$INSTDIR\YBest.Ads.exe"
!insertmacro MUI_PAGE_FINISH; 安装卸载过程页面
!insertmacro MUI_UNPAGE_INSTFILES; 安装界面包含的语言设置
!insertmacro MUI_LANGUAGE "SimpChinese"
;文件版本声明
VIProductVersion "2.2.0.0"
VIAddVersionKey /LANG=2052 "ProductName" "XX广告制作软件"
VIAddVersionKey /LANG=2052 "Comments" "软件版权归XX软件所有,他人不得复制或二次开发本程序。"
VIAddVersionKey /LANG=2052 "CompanyName" "www.XX.com"
VIAddVersionKey /LANG=2052 "LegalTrademarks" "XX软件"
VIAddVersionKey /LANG=2052 "LegalCopyright" "XX.com"
VIAddVersionKey /LANG=2052 "FileDescription" "XX广告制作软件安装程序"
VIAddVersionKey /LANG=2052 "FileVersion" "2.2.0.0"; 安装预释放文件
!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
; ------ MUI 现代界面定义结束 ------

Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "YBSetup.exe"
InstallDir "$PROGRAMFILES\XX广告制作软件"
InstallDirRegKey HKLM "${PRODUCT_UNINST_KEY}" "UninstallString"
ShowInstDetails show
ShowUnInstDetails show
BrandingText "XX软件 www.XX.com"
DirText "安装向导将把 $(^NameDA) 安装在下列文件夹,如果要安装到其他文件夹请单击 [浏览(B)] 进行选择。"Section "MainSection" SEC01SetOutPath "$INSTDIR"SetOverwrite ifnewerCreateDirectory "$SMPROGRAMS\XX广告制作软件"CreateShortCut "$SMPROGRAMS\XX广告制作软件\XX广告制作软件.lnk" "$INSTDIR\YBest.Ads.exe"CreateShortCut "$DESKTOP\XX广告制作软件.lnk" "$INSTDIR\YBest.Ads.exe"File "DevComponents.DotNetBar2.dll"File "DevComponents.DotNetBar2.xml"File "LitJSON.dll"File "MySql.Data.dll"File "NPOI.dll"File "ybkj.ico"File "YBest.Ads.exe"File "YBest.Ads.exe.config"File "YBest.BLL.dll"File "YBest.Common.dll"File "YBest.DAL.dll"File "YBest.DBUtility.dll"File "YBest.Model.dll"File "Readme.txt"File "MqttLib.dll"File "PullService.dll"SetOutPath "$INSTDIR\XmlConfig"SetOverwrite ifnewerFile /r "XmlConfig\*"SetOutPath "$INSTDIR\images"SetOverwrite ifnewerFile /r "images\*"SetOutPath "$INSTDIR\mysql5.1"SetOverwrite ifnewerFile /r "mysql5.1\*";安装mysql服务
  call installMysql
SectionEndSection -AdditionalIconsWriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}"CreateShortCut "$SMPROGRAMS\XX广告制作软件\XX软件官网.lnk" "$INSTDIR\${PRODUCT_NAME}.url"CreateShortCut "$SMPROGRAMS\XX广告制作软件\卸载${PRODUCT_NAME}.lnk" "$INSTDIR\uninst.exe"
SectionEndSection -PostWriteUninstaller "$INSTDIR\uninst.exe"WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\AdsBow.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}" "DisplayIcon" "$INSTDIR\AdsBow.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}"WriteRegDword HKLM "${PRODUCT_DIR_REGKEY}" "Installed" 1WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "InstalledPath" "$INSTDIR"WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "version" "${PRODUCT_VERSION}" ;写入版本号
SectionEndSection -.NET
Call GetNetFrameworkVersion
Pop $R1${If} $R1 < '2.0.50727'SetDetailsPrint textonlyDetailPrint "正在安装 .NET Framework 2.0,这个可能需要几分钟,请耐心等待..."SetDetailsPrint listonlySetOutPath "$TEMP"SetOverwrite onFile "NetFx20SP2_x86.exe"ExecWait '$TEMP\NetFx20SP2_x86.exe /quiet /norestart' $R1Delete "$TEMP\NetFx20SP2_x86.exe"${EndIf}
SectionEnd/*******************************  以下是安装程序的卸载部分  *******************************/Section UninstallDelete "$INSTDIR\${PRODUCT_NAME}.url"Delete "$INSTDIR\uninst.exe"Delete "$INSTDIR\YBest.Ads.exe"Delete "$INSTDIR\YBest.Ads.exe.config"Delete "$INSTDIR\YBest.BLL.dll"Delete "$INSTDIR\YBest.Common.dll"Delete "$INSTDIR\YBest.DAL.dll"Delete "$INSTDIR\YBest.DBUtility.dll"Delete "$INSTDIR\YBest.Model.dll"Delete "$INSTDIR\DevComponents.DotNetBar2.dll"Delete "$INSTDIR\DevComponents.DotNetBar2.xml"Delete "$INSTDIR\LitJSON.dll"Delete "$INSTDIR\MySql.Data.dll"Delete "$INSTDIR\NPOI.dll"Delete "$INSTDIR\ybkj.ico"Delete "$INSTDIR\Readme.txt"Delete "$INSTDIR\MqttLib.dll"Delete "$INSTDIR\PullService.dll";停止mysql服务 并移除服务
  call un.removeService; 循环删除文件直至删除文件夹RMDir /r "$INSTDIR\images"RMDir /r "$INSTDIR\XmlConfig"RMDir /r "$INSTDIR\mysql5.1"Delete "$SMPROGRAMS\XX广告制作软件\卸载${PRODUCT_NAME}.lnk"Delete "$SMPROGRAMS\XX广告制作软件\XX软件官网.lnk"Delete "$DESKTOP\XX广告制作软件.lnk"Delete "$SMPROGRAMS\XX广告制作软件\XX广告制作软件.lnk"RMDir "$SMPROGRAMS\XX广告制作软件"RMDir "$INSTDIR"DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"SetAutoClose true
SectionEnd#-- 根据 NSIS 脚本编辑规则,所有 Function 区段必须放置在 Section 区段之后编写,以避免安装程序出现未可预知的问题。--#Function GetNetFrameworkVersion
;获取.Net Framework版本,支持
Push $1
Push $0
ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5" "Install"
ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5" "Version"
StrCmp $0 1 KnowNetFrameworkVersion +1
ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0\Setup" "InstallSuccess"
ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0\Setup" "Version"
StrCmp $0 1 KnowNetFrameworkVersion +1
ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v2.0.50727" "Install"
ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v2.0.50727" "Version"
StrCmp $1 "" +1 +2
StrCpy $1 "2.0.50727.832"
StrCmp $0 1 KnowNetFrameworkVersion +1
ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322" "Install"
ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322" "Version"
StrCmp $1 "" +1 +2
StrCpy $1 "1.1.4322.573"
StrCmp $0 1 KnowNetFrameworkVersion +1
ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\.NETFramework\policy\v1.0" "Install"
ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\.NETFramework\policy\v1.0" "Version"
StrCmp $1 "" +1 +2
StrCpy $1 "1.0.3705.0"
StrCmp $0 1 KnowNetFrameworkVersion +1
StrCpy $1 "not .NetFramework"
KnowNetFrameworkVersion:
Pop $0
Exch $1
FunctionEnd;安装mysql服务
Function installMysqlPush "mysqld.exe"ProcessWork::existsprocessPop $R0IntCmp $R0 0 no_install ;判断mysql是否已经安装;写入注册表表示不是本程序安装的mysql,卸载的时候不需要卸载mysql数据库WriteRegDword HKLM "${PRODUCT_DIR_REGKEY}" "MySqlInstalled" 0MessageBox MB_OK|MB_ICONEXCLAMATION "本机已安装了mysql数据库,请手动导入数据信息,谢谢!"Goto done ;退出安装mysqlno_install: ;没有安装则安装ExecWait "$INSTDIR\mysql5.1\bin\mysqld --install mysql";设置mysql的环境变量到PATH路径ReadRegStr $0 HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path"WriteRegExpandStr HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path" "$0;$INSTDIR\mysql5.1\bin\";刷新环境变量SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment";启动服务ExecWait "net start mysql";写入注册表表示是本程序安装的mysql,方便卸载的时候卸载mysql数据库WriteRegDword HKLM "${PRODUCT_DIR_REGKEY}" "MySqlInstalled" 1;完成
            done:
FunctionEndFunction .onInit
InitPluginsDir;创建互斥防止重复运行System::Call 'kernel32::CreateMutexA(i 0, i 0, t "YBSetup") i .r1 ?e'Pop $R0StrCmp $R0 0 +3MessageBox MB_OK|MB_ICONEXCLAMATION "有一个YBSetup安装向导已经运行!"Abort
;禁止多次安装实例 start
ReadRegDWORD $0 HKLM '${PRODUCT_DIR_REGKEY}' "Installed"
IntCmp $0 +1 +4
MessageBox MB_OK|MB_USERICON '$(^Name) 已安装在计算机中。如需重新安装,请卸载已有的安装。'
Quit
nop
;禁止多次安装实例 end
FunctionEnd;--------------- 移除mysql服务 ----------------
Function un.removeService
;读取是否是本程序安装mysql
ReadRegDWORD $0 HKLM '${PRODUCT_DIR_REGKEY}' "MySqlInstalled"
IntCmp $0 1 0 clearDb;停止mysql服务ExecWait "net stop Mysql";移除mysql服务ExecWait "$INSTDIR\mysql5.1\bin\mysqld --remove Mysql";移除环境变量ReadRegStr $R0 HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path"${WordReplace} $R0 ";$INSTDIR\mysql5.1\bin\" "" "+" $R1;MessageBox MB_OK|MB_USERICON '$R0 - $INSTDIR - $R1 'WriteRegExpandStr HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path" "$R1";清除数据库信息
    clearDb:FunctionEnd
;---------------------------------
Function un.onInitFindProcDLL::FindProc "YBest.Ads.exe"Pop $R0IntCmp $R0 1 0 no_runMessageBox MB_ICONSTOP "安装程序检测到 $(^Name) 正在运行,请退出程序后重试"Quitno_run:MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "您确实要完全移除 $(^Name) ,及其所有的组件?" IDYES +2Abort
FunctionEndFunction un.onUninstSuccessHideWindowMessageBox MB_ICONINFORMATION|MB_OK "$(^Name) 已成功地从您的计算机移除。"
FunctionEnd

欢迎大家批评指正,共同进步!谢谢!

转载于:https://www.cnblogs.com/MineDream/archive/2013/04/03/2997621.html

NSIS打包软件(一)相关推荐

  1. NSIS打包软件使用

    NSIS打包软件使用 最近做的一个调用远程桌面的小应用需要打个安装包,并且在安装的时候需要添加注册表,我之前使用的都是"Advanced Installer"来打包应用程序的,这个 ...

  2. NSIS打包软件,初步使用心得

    最近开发的软件终于发布了一个正式的版本,之前一直都是用压缩包的方式发布,感觉有点low,而且要手动生成快捷方式或者注册dll,都要手动搞,有点麻烦,所以想尝试使用打包软件,做一个相对好看且实用的安装包 ...

  3. NSIS打包软件报(安装失败)

    1.报错的界面提示 运行: RunDll32 setupapi,InstallHinfSection DefaultInstall 132 C:\Windows\system32\drivers\XX ...

  4. NSIS 打包 win7 中无法删除快捷方式

    NSIS打包的安装程序,在Vista中的安装过程中如果向开始菜单添加了快捷方式的话,在卸载时卸载程序会不能正常删除这些快捷方式. 这 主要是因为Vista中使用UAC控制用户的权限. 我们使用NSIS ...

  5. NSIS 打包文件添加防火墙白名单

    概述 如果应用程序使用网络,担心被防火墙拦截的话,通常有两种解决方案,第一种是直接关闭电脑防火墙,但是会比较麻烦,每台电脑安装软件后都需要设置防火墙状态, 并且关闭防火墙电脑会不安全:第二种方式就是添 ...

  6. java打包软件静默安装_常用软件的静默安装方法介绍

    有时我们在安装程序的时候,希望是静默安装的,不显示下一步下一步,这编访问来教大家如何来操作,现在常用的制作安装程序的软件有,  Microsoft Windows Installer  , Windo ...

  7. 【QT】QT生成.exe安装包详细全文(保姆级教程)--打包软件及问题大全

    缺少.dll文件的朋友,请跳转到我的另一篇文章"QT编译后的.exe文件运行时缺少一些.dll文件的解决办法[超详细教程,新手必备]",把问题解决再往下看. 一.前言: 最近,一个 ...

  8. 使用NSIS打包revit插件安装包

    ** 使用NSIS打包revit插件安装包 ** 1.首先准备好 软件NSIS v2.51 集成增强版 https://pan.baidu.com/s/15O_bCNx8p_lyLUo9zEq6mg ...

  9. python通过pyinstaller打包软件将GUI项目打包成exe文件

    此项目分为两步: GUI编写程序 pyinstaller打包软件 所用到的第三方库: tkinter pyinstaller 具体实现 1. GUI界面 本次主要讲解如何打包,所以在此只是设计一个十分 ...

最新文章

  1. python试题for循环布尔值_Python自我修炼(升仙中....整数,布尔值,字符串,for循环)
  2. 【Unity笔记】使用协程(Coroutine)异步加载场景
  3. 如果沟通有范式,它会是怎么样子?
  4. String内容不能改变的理解 String的值不能修改的理解
  5. Django UnicodeEncodeError解决
  6. 分针网——每日推荐:PHTML解析原理
  7. Biztalk中Host Instance线程控制
  8. 如何使用计算机自带的刻录软件,Win10电脑如何刻录光盘?利用win10自带刻录工具来刻录DVD光盘教程...
  9. shopify独立站用户行为分析工具推荐-趣迹
  10. echarts:柱状图去掉网格线
  11. 操作的基本原则,每日必读【不断更新中】
  12. gif图片体积过大怎么办?手把手教你快速压缩gif动图
  13. apache服务器wind 下载,安装及部署
  14. c语言处理rna序列,RNAseq 完整操作流程以及后续例子操作
  15. 1688获得店铺的所有商品教程
  16. ROCm 5.4.3 在 ubuntu 20.04 上安装并运行示例
  17. java 获取月份 年份_Java程序获取当前日期,年份和月份
  18. [奔跑吧 Linux内核][学习记录]编译内核-实验1-2-[环境以及参考]
  19. PMP十五至尊图(第六版)
  20. 宏观经济学计算题练习

热门文章

  1. 初中参观机器人博物馆的作文_【六年级作文】参观机器人博物馆
  2. 文件上传下载-准备上传页面
  3. MySQL服务的启动与停止-使用命令行工具
  4. SpringSecurity案例之认证服务security配置
  5. DockerCompose-部署微服务集群
  6. Nginx安装方式介绍
  7. 高仿真的类-ApplicationContext
  8. 上传问题分析2--文件重名
  9. POI的入门:概述和创建EXCEL
  10. 如何禁用单个FegionClient的Hystrix的支持