引言
在教程的第一部分中创建第一个安装程序后,我们还将需要删除其安装区段中已安装的文件。我们还将展示更多安装引导页面,让用户有机会选择安装的某些部分。
卸载
创建一个安装程序.可以干净的卸载,不仅是一种礼貌,对于程序的开发与发行方也有很多好处:
• 对于更新,首先可以干净地删除旧版本文件。这意味着新版本不再需要的旧文件不会产生任何副作用。
• 如果用户很难卸载一个他不喜欢的程序,他以后就不太可能尝试我们的其他产品。
为了将卸载程序添加到教程第一部分的安装程序中,我们复制“第一个安装程序”的脚本并更改/扩展它,使其如下所示:
Name "Second Installer"
OutFile "secondinstaller.exe"
InstallDir $PROGRAMFILES\MySecondInstaller
Page directory
Page instfiles
UninstPage uninstConfirm
UninstPage instfiles
Section ""
SetOutPath $INSTDIR
File C:\Windows\system32\notepad.exe
WriteUninstaller $INSTDIR\uninstall.exe
SectionEnd
Section "Uninstall"
Delete $INSTDIR\uninstall.exe
Delete $INSTDIR\notepad.exe
RMDir $INSTDIR
SectionEnd
除了将名称更改为“"Second Installer(第二个安装程序)”之外,我们还添加了三条指令:
UninstPage
UninstPage 后面两个条目表示应显示两个对话框页面以删除已安装的文件。第一个是卸载确认页面,确认您是否确实要删除已安装的文件,第二个页面显示卸载进度。
WriteUninstaller
WriteUninstaller 命令将具有指定名称的卸载程序写入指定文件夹。
Section "Uninstall"
此区段用于删除安装。首先,删除使用的是 WriteUninstaller 创建的卸载程序。然后删除安装的文件 (notepad.exe) 和安装目录。
要显示安装许可证,有专用命令。该命令属性指定包含许可条件的文件(.txt 或.rtf 格式)。该属性允许您自定义显示在安装许可证页面上方的文本。
Page licenseLicense DataLicenseText
在很多时候,安装程序正式复制安装文件之前,可能需要查询与核对用户名和密码,这就涉及到自定义验证界面,创建 NSIS 自定义界面,我们有两个插件使用,最早是 InstallOptions + ini 文件,当前已经全部被 nsDialogs 插件替代!此处敲黑板!!但由于篇幅受限,并且作为入门级别的教程,不宜展开讨论自定义页面的制作,此处提及仅仅是为了表述几个常用的函数或者命令,如果想深入了解自定义界面,建议掌握基本入门技巧后,仔细阅读 nsDialogs 帮助文档.
安装程序脚本中需要调整一些内容,看起来像这样:
!include nsdialogs.nsh
Name "Third Installer"
OutFile "thirdinstaller.exe"
InstallDir $PROGRAMFILES\MyThirdInstaller
Page license
Page custom getUsername nsDialogsPageLeave
Page directory
Page instfiles
UninstPage uninstConfirm
UninstPage instfiles
LicenseData "NSIS脚本文件.nsi"
Var Text
Var Dialog
Function ".onInit"
InitPluginsDir
#此处预释放某些安装必需的资源或者文件....
#File /oname=$PLUGINSDIR\name.ini "name.ini"
FunctionEnd
Function getUsername
nsDialogs::Create 1018
Pop $Dialog
${If} $Dialog == error
Abort
${EndIf}
${NSD_CreateLabel} 0 14u 19% 12u "用户名或密码"
${NSD_CreateText} 20% 13u 100% 15u ""
Pop $Text
nsDialogs::Show
FunctionEnd
Function nsDialogsPageLeave
${NSD_GetText} $Text $0
MessageBox MB_OK " 用户名或密码是: $0 "
FunctionEnd
Section ""
SetOutPath $INSTDIR
File C:\Windows\system32\notepad.exe
WriteUninstaller $INSTDIR\uninstall.exe
SectionEnd
Section "Uninstall"
Delete $INSTDIR\uninstall.exe
Delete $INSTDIR\notepad.exe
RMDir $INSTDIR
SectionEnd
新知识点的解释:
Page custom
使用此命令可以添加自定义页面。参数 getUsername 指定了用于显示该页面的函数名称。该函数将在下文中进行解释。
Var
为了能够使用全局变量,必须首先声明它们。这里我们提供了两个变量来存储输入的值和自定义页面句柄。
Function ".onInit"
这是一个所谓的回调函数。回调函数会在安装程序执行到特定点时被调用。.onInit 会在安装程序几乎完成初始化时调用。
我们使用这个回调函数将某些安装需要的资源或者文件解压到临时文件夹中。首先使用 InitPluginsDir 命令初始化目录 $PLUGINSDIR。$PLUGINSDIR 是一个临时目录,在安装程序结束时会被删除。接下来,我们将文件复制到这个文件夹中,使其在安装过程中可用。
Function getUsername
这是已经提到的功能。核心元素是 nsDialogs 插件调用“Create”函数,创建出一个自定义的用于验证用户名或者密码的自定义界面.此处不再展开讲述!
在我们的示例中,我们只是使用 MessageBox 显示了这些内容,但您也可以在安装期间将它们写入注册表(使用WriteRegStr命令)。然后应在卸载期间删除写入注册表的值(使用DeleteRegKey或DeleteRegValue)。
Function nsDialogsPageLeave
页面离开函数,当该函数被定义,并且用户在本自定义界面点击"下一步"时将会被立即调用,用以处理和验证本自定义界面中用户的输入!
组件安装与选择,快捷方式和注册表条目与开始菜单创建...
我们的安装程序仍然缺少三件事:
• 选择要安装的组件
• 创建开始菜单条目
• 在控制面板中添加删除软件的条目
在我们的第四个安装程序中,我们将满足这些需求。像往常一样,脚本之后会有对代码更改的解释。
!include nsdialogs.nsh
Name " fourth Installer"
OutFile "fourthinstaller.exe"
InstallDir $PROGRAMFILES\MyFourthInstaller
!define INSTALLATIONNAME "MyForthInstaller"
Page license
Page custom getUsername nsDialogsPageLeave
Page components
Page directory
Page instfiles
UninstPage uninstConfirm
UninstPage instfiles
LicenseData "license.txt"
Var Text
Var Dialog
Function ".onInit"
InitPluginsDir
#此处预释放某些安装必须的资源或者文件....
#File /oname=$PLUGINSDIR\name.ini "name.ini"
FunctionEnd
Function getUsername
nsDialogs::Create 1018
Pop $Dialog
${If} $Dialog == error
Abort
${EndIf}
${NSD_CreateLabel} 0 14u 19% 12u "用户名或密码"
${NSD_CreateText} 20% 13u 100% 15u ""
Pop $Text
nsDialogs::Show
FunctionEnd
Function nsDialogsPageLeave
${NSD_GetText} $Text $0
MessageBox MB_OK " 用户名或密码是: $0 "
FunctionEnd
Section ""
SetOutPath $INSTDIR
File C:\Windows\system32\notepad.exe
WriteUninstaller $INSTDIR\uninstall.exe
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${INSTALLATIONNAME}" "DisplayName" "Forth Installer"
WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${INSTALLATIONNAME}" "UninstallString" '"$INSTDIR\uninstall.exe"'
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${INSTALLATIONNAME}" "NoModify" 1
WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${INSTALLATIONNAME}" "NoRepair" 1
SectionEnd
Section "Sample Text File"
File "license.txt"
SectionEnd
Section /o "Another Sample Text File"
File "license2.txt"
SectionEnd
Section "Start Menu Shortcuts"
CreateDirectory "$SMPROGRAMS\${INSTALLATIONNAME}"
CreateShortCut "$SMPROGRAMS\${INSTALLATIONNAME}\Uninstall.lnk" "$INSTDIR\uninstall.exe" "" "$INSTDIR\uninstall.exe" 0
CreateShortCut "$SMPROGRAMS\${INSTALLATIONNAME}\notepad.lnk" "$INSTDIR\notepad.exe" "" "$INSTDIR\notepad.exe" 0
SectionEnd
Section "Uninstall"
DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${INSTALLATIONNAME}"
Delete $INSTDIR\uninstall.exe
Delete $INSTDIR\notepad.exe
Delete $INSTDIR\license.txt
Delete $INSTDIR\license2.txt
RMDir $INSTDIR
Delete "$SMPROGRAMS\${INSTALLATIONNAME}\*.*"
RMDir "$SMPROGRAMS\${INSTALLATIONNAME}"
SectionEnd
!define
使用 !define 我们定义一个包含安装名称的常量。然后我们每次都使用这个常量来代替名称。这意味着我们可以轻松地在一处更改安装名称,并且不会忘记路径等。
Page component
此页面命令将显示组件的选择。脚本中的每个区段都是一个组件,可以单独选择和取消选择。名称为空的区段为隐藏区段,隐藏区段始终会被安装.
Section "Sample Text File"
一个与可选组件对应的区段,用户可以选择安装或不安装。通常,一个组件默认是选中的,并会相应地进行安装。如果有在正常情况下不需要安装的可选组件,可以使用 /o(表示可选)开关来指定这些组件。
CreateDirectory
CreateDirectory 创建指定的目录。如果层次结构中较高的目录尚不存在,本命令会创建它们。
CreateShortCut
CreateShortcut 创建具有指定路径和文件名的快捷方式。
WriteRegStr, WriteRegDWORD
要将值写入注册表,请使用命令 WriteRegStr、WriteRegDWORD 及其相关命令。如果该密钥尚不存在,则会自动创建。
DeleteRegKey
相应地,DeleteRegKey 从注册表中删除一个键。
本章小结:
在我们已经介绍了安装程序的主要元素之后,在本教程的第三部分中,我们将研究现代用户界面,以便为安装程序提供更现代的外观。