大部分人第一次看到NSIS脚本都是一脸懵逼的。因为它这个脚本的结构乍一看上去就非常奇怪,不作说明的话是看不懂的。

编写脚本命令的时候要非常注意,命令要按照规定写在脚本中不同的段落里,也就是说,命令的先后顺序非常重要。

下面提供了一个标准的简单的脚本例子,使用注释说明了每个命令的具体作用,大家如果想快速上手编译出一个安装包,直接照着这个例子一行行抄就行了。

# NSIS Modern User Interface# 关于 Modern 风格界面的命令和宏定义需要参考 NSIS目录下\Docs\Modern UI 2\Readme.html 这个文件的说明。# 遇到不懂的命令直接查看手册即可获得说明。# 脚本的段落用 ---- 线进行划分。不同的段落可编写的命令不同,重点注意。
# Written by Shiroha#--------------------------------
# Includes
# 包含需要用到的头文件,这跟 C 语言是一样的。
!include "MUI2.nsh"       # 使用 Modern 风格界面,也就是大家最熟悉的那种下一步下一步界面。!include "LogicLib.nsh"   # 逻辑操作符头文件。就是 {If} 那些。!include "nsProcess.nsh"  # 进程控制插件头文件。用来查找进程和强制结束进程。这个插件可以在 NSIS 官方站点找到下载。#--------------------------------
# General
# 安装包的基本属性设置。# Properly display all languages (Installer will not work on Windows 95, 98 or ME!)Unicode true  # 设置为 Unicode 模式,这样界面才可以显示全部的语言。# Name and fileName "$(STR_ProductName)"   # 设定软件的名字。OutFile "vnr_translate_patch_1.4.0.0.exe" # 设定编译输出的文件名。# Default installation folderInstallDir "" # 设定默认的安装路径。# Allow install to root directoryAllowRootDirInstall true  # 允许用户在安装路径选择界面选择磁盘的根目录。# Request application privileges for Windows VistaRequestExecutionLevel user  # 设定安装包需要的用户权限,只用于 Vista 以上的版本。设置为 admin 编译出来的 EXE 会带有盾牌小图标。# Show the details by defaultShowInstDetails show  # 默认显示安装细节,安装过程中输出的文字信息。#--------------------------------
# Compiler Flags
# 编译器选项,影响压缩算法等等。
SetCompressor lzma  # 使用 LZMA 压缩算法,压缩质量比较好。SetDateSave off # 不保存文件日期,安装后文件的日期都是新生成的。#--------------------------------
# Interface Settings
# 界面选项,修改界面上的一些元素。# The icon for the installer!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\nsis3-install-alt.ico"  # 安装包使用的图标文件。MUI_*开头的宏都定义在 MUI2.nsh 文件里,请查看 Modern UI 2 的说明。# Sets the text that is shown at the bottom of the install windowBrandingText "Provided by Shiroha"  # 设置分割线上的文字。# Bitmap for the Welcome page and the Finish page!define MUI_WELCOMEFINISHPAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Wizard\nsis3-metro.bmp" # 设置欢迎和完成界面左侧的图片。# Display a checkbox the user has to check to agree with the license terms!define MUI_LICENSEPAGE_CHECKBOX  # 使用复选框来确认安装协议。!define MUI_LICENSEPAGE_CHECKBOX_TEXT "$(STR_LicenseAccept)"  # 复选框的文字。# The bitmap with images for the checks of the component select treeview!define MUI_COMPONENTSPAGE_CHECKBITMAP "check.bmp"  # 选择安装组件界面的复选框图片,可以自定义的。# Do not automatically jump to the finish page, to allow the user to check the install log!define MUI_FINISHPAGE_NOAUTOCLOSE  # 安装完成后不要自动跳过过程界面。# Show a message box with a warning when the user wants to close the installer!define MUI_ABORTWARNING  # 中途退出安装时弹出提示。# Text for a link on the which the user can click to view a website or file!define MUI_FINISHPAGE_LINK "$(STR_ViewMoreInfo)" # 在完成界面显示一个链接,这个是链接上的文本。# Website or file which the user can select to view using the link!define MUI_FINISHPAGE_LINK_LOCATION "http://tieba.baidu.com/p/6196474861"  # 链接的实际地址。# Show all languages, despite user's codepage!define MUI_LANGDLL_ALLLANGUAGES  # 强制显示所有支持的语言。#--------------------------------
# Installer pages
# 安装包要显示的界面,需要注意的是,界面是按照插入顺序来显示的。# Include welcome page!define MUI_PAGE_CUSTOMFUNCTION_LEAVE "OnPageWelcomeLeave"  # 这个函数会在点击欢迎界面的下一步按钮时调用。!insertmacro MUI_PAGE_WELCOME # 首先插入的是欢迎界面。# Create a custom donate pagePage custom "OnPageDonateCreate"  # 插入一个自定义界面。# Include license page!insertmacro MUI_PAGE_LICENSE $(STR_License)  # 插入协议确认界面。# Include directory selection page!define MUI_PAGE_CUSTOMFUNCTION_LEAVE "OnPageDirectoryLeave"  # 这个函数会在点击选择安装路径界面的下一步按钮时调用。!insertmacro MUI_PAGE_DIRECTORY # 插入选择安装路径界面。# Include install files page!insertmacro MUI_PAGE_INSTFILES # 插入安装过程界面。# Include finish page!insertmacro MUI_PAGE_FINISH  # 插入完成界面。#--------------------------------
# Languages
# 定义要支持的语言。
!insertmacro MUI_LANGUAGE "SimpChinese" # 简体中文,会定义 LANG_SIMPCHINESE 变量。!insertmacro MUI_LANGUAGE "TradChinese" # 繁体中文,会定义 LANG_TRADCHINESE 变量。#--------------------------------
# Language strings
# 定义一些字符串的多语言版本。
# 使用多语言字符串时要注意用的是小括号,例如 $() 而不是 ${}
LangString STR_ProductName ${LANG_SIMPCHINESE} "VNR 翻译修复补丁 1.4"LangString STR_ProductName ${LANG_TRADCHINESE} "VNR 翻譯修復補丁 1.4"LangString STR_AppIsRunning ${LANG_SIMPCHINESE} "检测到 VNR 正在运行,请将其退出后再试。"LangString STR_AppIsRunning ${LANG_TRADCHINESE} "檢測到 VNR 正在運行,請將其退出後再試。"LangString STR_DonatePageTitle ${LANG_SIMPCHINESE} "支持作者"LangString STR_DonatePageTitle ${LANG_TRADCHINESE} "支持作者"LangString STR_DonatePageSubTitle ${LANG_SIMPCHINESE} "喵喵喵~"LangString STR_DonatePageSubTitle ${LANG_TRADCHINESE} "喵喵喵~"LicenseLangString STR_License ${LANG_SIMPCHINESE} "license.zh-cn.rtf"LicenseLangString STR_License ${LANG_TRADCHINESE} "license.zh-tw.rtf"LangString STR_LicenseAccept ${LANG_SIMPCHINESE} "我已经备份好这些文件夹(&A)"LangString STR_LicenseAccept ${LANG_TRADCHINESE} "我已經備份好這些資料夾(&A)"LangString STR_WrongInstallDirectory ${LANG_SIMPCHINESE} "你选择的文件夹不是 VNR 的安装文件夹,请重新选择。"LangString STR_WrongInstallDirectory ${LANG_TRADCHINESE} "你選擇的資料夾不是 VNR 的安裝資料夾,請重新選擇。"LangString STR_ViewMoreInfo ${LANG_SIMPCHINESE} "浏览贴吧查看更多信息(&M)"LangString STR_ViewMoreInfo ${LANG_TRADCHINESE} "瀏覽貼吧查看更多資訊(&M)"#--------------------------------
# Version Information
# 定义输出的 EXE 文件上的版本信息,也支持多语言显示。
VIProductVersion "1.4.0.0"VIFileVersion "1.4.0.0"VIAddVersionKey /LANG=${LANG_SIMPCHINESE} "ProductName" "VNR 翻译修复补丁"VIAddVersionKey /LANG=${LANG_TRADCHINESE} "ProductName" "VNR 翻譯修復補丁"VIAddVersionKey /LANG=${LANG_SIMPCHINESE} "ProductVersion" "1.4.0.0"VIAddVersionKey /LANG=${LANG_TRADCHINESE} "ProductVersion" "1.4.0.0"VIAddVersionKey /LANG=${LANG_SIMPCHINESE} "LegalCopyright" "Shiroha"VIAddVersionKey /LANG=${LANG_TRADCHINESE} "LegalCopyright" "Shiroha"VIAddVersionKey /LANG=${LANG_SIMPCHINESE} "FileDescription" "Application Installer"VIAddVersionKey /LANG=${LANG_TRADCHINESE} "FileDescription" "Application Installer"#--------------------------------
# Reserve Files
# 保留特殊的文件,这些文件会单独压缩,以便安装包启动时快速定位数据并且解压。# If you are using solid compression, files that are required before# the actual installation should be stored first in the data block,# because this will make your installer start faster.
!insertmacro MUI_RESERVEFILE_LANGDLL  # 保留多语言支持插件的DLL文件。# QR code image fileReserveFile "donate.bmp"  # 保留一个自定义图片文件。#--------------------------------
# Installer Sections
# 定义安装过程的组件,安装包至少要有一个组件。如果有多个组件,那就需要定义多个。
# 组件可以定义组件名和执行安装的优先级。
# 安装时会按顺序执行组件中编写的命令。

