NSI程序打包脚本文件编写教程

引言

NSIS (Nullsoft Scriptable Install System) 是一个专业开源的制作 windows 安装程序的工具。我们通过HM NSIEDIT编写好脚本、编译即可生成exe安装包。安装过程中可以配置其安装包图标、名称、出版人、网站等。此外,还可以设置程序开机自启动、管理员权限运行等给基于注册表的操作,也可以运行批处理文件(bat文件)进行系统模块的安装。

1、所需工具

1:NSIS 下载地址: NSIS: Nullsoft Scriptable Install System download | SourceForge.net

2:HM NIS Edit 脚本编辑工具:HM NIS Edit: A Free NSIS Editor/IDE (sourceforge.net)

2、示例

关于NSIS网上有很多教程,不在此赘述。我将主要记录在使用过程中出现的问题和一些常用的语法等。

2.1、设置安装完运行、开机自启动

!insertmacro MUI_PAGE_FINISH 上方插入代码:

//是否安装完运行勾选框
!define MUI_FINISHPAGE_RUN "$INSTDIR\net48\MetalBurrDetectionSys.exe"
//开机自启动勾选框
!define MUI_FINISHPAGE_SHOWREADME
!define MUI_FINISHPAGE_SHOWREADME_Function AutoBoot
!define MUI_FINISHPAGE_SHOWREADME_TEXT "开机自启动"
Function AutoBoot
         WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Run" "MetalBurrKey" '"$INSTDIR\net48\MetalBurrDetectionSys.exe"'
FunctionEnd

 记得在卸载时删除键值

Function un.onUninstSuccess
  HideWindow
  DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Run" "MetalBurrKey"
  MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) 已成功地从你的计算机移除。"
FunctionEnd

2.2、打包文件匹配

利用脚本向导会帮助我们快速构建打包程序,但是文件罗列的太过详细,有事我们只需要打包Debug文件夹中 dll 和 exe 文件即可,而且后续可能会增加或修改类库和运行程序的名称,此时用文件名匹配更为合适。

SetOutPath "$INSTDIR"
  SetOverwrite ifnewer
  File  "software\bin\Debug\*.dll"
  File  "software\bin\Debug\*.exe"

如果你想包含子目录及其所有指定格式文件,如下

SetOutPath "$INSTDIR"
  SetOverwrite ifnewer
  File -r "software\bin\Debug\*.dll"
  File -r "software\bin\Debug\*.exe"

 删除文件也有类似的方法:

RMDir /r "$INSTDIR\net48"
RMDir /r "$INSTDIR"

2.3、注册表操作、管理员启动

在Post阶段,向导会为我们自动生成程序相关键值,我们也可以根据需要插入额外键值 ,如需要管理员启动

Section -Post
  WriteUninstaller "$INSTDIR\uninst.exe"
  WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\net48\MetalBurrDetectionSys.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\net48\MetalBurrDetectionSys.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
   ;针对当前用户有效
  WriteRegStr HKCU "SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" "$INSTDIR\net48\MetalBurrDetectionSys.exe" "RUNASADMIN"
  ;针对所有用户有效
  WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" "$INSTDIR\net48\MetalBurrDetectionSys.exe" "RUNASADMIN"
SectionEnd

管理员启动设计如下代码:

   ;针对当前用户有效
  WriteRegStr HKCU "SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" "$INSTDIR\net48\MetalBurrDetectionSys.exe" "RUNASADMIN"
  ;针对所有用户有效
  WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" "$INSTDIR\net48\MetalBurrDetectionSys.exe" 

2.4、快捷键

我在使用生成快捷键时,会出现点击快捷键无效,或则在开始菜单里没有生成对应的目录和快捷键,并且快捷键也无效的情况,当我把程序的主运行exe放在最后写入时即可解决。

 生成桌面快捷键、开始菜单目录及程序和卸载快捷键代码如下:

Section -AdditionalIcons
  !insertmacro MUI_STARTMENU_WRITE_BEGIN Application
  CreateDirectory "$SMPROGRAMS\$ICONS_GROUP"
  CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\${PRODUCT_NAME} ${PRODUCT_VERSION}.lnk" "$INSTDIR\net48\MetalBurrDetectionSys.exe"
  CreateShortCut "$DESKTOP\${PRODUCT_NAME} ${PRODUCT_VERSION}.lnk" "$INSTDIR\net48\MetalBurrDetectionSys.exe"
  CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\Uninstall.lnk" "$INSTDIR\uninst.exe"
  !insertmacro MUI_STARTMENU_WRITE_END
