NSIS简介

NSIS(Nullsoft Scriptable Install System)是一种为Windows创建安装程序的工具,开源免费。
NSIS创建能够安装,卸载,设置系统设置,提取文件等的安装程序。可完全控制安装程序的每个部分, 使用默认选项,开销只有34 KB。

NSIS特性

NSIS将所有文件和安装脚本打包压缩成一个可执行文件,有三种集成压缩方法(ZLib,BZip2,LZMA), 其中LZMA压缩方法效果更好。
可以轻松添加自定义逻辑并处理不同的升级,版本检查和更多。
脚本语言提供可以在目标系统上使用的命令, 支持变量,函数和字符串操作,从文件夹创建和注册表编辑到文本/二进制文件修改,修改环境变量和系统重新引导等.
甚至可以直接调用Windows API。可以创建自定义向导页面以获取用户输入或集成配置选项。
NSIS包括一个经典和现代的向导界面,甚至可以创建自己的自定义界面(对话框,字体,背景,图标,文本,复选标记,图像等)
NSIS编译器具有强大的预处理器。允许将多个项目集成到单个安装程序中或自动生成安装程序构建。还可生成不同的版本,如精简版和完整版本。
完全多语言,在一个安装程序中支持多种语言。有60多个翻译可用,也可以创建自己的翻译。 Unicode支持允许更多的语言。
Installer 使用CRC32校验和进行自检,能够从注册表检测目标目录.
易于使用的插件系统(包括用于创建自定义对话框,互联网连接,HTTP下载,文件修补,Win32 API调用等的插件).
Installer 可以大到2GB .自动安装的可选静音模式 一个预处理器,支持定义的符号,宏,条件编译,标准预定义.

NSIS版本选择

NSIS有unicode版本和GBK版本,选择NSIS时需要注意,如果你想以utf-8打开nsi文件,那么请选择NSIS的unicode版本的.否则选择GBK版本的.否则在编译nsi文件时会报错.

模板结构