Section # 本安装包只有一个组件。# Sets output directorySetOutPath "$INSTDIR" # 设置文件输出路径为安装路径。# FilesFile /r "Files\*.*" # 定义要解包的文件。# 这个命令比较特殊,他既定义了要打包的文件,也用于在安装时解包这些文件。# 这里定义的路径是要打包的文件的路径,这里用了通配符来表示 Files 目录下的所有文件,也可以指定单个文件。# 安装时,文件将会解包到 SetOutPath 所设置的路径。# 如果 File 命令定义了多个文件,会按目录结构解包文件,就像平时解压文件一样。

SectionEnd#--------------------------------
# Installer Functions
# 定义安装包要用到的所有函数。
# 根据 NSIS 脚本的惯例,函数必须写在脚本的最后。

Function ".onInit"  # 以 “.” 开头的函数都是内置的回调函数,会在特定时机自动执行。# 这个函数在安装包启动的时候最先执行。# $PLUGINSDIR will automatically be removed when the installer closesInitPluginsDir  # 这个命令用于初始化 $PLUGINSDIR 这个变量,一般路径是 “用户临时目录\ns随机字符.tmp\”# Show the language selection dialog!insertmacro MUI_LANGDLL_DISPLAY  # 显示语言选择对话框。# Extract QR code image fileFile "/oname=$PLUGINSDIR\donate.bmp" "donate.bmp" # 把自定义图片解包到临时目录。

