使用NSIS程序打包程序封装为安装文件setup模板封装文件nsi可编辑修改环境变量依赖文件生成exe文件

使用NSIS程序打包程序封装为安装文件setup模板封装文件nsi可编辑修改环境变量依赖文件

为了学习NSIS封装为安装文件,我准备了下面这个文件内容,该内容可以直接拷贝并且命名为一个名称,例如ESA.nsi

; 该脚本使用 HM VNISEdit 脚本编辑器向导产生

; 安装程序初始定义常量
; 下面所有的相对路径都是相对与该nsi文件的路径,比如release\*.*,是指相对于该nsi文件的路径下面有个release目录,下的所有文件
; 第一处修改软件名字,替换修改[你的软件名字]
!define PRODUCT_NAME "[你的软件名字]"
!define PRODUCT_VERSION "1.0"
!define PRODUCT_PUBLISHER "National University of Defense Technology."
!define PRODUCT_WEB_SITE "http://www.mycompany.com"
; 第二处修改,替换ESA,注意可能有多处引用该名字,ESA实际上是你程序编译后生成的名字,建议直接使用替换修改的方式
!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\ESA.exe"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
!define PRODUCT_STARTMENU_REGVAL "NSIS:StartMenuDir"
!define ENV_HKLM 'HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment"'
!define ENV_HKCU 'HKCU "Environment"'

SetCompressor lzma

; ------ MUI 现代界面定义 (1.67 版本以上兼容) ------
!include "MUI.nsh"
!include "WinMessages.nsh"

; MUI 预定义常量
!define MUI_ABORTWARNING
; 修改第三处,先要建立icon目录,已经目录下的icon.ico文件,目前只支持ico文件。如果想用新目录名或者文件名,那么这里就要相应修改。
!define MUI_ICON "icon\icon.ico"
!define MUI_UNICON "icon\icon.ico"

; 欢迎页面
!insertmacro MUI_PAGE_WELCOME
; 许可协议页面
; 修改第四处,这里是licence的提醒,其实意义不大,我已经注释掉了。如果你也想实现,同意才能继续,那么可以写好License.txt文件,并去掉下面的注释
;!insertmacro MUI_PAGE_LICENSE "x64\licence\Licence.txt"
; 安装目录选择页面
!insertmacro MUI_PAGE_DIRECTORY
; 开始菜单设置页面
var ICONS_GROUP
!define MUI_STARTMENUPAGE_NODISABLE
!define MUI_STARTMENUPAGE_DEFAULTFOLDER "ESA"
!define MUI_STARTMENUPAGE_REGISTRY_ROOT "${PRODUCT_UNINST_ROOT_KEY}"
!define MUI_STARTMENUPAGE_REGISTRY_KEY "${PRODUCT_UNINST_KEY}"
!define MUI_STARTMENUPAGE_REGISTRY_VALUENAME "${PRODUCT_STARTMENU_REGVAL}"
!insertmacro MUI_PAGE_STARTMENU Application $ICONS_GROUP
; 安装过程页面
!insertmacro MUI_PAGE_INSTFILES
; 安装完成页面
!define MUI_FINISHPAGE_RUN "$INSTDIR\ESA.exe"
!insertmacro MUI_PAGE_FINISH

; 安装卸载过程页面
!insertmacro MUI_UNPAGE_INSTFILES

; 安装界面包含的语言设置
!insertmacro MUI_LANGUAGE "SimpChinese"

; 安装预释放文件
!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
; ------ MUI 现代界面定义结束 ------

Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
; 修改第五处,可以不修改,这里是指定生成未ESASetup.exe的安装文件,也可以改成其他的
OutFile "ESASetup.exe"
InstallDir "$PROGRAMFILES\ESA"
InstallDirRegKey HKLM "${PRODUCT_UNINST_KEY}" "UninstallString"
ShowInstDetails show
ShowUnInstDetails show
;RequestExecutionLevel admin

