介绍
NSIS 是一款老牌专业开源软件,用来制作 Windows 安装程序。它可以实现程序的安装、卸载、系统设置、文件提取等功能。因为它是基于脚本语言,所以您可以完全控制安装程序的每个部分。
NSIS 脚本语言支持变量、函数和字符串操作,就像普通编程语言一样 - 但专为创建安装程序而设计。即使具有所有这些功能,NSIS 仍然是最小的安装程序系统。使用默认选项时,它的开销仅为 34 KB。
特征
- 开销很小(小于 40kb)
- 强大的脚本语言
- 易于使用,支持各种功能,如自定义界面、卸载程序、创建桌面快捷方式等
- 支持多语言
- 独特的压缩选项(zlib,bzip2,lzma)
安装 NSIS
在 NSIS 下载地址 下载 NSIS 安装程序,安装完成后默认会安装到 C:\\Program Files (x86)\\NSIS
。需要将这个目录添加进 PATH
里,以便使用 makensis.exe
执行 nsi 脚本。
创建 NSIS 安装程序
创建一个 NSIS 安装程序的过程包含三个主要步骤:
- 编写
.nsi
脚本文件; - 使用
makensis
编译脚本文件,makensis nsis.nsi
; - 运行生成的
.exe
安装程序;
以下是一个示例脚本文件:
;--------------------------------
; 常规属性
;--------------------------------
Name "My Application"
OutFile "MyApplication Setup.exe"
InstallDir "$PROGRAMFILES\my_application"
;--------------------------------
; 定义界面
;--------------------------------
!include "MUI2.nsh"
;--------------------------------
; 定义安装过程
;--------------------------------
; 安装目录选择页面
!insertmacro MUI_PAGE_DIRECTORY
; 安装过程页面
!insertmacro MUI_PAGE_INSTFILES
; 安装完成页面
!insertmacro MUI_PAGE_FINISH
; 卸载过程页面
!insertmacro MUI_UNPAGE_CONFIRM
; 卸载完成页面
!insertmacro MUI_UNPAGE_INSTFILES
;--------------------------------
; 定义安装区段
;--------------------------------
Section "MainSection" SEC01
SetOutPath $INSTDIR
File "MyApplication.exe"
SectionEnd
;--------------------------------
; 定义卸载区段
;--------------------------------
Section "Uninstall" SEC02
Delete $INSTDIR\\MyApplication.exe
RMDir $INSTDIR
SectionEnd
示例脚本说明:
常规属性:
Name
定义程序名称;
OutFile
NSIS 输出文件,也就是安装文件的输出路径;
InstallDir
安装目录;
定义界面
:引入新界面样式的头文件;
定义安装过程
:安装过程有两种,安装过程和卸载过程;
区段 (Section) :
安装时可能要选择安装多个组件,区段就是定义组件的安装文件和逻辑;
安装区段
:安装区段的名字定义相对随意,除了卸载区段的名称限制其他的都是安装区段;
卸载区段
:卸载区段的名字限制:前缀为 un.
或者名字是 Uninstall
的区段;
常量:
$PROGRAMFILES
:程序目录;
变量:
$INSTDIR
:安装目录;
脚本还有很多功能,可以查看手册:
其他示例
; 基本信息
!define APP_NAME "doghead-tool"
!define APP_LNK_NAME "狗头工具"
!define APP_VERSION "1.0.0"
; 新版 UI 2.0
!include "MUI2.nsh"
; 新版安装和卸载图标
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\orange-install.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\orange-uninstall.ico"
; 基础信息
Name ${APP_NAME}
OutFile "${APP_LNK_NAME} ${APP_VERSION} Setup.exe"
InstallDir "$PROGRAMFILES\${APP_NAME}"
; 安装完成后运行程序
!define MUI_FINISHPAGE_RUN "$INSTDIR\${APP_NAME}.exe"
!define MUI_FINISHPAGE_RUN_NOTCHECKED
; 安装完成后显示信息
!define MUI_FINISHPAGE_LINK "访问 rockrabbit 网站"
!define MUI_FINISHPAGE_LINK_LOCATION "https://www.68wu.cn"
; 安装目录选择页面
!insertmacro MUI_PAGE_DIRECTORY
; 安装过程页面
!insertmacro MUI_PAGE_INSTFILES
; 安装完成页面
!insertmacro MUI_PAGE_FINISH
; 卸载过程页面
!insertmacro MUI_UNPAGE_CONFIRM
; 卸载完成页面
!insertmacro MUI_UNPAGE_INSTFILES
; 定义语言
!insertmacro MUI_LANGUAGE "SimpChinese"
; 文件打包
Section MainSetup
SetOutPath $INSTDIR
File "doghead-tool.exe"
File "app.ico"
;创建注册信息
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" "DisplayName" "${APP_NAME}"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" "DisplayVersion" "${APP_VERSION}"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" "Publisher" "rockrabbit"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" "UninstallString" "$\"$INSTDIR\Uninstall.exe$\""
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" "InstallLocation" "$INSTDIR"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" "DisplayIcon" "$INSTDIR\app.ico"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" "HelpLink" "https://www.68wu.cn"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}" "URLInfoAbout" "https://www.68wu.cn"
;创建菜单快捷方式
CreateDirectory "$SMPROGRAMS\${APP_NAME}"
CreateShortCut "$SMPROGRAMS\${APP_NAME}\${APP_LNK_NAME}.lnk" "$INSTDIR\${APP_NAME}.exe"
CreateShortCut "$STARTMENU\${APP_NAME}\${APP_LNK_NAME}.lnk" "$INSTDIR\${APP_NAME}.exe"
;卸载程序
WriteUninstaller "$INSTDIR\Uninstall.exe"
;创建桌面快捷方式
CreateShortCut "$DESKTOP\${APP_LNK_NAME}.lnk" "$INSTDIR\${APP_NAME}.exe"
SectionEnd
; 卸载程序
Section Uninstall
;删除安装目录
RMDir /r "$INSTDIR"
;删除桌面快捷方式
Delete "$DESKTOP\${APP_LNK_NAME}.lnk"
;删除注册信息
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${APP_NAME}"
;删除菜单快捷方式
Delete "$SMPROGRAMS\${APP_NAME}\${APP_LNK_NAME}.lnk"
Delete "$STARTMENU\${APP_NAME}\${APP_LNK_NAME}.lnk"
RMDir /r "$SMPROGRAMS\${APP_NAME}"
SectionEnd