FunctionEndFunction "OnPageWelcomeLeave" # 这个函数会在点击欢迎界面的下一步按钮时调用。${nsProcess::FindProcess} "python.exe" $R0  # 查找名为 “python.exe” 的进程,把结果存到 $R0 寄存器里。${If} $R0 != 0  # 如果没找到,尝试查找另一个。${nsProcess::FindProcess} "pythonw.exe" $R0 # 查找名为 pythonw.exe” 的进程,把结果存到 $R0 寄存器里。${If} $R0 != 0  # 如果也没找到,就可以开始安装了。${nsProcess::Unload}  # 这个插件用完之后要手动卸载掉。Return  # 调用返回表示可以进入下一个安装界面。
    ${EndIf}${EndIf}${nsProcess::Unload}  # 这个插件用完之后要手动卸载掉。MessageBox MB_ICONEXCLAMATION|MB_OK "$(STR_AppIsRunning)" # 检查到程序正在运行,弹出一个消息框。Abort # 调用 Abort 表示不可以进入下一个安装界面。
FunctionEndFunction "OnPageDonateCreate" # 这个函数会在创建上面定义的界面时调用。!insertmacro MUI_HEADER_TEXT "$(STR_DonatePageTitle)" "$(STR_DonatePageSubTitle)" # 设定页面主标题和副标题nsDialogs::Create 1018  # 创建界面,参数通常固定是“1018”,除非你打算创建很特殊的界面或者对话框。${NSD_CreateBitmap} 0 0 100% 100% ""  # 创建一个图片框,左边是“0,0”大小是“100%,100%”,图片框的句柄会被压入栈中。Pop $R0 # 从栈中弹出图片框的句柄并存入 $R0 寄存器。${NSD_SetImage} $R0 "$PLUGINSDIR\donate.bmp" $R1  # 给图片框设置一个图片,并且会返回一个图片句柄,存入 $R1 寄存器,需要手动释放。nsDialogs::Show # 把界面显示出来。${NSD_FreeImage} $R1  # 释放图片句柄。
FunctionEndFunction "OnPageDirectoryLeave" # 这个函数会在点击选择安装路径界面的下一步按钮时调用。${IfNot} ${FileExists} "$INSTDIR\Visual Novel Reader.exe" # 检查用户选择的安装路径下是否存在“Visual Novel Reader.exe”这个文件。MessageBox MB_ICONEXCLAMATION|MB_OK "$(STR_WrongInstallDirectory)"  # 不存在说明路径选择错误,弹出提示框。Abort # 调用 Abort 表示不可以进入下一个安装界面。
  ${EndIf}
FunctionEnd#--------------------------------
# End of script

效果如下:

(语言选择界面)

(欢迎界面)

(自定义界面)

(协议界面)

(选择安装路径界面)

(安装过程界面)

(完成界面)

以上脚本只是简单例子,并不包含在“安装或卸载程序”登记等需要写入注册表的功能,也不包含创建快捷方式的功能,也没有编写卸载程序。这个例子只是简单地将文件解包到指定目录而已。

