NSIS来打包windows安装程序,开源免费简单小巧,支持中文

NSIS (Nullsoft脚本安装系统)是一个专业的开源系统,用于创建 Windows 安装程序。它被设计成尽可能小和灵活,因此非常适合互联网分发,并且原生支持中文,不像inno setup还需要你单独安装一个中文语言包。

NSIS官网:NSIS Wiki

Github仓库地址:https://github.com/kichik/nsis

简单的NSIS安装包

新建脚本:向导

我们先从一个简单的NSIS安装包开始吧,就像前面(NSIS介绍)所说,我们虽然看过用户手册,可要写安装脚本无从下手,那我们的编辑工具HM NIS Edit就派上用场了。

打开HM NIS Edit,点击菜单“文件”->“新建脚本:向导”,会有向导一步步让我们输入信息,最后根据我们的输入生成.nsi脚本文件,下面我们一步步演示:

新建脚本:脚本文件

最后生成的脚本文件我们保存为MyApp.nsi,打开查看脚本(对照着上面截图中设置的项再配合用户手册查看,你会知道一个完整的脚本文件的基本结构和基本的指令用法)

; Script generated by the HM NIS Edit Script Wizard.

; HM NIS Edit Wizard helper defines
!define PRODUCT_NAME "My application"
!define PRODUCT_VERSION "1.0"
!define PRODUCT_PUBLISHER "My company, Inc."
!define PRODUCT_WEB_SITE "http://www.mycompany.com"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"

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

; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"

; Welcome page
!insertmacro MUI_PAGE_WELCOME
; License page
!insertmacro MUI_PAGE_LICENSE "E:\ZZL\ADWeb\安装包制作\Licence.txt"
; Directory page
!insertmacro MUI_PAGE_DIRECTORY
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
; Finish page
!insertmacro MUI_PAGE_FINISH

; Uninstaller pages
!insertmacro MUI_UNPAGE_INSTFILES

; Language files
!insertmacro MUI_LANGUAGE "SimpChinese"

; MUI end ------

Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "Setup.exe"
InstallDir "$PROGRAMFILES\My application"
ShowInstDetails show
ShowUnInstDetails show

Section "MainSection" SEC01
  SetOutPath "$INSTDIR"
  SetOverwrite try
  File "E:\ZZL\ADWeb\安装包制作\Release\404.aspx"
  File "E:\ZZL\ADWeb\安装包制作\Release\Default.aspx"
  File "E:\ZZL\ADWeb\安装包制作\Release\Error.aspx"
  SetOutPath "$INSTDIR\Images"
  File "E:\ZZL\ADWeb\安装包制作\Release\Images\1_close.png"
  File "E:\ZZL\ADWeb\安装包制作\Release\Images\1_open.png"
  File "E:\ZZL\ADWeb\安装包制作\Release\Images\add.png"
  SetOutPath "$INSTDIR\Scripts"
  File "E:\ZZL\ADWeb\安装包制作\Release\Scripts\CommonScript.js"
  SetOutPath "$INSTDIR\SystemLog"
  File "E:\ZZL\ADWeb\安装包制作\Release\SystemLog\LogStatisticsDetail.aspx"
  File "E:\ZZL\ADWeb\安装包制作\Release\SystemLog\SystemLogList.aspx"
  File "E:\ZZL\ADWeb\安装包制作\Release\SystemLog\SystemLogStatistics.aspx"
  SetOutPath "$INSTDIR"
  File "E:\ZZL\ADWeb\安装包制作\Release\Web.config"
SectionEnd

Section -Post
  WriteUninstaller "$INSTDIR\uninst.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}" "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


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

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

