今天学习一下一个打包工具,以前只知道用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  点取消 就是直接退出了