一、前言
NSIS(Nullsoft Scriptable Install System)是一个开源的 Windows 系统下安装程序制作程序。它提供了安装、卸载、系统设置、文件解压缩等功能。这如其名字所指出的那样,NSIS 是通过它的脚本语言来描述安装程序的行为和逻辑的。NSIS 的脚本语言和通常的编程语言有类似的结构和语法,但它是为安装程序这类应用所设计的。
二、演示
以Nsis_3.06.1.0增强版,打包QT发布的程序为例,在Windows上定制安装向导。
1、点击 “脚本编辑器VNISEdit”
2、选择“新建脚本:向导”
3、这里的参数自己都可以设置试一下,点击下一步:
以打包一个test.exe程序为例:
这个是做闪屏的,默认不勾选。
4、授权文件就是我们的licence.txt文件,这个文件的编码ASCII编码,就是记事本新建的默认文本格式,这个文件的的路径必须是存在的,否则后面的时候不能生成安装程序。
这里就是添加要打包程序文件夹的步骤。先把默认的模版文件删掉
勾选包含子目录(如果没有包含子目录选择就直接点击确定,后面再在脚本中加/r参数就行了)
点击下一步:
添加桌面快捷方式
手动补全:
test.lnk是自己的快捷方式名
$INSTDIR\test.exe 这个是你打包的文件中的可执行文件
保存脚本,下次就可以不用重新设置一遍了(要注意的是,脚本里使用的是相对路径)。
如果报错,下面有提示信息,看看什么没有设置。设置好后,下面就会出现这个安装向导程序:
安装完成后,桌面有快捷图标。双击,看是否出现界面。
安装目录中,有个uninst.exe卸载程序
三、NSIS在安装完成界面,添加开机自启动勾选选项的实现
对于制作好的安装包,有些时候可能需要在安装完成界面上添加一个可勾选的开机自启动的选项。
下面是具体的细节:
1.在安装完成界面设置添加如下代码:
!define MUI_FINISHPAGE_SHOWREADME
!define MUI_FINISHPAGE_SHOWREADME_Function AutoBoot
!define MUI_FINISHPAGE_SHOWREADME_TEXT "开机自启动"
上面的代码务必要添加在 " !insertmacro MUI_PAGE_FINISH "之前。
2.在Section后区段的后面添加Function部分(在Section之后,是为了避免产生未知的错误)
代码如下:
Function AutoBoot
WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Run" "testKey" "test.exe"
FunctionEnd
把上面的test替换成你要打包程序名就行了,主要是把信息写入系统注册表。
3.前两步已经可以实现开机自启动了。这最后一步,需要在卸载和初始化区段里面把注册表信息删除。原因是让用户在卸载程序和覆盖安装程序后,不会受到刚开始安装程序的写入系统注册表的影响。
在Section Uninstall里面添加如下代码:
;删除开机自启
DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Run" "testKey"
最后编译运行,就会发现在程序的安装完成界面出现了可勾选的开机自启动选项。
学习
注册启动项
- WriteRegStr
root_key + subkey + key_name + value - 以Test.exe为例, 注册启动项命令如下
- WriteRegStr HKCU "Software\Microsoft\Windows\CurrentVersion\Run" "TestAddKey" "$INSTDIR\Test.exe"
- #该命令放在安装区域(Section "MainSection" SEC01), 或者注册区域(Section -Post)都可以
命令解释:
- root_key: 注册表根键值: HKCU (HKEY_CURRENT_USER)
- subkey: 子键值: Run键(解释见前言)
- key_name: 新增键值名称: TestAddKey
- value: 启动命令: “Test.exe绝对路径”, 如有命令行参数可以在路径后添加
删除启动项
- DeleteRegValue
root_key + subkey + key_name - 以Test.exe为例, 删除启动项命令如下
- DeleteRegValue HKCU "Software\Microsoft\Windows\CurrentVersion\Run" "TestAddKey"
- #该命令放在卸载命令区域(Section Uninstall)
命令解释:
- root_key: 注册表根键: HKCU (HKEY_CURRENT_USER)
- subkey: 子键位置: Run键(解释见前言)
- key_name: 要删除的Key名称: TestAddKey
- 验证
- 打开注册表: WIN + R 输入: regedit
- 在HKCU下依次展开找到Run键
- 观察Run键下子键是否新增/删除, 键值是否正确
四、使用NSIS制作的安装包安装后,无法卸载干净的问题
1、使用Process进程检测终止插件。
下载Process进程检测终止插件,然后按照说明文档放到NSIS安装目录对应的位置。
文件 Process.dll - ANSI 版放到 Plugins\x86-ansi 目录。
文件 Unicode\Process.dll - Unicode 版放到 Plugins\x86-unicode 目录。
或在脚本中使用:
!addPluginDir /x86-ansi .
!addPluginDir /x86-unicode .\Unicode
语法来指定自定义插件目录。点 (.) 代表当前目录,或者其他自定义路径。
用法:
Process::FindProcess "ProcessName.exe"
Pop $var
# 1 - 找到
# 0 - 未找到
Process::KillProcess "ProcessName.exe"
Pop $var
# 1 - 成功终止
# 0 - 未能终止
注:为保证终止结果准确,只终止一个进程。如果多个请使用循环。
这里的
RMDir "$INSTDIR"
改成
RMDir /r "$INSTDIR"
这样就可以把整个hello安装目录的所有文件,包括这个目录都删掉。
RMDir
[/r] [/REBOOTOK] 目录名
删除指定的目录(没有通配符的完整路径)。没有 /r 参数时只有在目录为空时才会被删除。如果指定了 /r ,则目录会被递归删除,所以在指定目录下的所有文件和目录均被删除。如果指定了 /REBOOTOK ,任何当前不能删除的文件或目录将会在重启后被删除 – 如果文件或目录需要在重启时被删除,会放置一个重启的标记。当文件或目录不能被删除时放置一个错误的标记。
五、解决程序安装后要右键管理员权限运行问题
如下图,加入一下几行代码
;让安装程序以管理权限运行
RequestExecutionLevel admin
Section "test"
;针对当前用户有效
WriteRegStr HKCU "SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" "$INSTDIR\xxxx.exe" "RUNASADMIN"
;针对所有用户有效
WriteRegStr HKEY_LOCAL_MACHINE "SOFTWARE\Microsoft\Windows NT\CurrentVersion\AppCompatFlags\Layers" "$INSTDIR\xxxx.exe" "RUNASADMIN"
SectionEnd
注意:程序安装时需要使用管理员权限进行安装,才能往注册写入信息
六、下载
Process进程检测终止.zip
链接:https://pan.baidu.com/s/1fO0NfqtNUO-QAo-ZtrXBnQ?pwd=2pun
提取码:2pun
Nsis_3.06.1.0增强版.exe
链接:https://pan.baidu.com/s/10DSvhvGiNJzTPZpwKcdRag?pwd=dd7i
提取码:dd7i