Section Uninstall
  Delete "$INSTDIR\uninst.exe"
  Delete "$INSTDIR\Web.config"
  Delete "$INSTDIR\SystemLog\SystemLogStatistics.aspx"
  Delete "$INSTDIR\SystemLog\SystemLogList.aspx"
  Delete "$INSTDIR\SystemLog\LogStatisticsDetail.aspx"
  Delete "$INSTDIR\Scripts\CommonScript.js"
  Delete "$INSTDIR\Images\add.png"
  Delete "$INSTDIR\Images\1_open.png"
  Delete "$INSTDIR\Images\1_close.png"
  Delete "$INSTDIR\Error.aspx"
  Delete "$INSTDIR\Default.aspx"
  Delete "$INSTDIR\404.aspx"

  RMDir "$INSTDIR\SystemLog"
  RMDir "$INSTDIR\Scripts"
  RMDir "$INSTDIR\Images"
  RMDir "$INSTDIR"

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

值得注意的是,从新建脚本向导的第三步有选项用户图形界面我们默认选择的是“现代”,对应脚本中引入了NSIS现代用户界面头文件(!include "MUI.nsh"),对应的安装页面中都是以!insertmacro MUI_PAGE_***开头(如:欢迎页面!insertmacro MUI_PAGE_WELCOME),详细的说明请查看NSIS Modern User Interface。

安装包:现代界面

下面我们看下安装包的效果,在HM NIS Edit界面,点击菜单“NSIS”->“编译并运行”,输出窗口会显示编译过程,如果没有出错,会直接执行编译生成的Setup.exe,安装截图如下:

从上面截图可以看到我们的安装包共有5个用户界面,这个和脚本文件中是对应的:

; Welcome page
!insertmacro MUI_PAGE_WELCOME
; License page
!insertmacro MUI_PAGE_LICENSE "E:\ZZL\ADWeb\安装包制作\Licence.txt"
; Directory page
!insertmacro MUI_PAGE_DIRECTORY
; Instfiles page
!insertmacro MUI_PAGE_INSTFILES
; Finish page
!insertmacro MUI_PAGE_FINISH

其中“安装记录页面”将实际执行安装区段中的指令,这些指令可以解压文件读取,读写注册表、INI文件或普通文件,执行Powershell脚本,创建目录,创建快捷方式等等。如果一个安装程序有多个组件,每个组件都有它自己的代码块,当用户选择了安装该组件,那么安装程序就会执行对应的代码,那么每个组件就需要对应一个区段,具体关于可选组件的信息会在以后章节介绍。我们目前只有一个安装区段,是把部署包文件放入安装目录:

Section "MainSection" SEC01
  SetOutPath "$INSTDIR"
  SetOverwrite try
  File "E:\ZZL\ADWeb\安装包制作\Release\404.aspx"
  File "E:\ZZL\ADWeb\安装包制作\Release\Default.aspx"
  File "E:\ZZL\ADWeb\安装包制作\Release\Error.aspx"
  SetOutPath "$INSTDIR\Images"
  File "E:\ZZL\ADWeb\安装包制作\Release\Images\1_close.png"
  File "E:\ZZL\ADWeb\安装包制作\Release\Images\1_open.png"
  File "E:\ZZL\ADWeb\安装包制作\Release\Images\add.png"
  Sleep 20000
  SetOutPath "$INSTDIR\Scripts"
  File "E:\ZZL\ADWeb\安装包制作\Release\Scripts\CommonScript.js"
  SetOutPath "$INSTDIR\SystemLog"
  File "E:\ZZL\ADWeb\安装包制作\Release\SystemLog\LogStatisticsDetail.aspx"
  File "E:\ZZL\ADWeb\安装包制作\Release\SystemLog\SystemLogList.aspx"
  File "E:\ZZL\ADWeb\安装包制作\Release\SystemLog\SystemLogStatistics.aspx"
  SetOutPath "$INSTDIR"
  File "E:\ZZL\ADWeb\安装包制作\Release\Web.config"
SectionEnd

关于界面上的信息都是我们在脚本向导中设置的(如应用程序名称、版本、公司、图标、授权信息、语言等),可以在脚本中修改:

; HM NIS Edit Wizard helper defines
!define PRODUCT_NAME "My application"
!define PRODUCT_VERSION "1.0"
!define PRODUCT_PUBLISHER "My company, Inc."
!define PRODUCT_WEB_SITE "http://www.mycompany.com"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"

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