SectionEnd

2.5、执行bat脚本

我主要用到两种:等待并显示终端、等待不显示终端

;等待不显示终端
nsExec::Exec '$INSTDIR/removeWeb.bat'
;等待并显示终端
ExecWait '$INSTDIR/removeWeb.bat'

2.6、完整示例

; Script generated by the HM NIS Edit Script Wizard.

; HM NIS Edit Wizard helper defines
!define PRODUCT_NAME "某某软件"
!define PRODUCT_VERSION "1.0"
!define PRODUCT_PUBLISHER "某某公司"
!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\MetalBurrDetectionSys.exe"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
!define PRODUCT_STARTMENU_REGVAL "NSIS:StartMenuDir"

; MUI 1.67 compatible ------
!include "MUI.nsh"

; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "某某软件\Resources\maociLOGO.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"

; Welcome page
!insertmacro MUI_PAGE_WELCOME
; License page
!insertmacro MUI_PAGE_LICENSE "softwarelicense.rtf"
; Directory page
!insertmacro MUI_PAGE_DIRECTORY
; Start menu page
var ICONS_GROUP
!define MUI_STARTMENUPAGE_NODISABLE
!define MUI_STARTMENUPAGE_DEFAULTFOLDER "某某软件"
!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
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
; Finish page
!define MUI_FINISHPAGE_RUN "$INSTDIR\net48\MetalBurrDetectionSys.exe"
!define MUI_FINISHPAGE_SHOWREADME
!define MUI_FINISHPAGE_SHOWREADME_Function AutoBoot
!define MUI_FINISHPAGE_SHOWREADME_TEXT "开机自启动"
!insertmacro MUI_PAGE_FINISH

; Uninstaller pages
!insertmacro MUI_UNPAGE_INSTFILES

; Language files
!insertmacro MUI_LANGUAGE "SimpChinese"

; MUI end ------

Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "${PRODUCT_NAME}安装包 ${PRODUCT_VERSION}.exe"
InstallDir "D:\Program Files\某某软件"
InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""
ShowInstDetails show
ShowUnInstDetails show

RequestExecutionLevel admin

;打包帮助文档
Section "Helpbook" SEC01
  ;执行脚本
  nsExec::Exec '$INSTDIR/removeWeb.bat'
  SetOutPath "D:\HelpFile\某某软件\dist"
  File /r "..\EditorRunHelpFile\BatteryHelpFile\docs\.vuepress\dist\*.*"
  nsExec::Exec '$INSTDIR/iis.bat'
SectionEnd

;打包主程序文件
Section "MainSection" SEC02
  ;停止进程
  nsExec::Exec "taskkill /im MetalBurrDetectionSys.exe /f"

  SetOutPath "$INSTDIR\SystemConfig"
  SetOverwrite ifnewer
  File /r "某某软件\bin\Debug\SystemConfig\*.json"
  SetOutPath "$INSTDIR"
  SetOverwrite ifnewer
  File  "某某软件\bin\Debug\*.*"

  SetOutPath "$INSTDIR\net48"
  SetOverwrite ifnewer
  File /r "某某软件\bin\Debug\net48\*.dll"
  File /r "某某软件\bin\Debug\net48\*.json"
  File /r "某某软件\bin\Debug\net48\*.config"
  File /r "某某软件\bin\Debug\net48\*.WH"
  File /r "某某软件\bin\Debug\net48\*.png"
  File "A:\目录\*.dll"
  File /r "某某软件\bin\Debug\net48\*.exe"
  
SectionEnd

Section -Post
  WriteUninstaller "$INSTDIR\uninst.exe"
  WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\net48\MetalBurrDetectionSys.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\net48\MetalBurrDetectionSys.exe"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
  WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"

   ;管理员启动
   ;针对当前用户有效
  WriteRegStr HKCU "SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" "$INSTDIR\net48\MetalBurrDetectionSys.exe" "RUNASADMIN"
  ;针对所有用户有效
  WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" "$INSTDIR\net48\MetalBurrDetectionSys.exe" "RUNASADMIN"
SectionEnd