Section "MainSection" 7SEC01
  SetOutPath "$INSTDIR"
  SetOverwrite ifnewer
  ;File /r "x64\yl\*.*"
  ; 修改第六处,自动安装其他执行的环境。 /q是静默安装
  SetDetailsPrint textonly
	DetailPrint "正在安装vcredist_x64"
	ExecWait '$INSTDIR\vc_redist.x64.exe /q /norestart /ChainingPackage FullX64Bootstrapper'

	;SetDetailsPrint textonly
	;DetailPrint "正在安装MCRInstaller2021a"
	;ExecWait '$INSTDIR\yl\MCRInstaller2021a.exe /q /norestart /ChainingPackage FullX64Bootstrapper'

	;SetDetailsPrint textonly
	;DetailPrint "正在安装DXperience-11.1.4"
	;ExecWait '$INSTDIR\System\DXperience-11.1.4.exe /q /norestart /ChainingPackage FullX64Bootstrapper'
	
  ; 修改第七处,拷贝文件,这里拷贝时,是指定目录下的所有文件会拷贝,拷贝到安装文件会保持目录,但是安装时,会放到同一个目录文件中。
  SetOverwrite ifnewer
  ; 下面会拷贝Release目录下的所有文件,并在安装时,不带Release目录,释放Release下所有文件到指定目录,如果您的目录名不一样,需要修改
  File /r "Release\*.*"
  File /r "AlgoRoot"
  File /r "Doc"
  File /r "db"
  File /r "yl\Release\*.*"

  ;创建开始菜单快捷方式
  !insertmacro MUI_STARTMENU_WRITE_BEGIN Application
  CreateDirectory "$SMPROGRAMS\$ICONS_GROUP"
  CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\${PRODUCT_NAME}.lnk" "$INSTDIR\ESA.exe"
  CreateShortCut "$DESKTOP\${PRODUCT_NAME}.lnk" "$INSTDIR\ESA.exe"
  !insertmacro MUI_STARTMENU_WRITE_END
  
  ;添加环境变量
  ; 修改第八处,可以修改,如果需要则需要去掉目录
  ;WriteRegExpandStr ${ENV_HKCU} "ExeBin" "D:\Exe\bin"
  ;获取原有环境变量值
  ReadRegStr $0 HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path"
  ;在原有的环境变量追加目录
  WriteRegExpandStr HKLM "SYSTEM\CurrentControlSet\Control\Session Manager\Environment" "Path" "$0;AlgoRoot\Release"
  SendMessage ${HWND_BROADCAST} ${WM_WININICHANGE} 0 "STR:Environment" /TIMEOUT=500
  
SectionEnd

Section -AdditionalIcons
  !insertmacro MUI_STARTMENU_WRITE_BEGIN Application
  CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\Uninstall.lnk" "$INSTDIR\uninst.exe"
  !insertmacro MUI_STARTMENU_WRITE_END
SectionEnd

Section -Post
  WriteUninstaller "$INSTDIR\uninst.exe"
  WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\ESA.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\ESA.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}"
SectionEnd

/******************************
 *  以下是安装程序的卸载部分  *
 ******************************/

Section Uninstall
  !insertmacro MUI_STARTMENU_GETFOLDER "Application" $ICONS_GROUP
  Delete "$INSTDIR\*.*"

  Delete "$SMPROGRAMS\$ICONS_GROUP\Uninstall.lnk"
  Delete "$DESKTOP\${PRODUCT_NAME}.lnk"
  Delete "$SMPROGRAMS\$ICONS_GROUP\${PRODUCT_NAME}.lnk"

  RMDir "$SMPROGRAMS\$ICONS_GROUP"

  RMDir /r "$INSTDIR"

  DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
  DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
  SetAutoClose true
SectionEnd

#-- 根据 NSIS 脚本编辑规则,所有 Function 区段必须放置在 Section 区段之后编写,以避免安装程序出现未可预知的问题。--#

Function un.onInit
  MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "您确实要完全移除 $(^Name) ,及其所有的组件?" IDYES +2
  Abort
FunctionEnd

Function un.onUninstSuccess
  HideWindow
  MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) 已成功地从您的计算机移除。"
FunctionEnd

;获取.Net Framework版本支持
Function GetNetFrameworkVersion
    Push $1
    Push $0
    ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" "Install"
    ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" "Version"
    StrCmp $0 1 KnowNetFrameworkVersion +1
    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


上面文件中,有八处地方可能需要修改,可以根据您的具体情况修改。
仔细看下,其实封装很简单…
欢迎来交流。

猜你喜欢

转载自blog.csdn.net/myhappyandy/article/details/130935823