预设参数(包括外部压缩器选择、编译选项、宏定义以及文件包含等)
普通安装设置
自定义函数
安装程序区域内容
安装程序回调函数及其相关函数定义
卸载程序区域内容
卸载程序回调函数及其相关函数定义

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
;定义一些参数
!define PRODUCT_NAME "valueReader"
!define PRODUCT_VERSION "1.0.0.0"
!define PRODUCT_PUBLISHER "Arvin"
!define PRODUCT_FULL_NAME "${PRODUCT_NAME} ${PRODUCT_VERSION}"
!define OUT_DIR "."
!define OUT_FILE_NAME "${PRODUCT_NAME}.exe"
RequestExecutionLevel user
!define UNINST_KEY "SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall"
!define SHORTCUT_NAME "${PRODUCT_NAME}"
!define PRODUCT_UNINST_KEY "${UNINST_KEY}\${PRODUCT_NAME}"
; MUI 设置
!define MUI_WELCOMEPAGE_TITLE " ${PRODUCT_NAME} ${PRODUCT_VERSION}安装向导"
!define MUI_WELCOMEFINISHPAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Wizard\orange.bmp"
!define MUI_HEADERIMAGE
!define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Header\orange.bmp"
!define MUI_HEADERIMAGE_UNBITMAP "${NSISDIR}\Contrib\Graphics\Header\orange-uninstall.bmp"
!include MUI2.nsh
!include FileFunc.nsh
Name "${PRODUCT_NAME}"
BrandingText "http://www.microbit.com/"
; 输出文件
OutFile "${OUT_DIR}\${OUT_FILE_NAME}"
; 安装路径
InstallDir "C:\${PRODUCT_NAME}"
;安装显示图标及图片
;!define MUI_ICON "favor.ico"
;卸载图标
;!define MUI_UNICON "uninst.ico"
;Icon "favor.ico"
;UninstallIcon "uninst.ico"
Page custom nsDialogsPage nsDialogsPageLeave
; 安装页面
!insertmacro MUI_PAGE_WELCOME
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
; 卸载页面
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
; 语言支持
!insertmacro MUI_LANGUAGE SimpChinese
Section "Installer Section"
Delete "$DESKTOP\${PRODUCT_NAME}*.lnk"
Delete "$SMSTARTUP\${PRODUCT_NAME}*.lnk"
RMDir /r "$SMPROGRAMS\${PRODUCT_NAME}"
SetOutPath $INSTDIR
; 拷贝文件和文件夹, 过滤不需要拷贝文件
File /r /x "*.nsi" /x "*.bat" /x "*.pyc" /x "make/*" ".\dist\*"
File /r "log"
File /r "make\platforms"
File "config.ini"
File "favor.ico"
File "uninst.ico"
WriteUninstaller "uninstall.exe"
; 开机自动启动
;CreateShortCut "$SMSTARTUP\${PRODUCT_NAME}.lnk" "$INSTDIR\${PRODUCT_NAME}.exe"
CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
; 创建卸载快捷方式到[开始]菜单
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\卸载 ${PRODUCT_NAME}.lnk" "$INSTDIR\Uninstall.exe"
; 创建快捷方式到[开始]菜单
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\${PRODUCT_NAME}.lnk" "$INSTDIR\${PRODUCT_NAME}.exe" "" "$INSTDIR\favor.ico"
; 创建快捷方式到桌面
CreateShortCut "$DESKTOP\${PRODUCT_NAME}.lnk" "$INSTDIR\${PRODUCT_NAME}.exe" "" "$INSTDIR\favor.ico"
WriteRegStr HKLM "${PRODUCT_UNINST_KEY}" "DisplayName" "${PRODUCT_NAME}"
WriteRegStr HKLM "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\${PRODUCT_NAME}.exe"
WriteRegStr HKLM "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninstall.exe"
WriteRegStr HKLM "${PRODUCT_UNINST_KEY}" "Publisher" "Arvin"
SectionEnd
Section "un.Uninstaller Section"
Delete "$DESKTOP\${PRODUCT_NAME}*.lnk"
Delete "$DESKTOP\${SHORTCUT_NAME}*.lnk"
Delete "$SMSTARTUP\${PRODUCT_NAME}*.lnk"
RMDir /r "$SMPROGRAMS\${PRODUCT_NAME}"
RMDir /r "$INSTDIR"
DeleteRegKey HKLM "${PRODUCT_UNINST_KEY}"
SectionEnd
VIProductVersion "${PRODUCT_VERSION}"
VIAddVersionKey /LANG=${LANG_SIMPCHINESE} "CompanyName" "MicroBit Auto"
VIAddVersionKey /LANG=${LANG_SIMPCHINESE} "FileDescription" "${PRODUCT_NAME} 安装程序"
VIAddVersionKey /LANG=${LANG_SIMPCHINESE} "FileVersion" "${PRODUCT_VERSION}"
VIAddVersionKey /LANG=${LANG_SIMPCHINESE} "InternalName" "${OUT_FILE_NAME}"
VIAddVersionKey /LANG=${LANG_SIMPCHINESE} "LegalCopyright" "Copyright (C) 2017 Arvin"
VIAddVersionKey /LANG=${LANG_SIMPCHINESE} "OriginalFilename" "${OUT_FILE_NAME}"
VIAddVersionKey /LANG=${LANG_SIMPCHINESE} "ProductName" "${PRODUCT_NAME}"
VIAddVersionKey /LANG=${LANG_SIMPCHINESE} "ProductVersion" "${PRODUCT_VERSION}"
Var UninstallFileName
Function .onInit
Call CreateMutex
ReadRegStr $UninstallFileName HKLM "${PRODUCT_UNINST_KEY}" "UninstallString"
FunctionEnd
Function CreateMutex
Retry:
System::Call "kernel32::CreateMutexW(i 0, i 0, w 'MicroBitauto.com/valReader/1.0' ) i .R1 ?e"
Pop $R0
System::Call "kernel32::CloseHandle(i R1) i.s"
${If} $R0 != 0
MessageBox MB_RetryCancel|MB_ICONEXCLAMATION "${PRODUCT_NAME} 正在运行. 请关闭 ${PRODUCT_NAME} 后重试" IdRetry Retry
Quit
${EndIf}
FunctionEnd
Var RADIO_REPAIR
Var RADIO_REMOVE
Var Checkbox_State_REPAIR
Var Checkbox_State_REMOVE
Var Checkbox_State
Function nsDialogsPage
${if} $UninstallFileName == ""
Abort
${EndIf}
!insertmacro MUI_HEADER_TEXT "${PRODUCT_NAME} 维护模式" "重新安装或卸载“${PRODUCT_NAME}”"
nsDialogs::Create /NOUNLOAD 1018
${NSD_CreateLabel} 0u 0u 300u 30u "请选择您要执行的操作,然后单击 [下一步(N)] 继续"
${NSD_CreateRadioButton} 30u 30u 120u 30u "重新安装"
Pop $RADIO_REPAIR
${If} $Checkbox_State_REPAIR == ${BST_CHECKED}
${NSD_Check} $RADIO_REPAIR
${NSD_GetState} $RADIO_REPAIR $Checkbox_State
${EndIf}
${NSD_CreateRadioButton} 30u 60u 120u 30u "卸载"
Pop $RADIO_REMOVE
${If} $Checkbox_State_REMOVE == ${BST_CHECKED}
${NSD_Check} $RADIO_REMOVE
${NSD_GetState} $RADIO_REMOVE $Checkbox_State
${EndIf}
${If} $Checkbox_State <> ${BST_CHECKED}
${NSD_Check} $RADIO_REPAIR
${EndIf}
nsDialogs::Show
FunctionEnd
Function nsDialogsPageLeave
${NSD_GetState} $RADIO_REPAIR $Checkbox_State_REPAIR
${NSD_GetState} $RADIO_REMOVE $Checkbox_State_REMOVE
${If} $Checkbox_State_REMOVE == ${BST_CHECKED}
Exec $UninstallFileName
Quit
${EndIf}
FunctionEnd

参考