;快捷键
Section -AdditionalIcons
  !insertmacro MUI_STARTMENU_WRITE_BEGIN Application
  CreateDirectory "$SMPROGRAMS\$ICONS_GROUP"
  CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\${PRODUCT_NAME} ${PRODUCT_VERSION}.lnk" "$INSTDIR\net48\MetalBurrDetectionSys.exe"
  CreateShortCut "$DESKTOP\${PRODUCT_NAME} ${PRODUCT_VERSION}.lnk" "$INSTDIR\net48\MetalBurrDetectionSys.exe"
  CreateShortCut "$SMPROGRAMS\$ICONS_GROUP\Uninstall.lnk" "$INSTDIR\uninst.exe"
  !insertmacro MUI_STARTMENU_WRITE_END
SectionEnd

Section Uninstall
  !insertmacro MUI_STARTMENU_GETFOLDER "Application" $ICONS_GROUP
  ;执行脚本 等待不显示终端
  nsExec::Exec '$INSTDIR/removeWeb.bat'
  Delete "$INSTDIR\uninst.exe"
  Delete "$SMPROGRAMS\$ICONS_GROUP\Uninstall.lnk"
  Delete "$DESKTOP\${PRODUCT_NAME} ${PRODUCT_VERSION}.lnk"
  Delete "$SMPROGRAMS\$ICONS_GROUP\${PRODUCT_NAME} ${PRODUCT_VERSION}.lnk"
  RMDir "$SMPROGRAMS\$ICONS_GROUP"
  RMDir /r "D:\HelpFile\某某软件\dist"
  RMDir /r "$INSTDIR\SystemConfig"
  RMDir /r "$INSTDIR\net48"
  RMDir /r "$INSTDIR"
  DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
  DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
  DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Run" "MetalBurrKey"
  SetAutoClose true
SectionEnd

;函数放在最后
Function AutoBoot
  WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Run" "MetalBurrKey" '"$INSTDIR\net48\MetalBurrDetectionSys.exe"'
FunctionEnd

Function un.onUninstSuccess
  HideWindow
  DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Run" "MetalBurrKey"
  MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) 已成功地从你的计算机移除。"
FunctionEnd

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

3、脚本

自动安装IIS服务

@echo off
cd /d "%~dp0"
 
echo Installing IIS...
echo Wait a moment...
start /w pkgmgr /iu:IIS-WebServerRole;WAS-WindowsActivationService;WAS-ProcessModel;WAS-NetFxEnvironment;WAS-ConfigurationAPI
 
echo Done.

删除网站

@echo off
setlocal
 
:: 设置网站名称
set SITE_NAME=WH_MetalBurr
 
:: 使用appcmd.exe删除网站
%windir%\system32\inetsrv\appcmd delete site %SITE_NAME%
 
endlocal
echo Done.

  • 23
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
在Mac上使用Qt开发的应用程序通常不直接打包为Windows的.exe文件,因为Qt主要针对的是跨平台的开发,它的应用程序通常打包为可执行的.dmg文件,以便在macOS上运行。如果你想让你的Qt应用能在Windows上运行,你需要进行跨平台部署。 以下是在Mac上创建跨平台安装程序的基本步骤: 1. **配置Qt**: 使用Qt Creator或者命令行工具(qmake)确保你的项目已经配置为生成可部署的目标(`qmake -spec win32 mingw` 或 `qmake -spec macx-clang`)。 2. **构建应用**: 打开终端,切换到你的Qt项目目录,然后运行 `qmake`,接着执行 `make` 或 `jom` (对于Qt 5.12+使用),这将生成适用于目标平台的可执行文件。 3. **生成安装程序**: 使用`NSIS`(一个流行的开源脚本语言)或`CMake`(结合`NSIS`或`wine`)创建跨平台安装器。`NSIS`用于Windows安装程序,你可以通过`wine`在Mac上模拟Windows环境来使用它。Qt Creator有时提供了对`NSIS`集成的支持,例如在"Tools" > "Create NSIS Installer..."菜单中。 4. **部署脚本**: 编写或下载NSIS脚本,这个脚本会在用户系统上安装你的Qt应用、依赖库和其他必要的设置。你可以使用`.nsi`文件编写NSIS,或者在线工具如NSISX.com生成。 5. **测试和打包**: 测试生成的安装程序在Mac和Windows上是否能正确运行,并进行适当的优化和调整。完成后,你可以将其作为.dmg或.exe文件分发。 如果你需要更详细的步骤或者有特定问题,请告诉我,我会进一步解答。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

James.TCG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值