; MUI Settings
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"

还有一些是关于安装包本身的信息(如:名称、默认安装路径、生成安装包名称、是否显示安装详情等):

Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "Setup.exe"
InstallDir "$PROGRAMFILES\ADWebManager"
InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""
ShowInstDetails show
ShowUnInstDetails show
BrandingText " MyCompany Ltd."

其中注意加一行命令BrandingText " Prolliance Ltd.",这样用户安装界面中就不是NSIS的信息了,前后对比如下:

修改脚本:标准界面

上面我们使用HM NIS Edit的向导创建了具有“现代界面”的安装包,其中脚本文件中引入了NSIS现代用户界面头文件(!include "MUI.nsh"),现在我们不要引入额外的头文件,改成NSIS标准的界面试试,就像我们查看用户手册看到的,我们可以通过Page命令(或更多高级设置如PageEx)。我们修改后的脚本文件如下:

; Script generated by the HM NIS Edit Script Wizard.

; HM NIS Edit Wizard helper defines
!define PRODUCT_NAME "My application"
!define PRODUCT_VERSION "1.0"
!define PRODUCT_PUBLISHER "My company, Inc."
!define PRODUCT_WEB_SITE "http://www.mycompany.com"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"

; pages
PageEx license
       LicenseText "许可页面"
       LicenseData "E:\ZZL\ADWeb\安装包制作\Licence.txt"
       ;LicenseForceSelection
PageExEnd
PageEx directory
       DirText "目录选择页面" "目标文件夹" "浏览..."
PageExEnd
Page instfiles
UninstPage uninstConfirm
UninstPage instfiles

; MUI end ------

Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "Setup.exe"
InstallDir "$PROGRAMFILES\My application"
ShowInstDetails show
ShowUnInstDetails show
BrandingText " MyCompany Ltd."

Section "MainSection" SEC01
  SetOutPath "$INSTDIR"
  SetOverwrite try
  File "E:\ZZL\ADWeb\安装包制作\Release\404.aspx"
  File "E:\ZZL\ADWeb\安装包制作\Release\Default.aspx"
  File "E:\ZZL\ADWeb\安装包制作\Release\Error.aspx"
  SetOutPath "$INSTDIR\Images"
  File "E:\ZZL\ADWeb\安装包制作\Release\Images\1_close.png"
  File "E:\ZZL\ADWeb\安装包制作\Release\Images\1_open.png"
  File "E:\ZZL\ADWeb\安装包制作\Release\Images\add.png"
  Sleep 20000
  SetOutPath "$INSTDIR\Scripts"
  File "E:\ZZL\ADWeb\安装包制作\Release\Scripts\CommonScript.js"
  SetOutPath "$INSTDIR\SystemLog"
  File "E:\ZZL\ADWeb\安装包制作\Release\SystemLog\LogStatisticsDetail.aspx"
  File "E:\ZZL\ADWeb\安装包制作\Release\SystemLog\SystemLogList.aspx"
  File "E:\ZZL\ADWeb\安装包制作\Release\SystemLog\SystemLogStatistics.aspx"
  SetOutPath "$INSTDIR"
SectionEnd

Section -Post
  WriteUninstaller "$INSTDIR\uninst.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}" "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


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

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

Section Uninstall
  Delete "$INSTDIR\uninst.exe"
  Delete "$INSTDIR\Web.config"
  Delete "$INSTDIR\SystemLog\SystemLogStatistics.aspx"
  Delete "$INSTDIR\SystemLog\SystemLogList.aspx"
  Delete "$INSTDIR\SystemLog\LogStatisticsDetail.aspx"
  Delete "$INSTDIR\Scripts\CommonScript.js"
  Delete "$INSTDIR\Images\add.png"
  Delete "$INSTDIR\Images\1_open.png"
  Delete "$INSTDIR\Images\1_close.png"
  Delete "$INSTDIR\Error.aspx"
  Delete "$INSTDIR\Default.aspx"
  Delete "$INSTDIR\404.aspx"

  RMDir "$INSTDIR\SystemLog"
  RMDir "$INSTDIR\Scripts"
  RMDir "$INSTDIR\Images"
  RMDir "$INSTDIR"

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

