今天学习一下一个打包工具,以前只知道用Visual Studio的原生打包工具,接触了NSIS 发现这个打包工具还是有很多可取之处的 虽然稍微复杂点,好了 话不多说 一起来看一下
一、定义变量
首先是国际礼仪,定义所需的所有变量和常量
常量用!define PRODUCT_NANM
全局变量用 Var NAME
NSIS除了提供了变量$0~$9,$r0~$r9来存放文字外通过push可以将这些参数暂时压入堆栈 pop 可以弹出堆栈 刚才压入的参数
StrCpy $0 3 这个是赋值
push $0 压入
pop 弹出
现在赋值StrCpy $0 6
那么现在就是6了
但是如果pop一下 就变回3了
还有就是一行没有输入下的可以用\做连接符 这样系统识别就会按照一行去识别了
二、定义安装风格和初始化
然后引用一下包和头文件这个大家可能比较熟悉了!include 我这里引用了 WordFunc.nsh 这个是头文件,里面有几个函数 里面的这些函数 主要都是为了查找字符串引用了这个就行了
然后我引用了MUI2.nsh这个 这个就是大家最长说的傻瓜式下一步下一步,而且里面可以设置很多东西。
然后简单的定义一下产品包的信息
Name "ProductName" 产品名
OutFile "ProductName.exe" 输出的应用程序
InstallDir "$PROGRAMFILES\Dir" 安装目录
InstallDirRegKey HKLM "安装目录注册表" “注册表名”
ShowInstDetails show 显示安装详情
ShowUnInstDetails show 显示卸载详情
RequestExecutionLevel admin 需要管理员权限
BrandingText "ProductName" 品牌信息
三、版本确认
定义完基础东西那么先确认安装的版本这里大部分用到的函数如下
VersionCompare 是比较版本
用法:
${VersionCompare} "Version1" "Version2" $var
$var 的返回值 0是版本相同 1是版本1较高 2是版本2较高
ReadRegDWORD 这个是读取注册表的一个32位DWORD输出到用户变量
用法:
ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\" "Install"
HKLM这个就是注册表的HKEY_LOCAL_MACHINE 的简单写法 第4个参数是详细路径 第5个参数 是文件名字 他的值会返回到第二个参数$0上
StrCmp 这个是用来比较注册表标记的
用法:
StrCmp 字串1 字串2 相同跳转标记(KnowNetFrameworkVersion) 不相同跳转的标记(例:+1)
一共4个变量 前面字串1和字串2是用来比较的 后面是类似三项表达式的方式选择结果的
依赖的版本确认后就可以进行解压了
四、解压设置
解压 代码要包含在 Section SectionEnd中
Section 可以隐藏 也可以不隐藏 可用参数
1、 什么都不加 就正常显示
2、- 隐藏区段
3、# 隐藏区段
4、!描黑区段 就是字体加粗
5、/o 可选区段 默认为不选
6、“某些安装” SEC_IDX
7、如果以Uninstall开头或者un.开头则为卸载程序
SectionEnd
SetOutPath 输出路径 必须为全路径名 通常使用$INSTDIR 他的意思是安装目录 后面可以加目录
用法:
SetOutPath "$INSTDIR\Dir"
SetOverwrite 这个是设置解压时是否覆盖的
除了 on和off 之外 建议大家用ifnewer 这个是你新打包的版本 如果比存在的版本新时则覆盖。
try则是文件可以被覆盖时才覆盖
还有一个就是ifdiff 这个是目标文件比心文件旧或新时覆盖目标文件
ifnewer 或 ifdiff 模式下目标文件的日期都会被设置为新文件的日期而不管 SetDateSave 是怎么设置的。
用法:
SetOverwrite ifnewer
File 这个是释放文件的输出路径一般用$OUTDIR 他的意思是当前输出路径,匹配文件的设置支持通配符* 就是上面的覆盖文件的文件选择
里面包含的参数 /r /a /x /nonfatal /oname 这里一般选的/r比较多 就是匹配的文件在所有子文件夹都回递归只要目录匹配则所有包含的文件内容都会被递归添加,目录结构也会保持
用法 :
File /r "$OUTDIR\dir\*.*"
CreateDirectory 创建菜单目录 一般用$SMPROGRAMS 这个是开始程序菜单的目录路径
用法:
CreateDirectory "$SMPROGRAMS\Dir\"
CreateShortCut 创建菜单的子选择项 例如开始菜单的软件快捷方式 后面第二个参数要写入软件的软件源路径
用法:
CreateShortCut $SMPROGRAMS\Dir\project.lnk" "$INSTDIR\Dir\project.exe“
同样的创建桌面只需要CreateShortCut "$DESKTOP\Dir\project.lnk” "$INSTDIR\Dir\project.exe“
用户文件里就是$LOCALAPPDATA 也就是C:\Users\你的用户名\AppData\Local
WriteRegStr 创建完当然要写入注册表
用法:
WriteRegStr HKLM “software\我的公司\我的软件” “可扩充的字符串值” "软件路径"
ReadRegStr有写就有读
用法:
ReadRegStr $vars HKLM "路径" “Path”
这个就是把一个路径值赋值给了$vars
AccessControl 软件安装完 要设置一下文件夹使用权限 这个是设置文件夹权限的
用法:
AccessControl::GrantOnFile "$INSTDIR" "everyone" “FullAccess”
GrantOnFile 是允许失败的意思 后面Everyone就不用我解释了吧 FullAccess是完全访问的意思
这里要介绍一个多功能字符串函数 ${WordFind} 这个是个查找内容的函数 有多种用法 一共4个参数
用法:
${WordFind} "[string]" "[delimiter]" "[E][options]" $var
第一个是关键字
第二个是所有的字符串
第三个是查找的目标字
第四个是一般填写 +-数字 {}}{ 找到第三个目标字的顺序 例如 +1 从这个词开始+1的词语序号
这个建议大家去看一下NSIS的官方定义讲的比较详细我这就不多做赘述了。
最后得出的值会赋值给$var 如果未找到分隔符则$var =1 如果没有该词语序号则$var =2 如果语法错误则$var=3
IfErrors 当然 如果找不到报错的话 可以用这个函数 这个是在错误和没错误时都会应用的标记跳转
先是没有找到的方法体 然后是找到的方法体
ClearErrors 记得在第二次使用IfErrors的时候要使用一下清除错误,不然会直接进入错误的选项里
用法:
IfErrors notfound found
notfound:
内容
found:
内容
五、卸载
也要包含在Section SectionEnd 中
WriteUninstaller 写入卸载程序
用法:
WriteUninstaller "$INSTDIR\uninst.exe"
很简单很好理解了
Delete 删除关键字 可以使用通配符*但是必须是完整的路径
用法:
Delete "$SMPROGRAMS\Dir\uninstall.lnk"
RMDir 删除制定目录
用法跟delete一样只是这个是目录
DeleteRegKey 删除注册表
用法:
DeleteRegKey HKLM “注册表路径”
SetAutoClose true
这个就是卸载完自动关闭窗口的意思 false 就是手动关闭
六、Function 函数
如果要写函数Function 那么按照NSIS的规则 所有的Function 必须要放在Section区域段后面 不然可能会出现你意想不到的坑切记
函数分3种
第一种是开始函数以.开头,例如.onInit
第二种是卸载函数以 un.开头 因为他们分别是出现在开始和卸载的 所以不能互相调用
第三种是常规函数 直接写函数名即可 调用函数用Call FunctionName
用法:
Function FunctionName
函数体
FunctionEnd
MessageBox 既然是开始和结束 那么免不了弹窗,里面有一些常用参数
MB_OKCANCEL:显示OK和取消按钮
/SD 是得到返回值 例如上面的MB_OKCANCEL 返回会得到一个值 获取到用户的选择 IDNO 是选择的否 IDOK选择的是 例如
Function .onInit
MB_OKCANCEL|MB_ICONQUESTION\
("是否要安装靓仔系统")\
/SD IDOK \
IDOK func\
IDNO done\
Abort
func:
CreateShortCut "$DESKTOP\Dir\project.lnk” "$INSTDIR\Dir\project.exe“
FunctionEnd
Abort 这个函数关键字会直接跳出安装直接在需要的地方添加即可 上面的函数就是点确认则安装 exe 点取消 就是直接退出了