NSIS打包软件(二)
上一篇(NSIS打包软件(一))主要介绍了NSIS打包软件安装程序,对于我们软件行业来说一般软件都不可能只有一次安装就可以了,还包括以后的软件程序的更新,所以这节主要是针对NSIS打包升级程序安装包,平常软件的更新主要是程序文件的替换和数据库的更新,以下代码也正是如此。好了,不废话,NSIS软件更新包打包代码如下:
; 安装程序初始定义常量 !define PRODUCT_NAME "XX广告制作管理软件" !define PRODUCT_VERSION "2.2" !define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\YBest.Ads.exe" SetCompressor lzma ; ------ MUI 现代界面定义 (1.67 版本以上兼容) ------ !include "MUI.nsh" !include "WordFunc.nsh" ; MUI 预定义常量 !define MUI_ICON "ybkj.ico" ; 欢迎页面 !insertmacro MUI_PAGE_WELCOME ; 许可协议页面 !insertmacro MUI_PAGE_LICENSE "Readme.txt" ; 安装过程页面 !insertmacro MUI_PAGE_INSTFILES ; 安装界面包含的语言设置 !insertmacro MUI_LANGUAGE "SimpChinese" ;文件版本声明 VIProductVersion "2.2.0.0" VIAddVersionKey /LANG=2052 "ProductName" "${PRODUCT_NAME}" 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广告制作软件-V${PRODUCT_VERSION}升级程序" VIAddVersionKey /LANG=2052 "FileVersion" "${PRODUCT_VERSION}" ; 安装预释放文件 !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS ; ------ MUI 现代界面定义结束 ------ Name "${PRODUCT_NAME} - V${PRODUCT_VERSION}升级程序" OutFile "${PRODUCT_NAME}-V${PRODUCT_VERSION}升级包.exe" InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" "" ShowInstDetails hide BrandingText "XX软件 www.XX.com" ; ------ 更新软件 ------ Section "UpdateSoft" SEC01 ;休眠1秒钟 展示安装效果 Sleep 1000 SetDetailsPrint textonly DetailPrint "正在升级 ${PRODUCT_NAME},请单击[关闭]按钮完成升级!" SetDetailsPrint listonly SectionIn RO SetOutPath "$INSTDIR" ;更新比原目录日期新的文件 SetOverwrite ifnewer ;升级文件 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 "MqttLib.dll" File "PullService.dll" File "更新说明.txt" File "update.sql" ;更新数据库 Call updateDB WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "version" "${PRODUCT_VERSION}" ;写入版本号 ;指定以记事本打开说明 ;Exec '"$SYSDIR\notepad.exe" "$INSTDIR\更新说明.txt"' SectionEnd ; ------ 更新软件结束 ------ ;更新数据库 Function updateDB ;检查mysql服务是否启动 Push "mysqld.exe" ProcessWork::existsprocess Pop $R0 IntCmp $R0 1 ExecSql MessageBox MB_OK|MB_ICONEXCLAMATION "mysql数据库服务未启动,请启动后再升级程序!" Quit ;未启动则 退出更新安装程序 ExecSql: ;更新数据 ExecWait 'mysql --user=root --password=123456 --execute="source $INSTDIR\update.sql"' $2 StrCmp $2 1 0 endinst MessageBox MB_OK|MB_ICONEXCLAMATION "数据库更新失败!请确认账号密码是否正确或数据库已安装!" Delete "$INSTDIR\update.sql" ;删除文件 Quit ;未启动则 退出更新安装程序 endinst: Delete "$INSTDIR\update.sql" ;删除文件 FunctionEnd Function .onInit ;判断是否已安装 ReadRegStr $0 HKLM "${PRODUCT_DIR_REGKEY}" "" StrCmp $0 "" 0 NoAbort MessageBox MB_OK|MB_ICONEXCLAMATION "您未正确安装${PRODUCT_NAME},不能使用此升级程序!" Abort ;退出安装程序 NoAbort: ;程序正在运行则关闭程序 Push $R0 CheckProc: Push "YBest.Ads.exe" ProcessWork::existsprocess Pop $R0 IntCmp $R0 0 Done MessageBox MB_OKCANCEL|MB_ICONSTOP "升级程序检测到 ${PRODUCT_NAME} 正在运行。$\r$\n$\r$\n点击 “确定” 强制关闭${PRODUCT_NAME},继续升级。$\r$\n点击 “取消” 退出安装程序。" IDCANCEL Exit Push "YBest.Ads.exe" Processwork::KillProcess Sleep 1000 Goto CheckProc Exit: Abort Done: Pop $R0 FunctionEnd
欢迎大家批评指正,共同进步!谢谢!