安装包:标准界面

下面我们看下标准界面的脚本生成的安装包效果,执行后在HM NIS Edit界面,点击菜单“NSIS”->“编译并运行”,输出窗口会显示编译过程,如果没有出错,会直接执行编译生成的Setup.exe,安装截图如下:

是不是比较起来“现代用户界面”,标准的界面会很丑,而且NSIS内置的标准安装界面没有欢迎、完成界面(只有许可、目录选择、组件、安装记录页面) ,另外“上一步”、“下一步”、“取消”等按钮需要额外的语言包文件来载入,不如“现代用户界面”只需要一个指令(!insertmacro MUI_LANGUAGE "SimpChinese")来指定采用的语言,所以接下来我们还是采用“现代用户界面”来制作安装包,当然这些界面上的图标,任何地方的文字都是可以定制的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/337879.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

二叉树进阶oj题目

二叉树进阶oj题目 两个结点的最近公共祖先前序中序(中序后序)还原二叉树 1、两个结点的最近公共祖先(两种方法) leetcode链接 题目描述:给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 百度百科中最近公共…

【Linux系统编程】环境变量详解

文章目录 1. 环境变量的基本概念2. 如何理解呢?(测试PATH)2.1 切入点1查看具体的环境变量原因剖析常见环境变量 2.2 切入点2给PATH环境变量添加新路径将我们自己的命令拷贝到PATH已有路径里面 2.3 切入点3 3. 显示所有环境变量4. 测试HOME5. …

【浅谈Linux中批量化注释和批量化去注释】

这篇博客主要是关于Linux中注释与去注释,在Linux和vs等编译器中代码行的注释和去注释会有很大不同,Linux中主要使用指令的方式来进行。 目录 批量化注释 批量化去注释 批量化注释 操作 ctrlv,hjkl区域选择(主要使用j-下移)&…

GPT应用_PrivateGPT

项目地址:https://github.com/imartinez/privateGPT 1 功能 1.1 整体功能,想解决什么问题 搭建完整的 RAG 系统,与 FastGPT 相比,界面比较简单。但是底层支持比较丰富,可用于知识库的完全本地部署,包含大…

Ubuntu22.04安装GitLab

如果我们是自己本地进行开发,使用Git的简单版本管理功能即可。但如果要做协同开发,使用GitLab自己部署Git代码仓库,是一个不错的选择。 笔者曾使用过svn和Git,相比较而言,Git的使用体验更好。 那么我们接下来安装一下。 安装 首先是升级下包源信息 sudo apt update …

.NET国产化改造探索(六)、银河麒麟操作系统中安装多个.NET版本

随着时代的发展以及近年来信创工作和…废话就不多说了,这个系列就是为.NET遇到国产化需求的一个闭坑系列。接下来,看操作。 上一篇文章介绍了如何在银河麒麟操作系统上,使用Nginx.NET程序实现自启动。本文介绍下如何在一个环境中,…

19.云原生CICD之ArgoCD入门

云原生专栏大纲 文章目录 ArgoCDArgoCD 简介GitOps介绍Argo CD 的工作流程argocd和jinkens对比kustomize介绍ArgoCD和kustomize关系 安装argocdargocd控制台介绍首页应用创建表单SYNC OPTIONS(同步选项)SYNC POLICY(同步策略) 应…

以超市数据微案例-fineBI可视化分析

一、入门案例: 2.分析思路: 数据清晰界面中添加毛利额计算 **所以在新增步骤之后,必须点击保存并更新,否则可视化界面中无法使用最新的数据 4、数据可视化分析 1)销售额最高的十大商品种类 为1-8月超市数据&#xff…

代码随想录刷题题Day38