如果你看完了这个例子还有诸多不懂,一定要多看 NSIS 安装目录下的 Examples 文件夹里的例子,里面的例子演示了各种功能和命令的用法。很快就能学会的。我也就花了一天时间。

转载于:https://www.cnblogs.com/crsky/p/11257543.html

使用NSIS脚本制作一个安装包相关推荐

  1. NSIS安装包开发笔记(一):NSIS介绍、使用NSIS默认向导脚本制作Windows安装包

    若该文为原创文章,转载请注明原文出处 本文章博客地址:https://blog.csdn.net/qq21497936/article/details/116445811 长期持续带来更多项目与技术分 ...

  2. NSIS + QT 制作自定义界面安装包

    NSIS + DUI(DLL形式)制作自定义界面的安装包有很多教程,但是NSIS + QT(DLL形式)实现自定义界面安装包的,翻遍全网,还真没找到有用的资料,无奈只能自己写一个! 先看效果,后续再分 ...

  3. 如何使用winrar制作一个安装包

    当你完成了一个awesome的程序之后,如何分享给你的小伙伴?压缩包?太low.安装包?太难. 折中一下,搞一个自解压安装包如何? 工具很简单,Rar就可以了 首先将想要的文件创建rar压缩包,在选项 ...

  4. 使用nsis制作的安装包安装后,无法卸载干净的问题

    使用nsis制作的安装包安装后,在安装目录下会生成uninst.exe文件,如下图所示. 我们可以通过执行该uninst.exe程序删除已经安装的软件,也可以在控制面板中删除该软件.但有时候我们通过这 ...

  5. python卸载_如何为Python程序制作Windows安装包?

    我们使用Python可以编写很多提高工作和学习效率的小工具,在编写完之后,如果我们想将其分享给更多的人使用,那么最便捷的方法就是将其打包为可执行程序. 在Windows环境下,我们使用Pyinstal ...

  6. 制作FreeCAD安装包的方法

    制作FreeCAD安装包的方法 济南友泉软件有限公司 本文介绍两种在Windows下制作FreeCAD安装包的方法:使用CPack制作安装包.直接使用NSIS制作安装包. 零.基础环境 操作系统:Wi ...

  7. linux/ubuntu中制作deb安装包

    linux/ubuntu中制作deb安装包 由于要制作一个在arm平台上运行的xorg-server-1.12.4版本的安装包,所以需要学习如何制作deb安装包.这里以一个非常小的工程为例,记录制作的 ...

  8. 使用HM NIS Edit制作软件安装包

    使用HM NIS Edit制作软件安装包 使用HM NIS Edit制作软件安装包 背景 准备工作 制作流程 结束语 背景 由于参与的横向项目需要,需要对实验室开发的VSP处理软件进行安装包制作,主要 ...

  9. Silent Install Builder制作静默安装包实现软件自动部署

    Silent Install Builder 5制作静默安装包实现软件自动部署(部分软件不支持脚本录制安装) 第一步下载安装 地址https://apreltech.com/SilentInstall ...

最新文章

  1. 银行、航空软件结构图
  2. 从计算机体系结构方面思考深度学习
  3. STM32f103 —— timer
  4. 计算机网络实验报告校园网,校园网规划与设计实验报告.docx
  5. 模式窗体 winform 1201
  6. 直接调用内置数据源连接对话框(C#/VB.NET2005源码)
  7. 微信表情暂停使用,漂流瓶功能彻底再见!
  8. c语言 乱序字符,C语言中两种结构体成员初始化方式:顺序和乱序
  9. 计算机控制的电冰箱,电冰箱控制电路图及工作原理
  10. Intent的基本知识
  11. f(!gotop.length) return false;
  12. 利用FPGA制作数字电压表
  13. petalinux 1144文档 安装流程
  14. 2021-05-12 MongoDB面试题 MongoDB副本集选举条件有那些
  15. vue跳转新页面链接以及url 转码
  16. Koa koa-combine-routers 分路由管理
  17. OpenWrt PWM呼吸灯
  18. 最长递增子序列 O(NlogN)算法
  19. scrapy框架之shell
  20. ARM各版本架构区别,各架构的系列芯片。

热门文章

  1. Balsamiq Mockups 入门教程
  2. Kaggle天池比赛经验
  3. 压缩软件如何删除压缩包密码(zip、rar、7-zip),忘记密码如何删除密码?
  4. 我用python实现了一个量化选股程序
  5. mysql数据库级监控及常用计数器解析
  6. 【10.28 校内普及组】 小B浇花 题解
  7. Git 核心概念:工作区与暂缓区(添加提交及查看状态充分体现)
  8. 在EXCEL电子表格中怎么把页面调成横向的
  9. 计算机设置曲线超高方法,32604007曲线外轨超高设置方法及计算公式.pdf
  10. 做人的十三条黄金玉律