Use the NSIS program packaging program to package as an installation file setup template package file nsi can edit and modify environment variables dependent files to generate exe files

Use the NSIS program packaging program to package as an installation file setup template package file nsi can edit and modify environment variables dependent files

In order to learn that NSIS is packaged as an installation file, I have prepared the following file content, which can be copied directly and named as a name, such as 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


In the above file, there are eight places that may need to be modified, which can be modified according to your specific situation.
Look carefully, the packaging is actually very simple...
welcome to communicate.

Guess you like

Origin blog.csdn.net/myhappyandy/article/details/130935823