刷题的第三十八天,希望自己能够不断坚持下去,迎来蜕变。😀😀😀 刷题语言:C Day38 任务 ● 300.最长递增子序列 ● 674. 最长连续递增序列 ● 718. 最长重复子数组 1 最长递增子序列 300.最长递增子序列 …

基于springboot+vue考编论坛

摘要 近年来,随着互联网的迅猛发展,编程论坛成为程序员们交流学术、分享经验的重要平台之一。为了满足广大程序员的需求,本文基于Spring Boot和Vue框架,设计并实现了一个功能强大的编程论坛。首先,我们选择Spring Boot…

微软使其AI驱动的阅读导师免费

每周跟踪AI热点新闻动向和震撼发展 想要探索生成式人工智能的前沿进展吗?订阅我们的简报,深入解析最新的技术突破、实际应用案例和未来的趋势。与全球数同行一同,从行业内部的深度分析和实用指南中受益。不要错过这个机会,成为AI领…

Excel 根据日期按月汇总公式

Excel 根据日期按月汇总公式 数据透视表日期那一列右击,选择“组合”,步长选择“月” 参考 Excel 根据日期按月汇总公式Excel如何按着日期来做每月求和

怎么提升搜狗网站排名

在当今数字化时代,网站排名对于品牌、企业以及个人都至关重要。而对于许多网站来说,搜狗搜索引擎是一个重要的流量来源。为了在搜狗上取得更好的排名,不仅需要优化网站内容,还需要巧妙运用一些工具和技巧。在本文中,我…

MySQL---单表查询综合练习

创建emp表 CREATE TABLE emp( empno INT(4) NOT NULL COMMENT 员工编号, ename VARCHAR(10) COMMENT 员工名字, job VARCHAR(10) COMMENT 职位, mgr INT(4) COMMENT 上司, hiredate DATE COMMENT 入职时间, sal INT(7) COMMENT 基本工资, comm INT(7) COMMENT 补贴, deptno INT…

人工智能时代的十大核心技术:重塑未来的无限可能 - 引言

在人工智能(AI)的浪潮中,无数技术如雨后春笋般涌现,引领着人类社会迈向一个崭新的时代。这些技术不仅在理论上具有突破性,更在实际应用中展现出巨大的潜力和价值。 本文将围绕人工智能时代的十大核心技术展开&#xff…

《Linux高性能服务器编程》笔记05

Linux高性能服务器编程 本文是读书笔记,如有侵权,请联系删除。 参考 Linux高性能服务器编程源码: https://github.com/raichen/LinuxServerCodes 豆瓣: Linux高性能服务器编程 文章目录 Linux高性能服务器编程第12章 高性能I/O框架库Libevent12.1 I/…

基于BERT对中文邮件内容分类

用BERT做中文邮件内容分类 项目背景与意义项目思路数据集介绍环境配置数据加载与预处理自定义数据集模型训练加载BERT预训练模型开始训练 预测效果 项目背景与意义 本文是《用BERT做中文邮件内容分类》系列的第二篇,该系列项目持续更新中。系列的起源是《使用Paddl…

采集B站up主视频信息

一、网页信息(示例网址:https://space.bilibili.com/3493110839511225/video) 二、查看响应数据 三、查看数据包内容 四、相关代码(代码内容未进行翻页爬取) # Time: 2024/1/19 16:42 # Author: 马龙强 # File: 采集B…

【Linux】第三十二站:命名管道

文章目录 一、命名管道介绍二、编码1.mkfifo2.unlink3.一个简单的例子4.修改 一、命名管道介绍 管道应用的一个限制就是只能在具有共同祖先(具有亲缘关系)的进程间通信。 如果我们想在不相关的进程之间交换数据,可以使用FIFO文件来做这项工作…

<软考高项备考>《论文专题 - 78 风险管理(10)》

10 论文-历年真题解析 10.1 2005年上半年真题 请围绕“项目的风险管理”论题,分别从以下三个方面进行论述: 1.概要叙述你参与管理过的信息系统项目(项目的背景、发起单位、目的、项目周期、交付的产品等)&#xff0c…