NSIS简介
NSIS是"Nullsoft 脚本安装系统"(Nullsoft scriptable Installation System)的缩写,它是是一个免费的win32安装、卸载系统,可以很方便的打包windows应用程序。它的特点:脚本简洁高效;系统开销少;支持安装、卸载、系统设置、解压文件等功能。
打包步骤
1.下载NSIS脚本安装系统,启动NSIS Edit,点击“文件"菜单中"新建脚本:向导",脚本向导可根据具体要求生成一个脚本模板。
2.应用程序信息,设置要打包的应用程序的名称、版本号、出版人等,可以预留一个网站,在后面设置生成一个对应网址的“Internet 快捷方式”,下一步。
3.安装程序选项,设置生成安装程序的图标、名字、语言(SimpChinese为中文)、用户图形界面的样式、压缩算法等。可选择默认,也可根据要求进行修改,下一步。
4.快闪屏幕和背景窗口,设置安装程序在安装时的一些样式,这里选择默认,下一步。
5.应用程序的目录与授权信息,设置安装程序进行安装时默认的安装路径,授权文件可以不选,下一步。
6.应用程序文件,设置我们需要打包的文件,例如exe文件、dll文件、配置文件等,可以选择目录,也可以选择文件,下一步。
7.应用程序图标,设置安装程序安装完成后开始菜单中应用程序文件夹名字以及文件夹中的内容,选择生成快捷方式的位置,下一步。
8.安装程序之后运行,设置安装程序安装完成后运行应用程序的路径,下一步。
9.解除安装程序,设置卸载程序的图标以及一些提示信息,下一步,完成。
注:这里有一些信息使用了变量来表示,因为脚本中可能多个地方使用该值,使用变量可以方便修改,统一管理。这些变量在下面的脚本中会设置相应的值。
NSIS脚本
; 该脚本使用 HM VNISEdit 脚本编辑器向导产生
; 安装程序初始定义常量
!define PRODUCT_NAME "急支糖浆" ;应用程序的名称
!define PRODUCT_VERSION "6.6.6" ;应用程序的版本号
!define PRODUCT_OUTPUT "急支糖浆${PRODUCT_VERSION}.exe" ;生成安装程序的名字
!define PRODUCT_SETUP "E:\急支糖浆" ;安装时默认的安装路径
!define PRODUCT_EXE "jizhitangjiang.exe" ;安装路径下的应用程序exe
!define PRODUCT_PUBLISHER "急支糖浆" ;发布者
!define PRODUCT_WEB_SITE "http://www.baidu.com" ;预留网站
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
!define PRODUCT_UNINST_ROOT_KEY "HKLM"
SetCompressor lzma ;压缩算法
; ------ MUI 现代界面定义 (1.67 版本以上兼容) ------
!include "MUI.nsh"
; MUI 预定义常量
!define MUI_ABORTWARNING
!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\nsis1-install.ico"
!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\llama-blue.ico"
!define MUI_HEADERIMAGE
!define MUI_HEADERIMAGE_BITMAP "${NSISDIR}\Contrib\Graphics\Wizard\orange.bmp" ;安装时的背景图
!define MUI_HEADERIMAGE_UNBITMAP "${NSISDIR}\Contrib\Graphics\Wizard\orange-uninstall-nsis.bmp" ;卸载时的背景图
!define MUI_WELCOMEPAGE_TEXT " \r\n\r\nHELLO WORD。\r\n\r\n人生自是有情痴,此恨不关风与月\r\n\r\n $_CLICK" ;安装时的欢迎语
!define MUI_FINISHPAGE_TITLE "\r\n 曾经沧海难为水,除却巫山不是云" ;安装完成时的结束语……
; 欢迎页面
!insertmacro MUI_PAGE_WELCOME
; 许可协议页面
;!insertmacro MUI_PAGE_LICENSE "c:\path\to\licence\YourSoftwareLicence.txt"
; 安装过程页面
!insertmacro MUI_PAGE_INSTFILES
; 安装完成页面
!define MUI_FINISHPAGE_RUN "${INSTDIR}\${PRODUCT_EXE}"
!insertmacro MUI_PAGE_FINISH
; 安装卸载过程页面
!insertmacro MUI_UNPAGE_INSTFILES
; 安装界面包含的语言设置
!insertmacro MUI_LANGUAGE "SimpChinese"
;VIProductVersion "${PRODUCT_VERSION}" ;设置安装程序属性中详细信息中的字段
;VIAddVersionKey /LANG=${LANG_SimpChinese} "ProductName" "急支糖浆1"
;VIAddVersionKey /LANG=${LANG_SimpChinese} "Comments" "急支糖浆2"
;VIAddVersionKey /LANG=${LANG_SimpChinese} "CompanyName" "急支糖浆3"
;VIAddVersionKey /LANG=${LANG_SimpChinese} "LegalTrademarks" ""
;VIAddVersionKey /LANG=${LANG_SimpChinese} "LegalCopyright" "急支糖浆4"
;VIAddVersionKey /LANG=${LANG_SimpChinese} "FileDescription" "急支糖浆5"
;VIAddVersionKey /LANG=${LANG_SimpChinese} "FileVersion" "${PRODUCT_VERSION}"
;VIAddVersionKey /LANG=${LANG_SimpChinese} "ProductVersion" "${PRODUCT_VERSION}"
; 安装预释放文件
!insertmacro MUI_RESERVEFILE_INSTALLOPTIONS
; ------ MUI 现代界面定义结束 ------
Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"
OutFile "${PRODUCT_OUTPUT}"
InstallDir "${PRODUCT_SETUP}"
ShowInstDetails show
ShowUnInstDetails show
Section "MainSection" SEC01
SetOutPath "$INSTDIR"
SetOverwrite on ;安装时是否覆盖
File /r "jizhitangjiang\*.*" ;可以设置相对路径
CreateShortCut "$DESKTOP\${PRODUCT_NAME}.lnk" "$INSTDIR\${PRODUCT_EXE}" ;生成桌面快捷方式
SectionEnd
Section -AdditionalIcons
WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}"
CreateDirectory "$SMPROGRAMS\${PRODUCT_NAME}"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url"
CreateShortCut "$SMPROGRAMS\${PRODUCT_NAME}\Uninstall.lnk" "$INSTDIR\uninst.exe"
SectionEnd
Section -Post
WriteUninstaller "$INSTDIR\uninst.exe"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"
WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"
SectionEnd
;onInit该回调将会在当安装程序接近完成初始化时调用,若函数调用了 Abort,则安装程序立即退出。检查程序是否正在运行
Function .onInit
;关闭进程
Push $R0
CheckProc:
Push ${PRODUCT_EXE}
ProcessWork::existsprocess
Pop $R0
IntCmp $R0 0 Done
MessageBox MB_OKCANCEL|MB_ICONSTOP "安装程序检测到 ${PRODUCT_NAME} 正在运行。$\r$\n$\r$\n点击 “确定” 强制关闭${PRODUCT_NAME},继续安装。$\r$\n点击 “取消” 退出安装程序。" IDCANCEL Exit
Push "flighty.exe"
Processwork::KillProcess
Sleep 1000
Goto CheckProc
Exit:
Abort
Done:
Pop $R0
FunctionEnd
/******************************
* 以下是安装程序的卸载部分 *
******************************/
Section Uninstall
Delete "$INSTDIR\${PRODUCT_NAME}.url"
Delete "$INSTDIR\uninst.exe"
Delete "$SMPROGRAMS\${PRODUCT_NAME}\Uninstall.lnk"
Delete "$SMPROGRAMS\${PRODUCT_NAME}\Website.lnk"
Delete "$DESKTOP\${PRODUCT_NAME}.lnk"
RMDir "$SMPROGRAMS\${PRODUCT_NAME}"
RMDir /r "$INSTDIR\web_content"
RMDir /r "$INSTDIR\translations"
RMDir /r "$INSTDIR\swiftshader"
RMDir /r "$INSTDIR\sqldrivers"
RMDir /r "$INSTDIR\playlistformats"
RMDir /r "$INSTDIR\platforms"
RMDir /r "$INSTDIR\mediaservice"
RMDir /r "$INSTDIR\locales"
RMDir /r "$INSTDIR\imageformats"
RMDir /r "$INSTDIR\iconengines"
RMDir /r "$INSTDIR\bearer"
RMDir /r "$INSTDIR\audio"
RMDir /r "$INSTDIR" ;删除所有
RMDir /r "$INSTDIR/*.*"
DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
SetAutoClose true
SectionEnd
#-- 根据 NSIS 脚本编辑规则,所有 Function 区段必须放置在 Section 区段之后编写,以避免安装程序出现未可预知的问题。--#
;该回调将会在当卸载程序接近完成初始化时调用,若函数使用了 Abort ,则卸载程序立即退出。检查程序是否正在运行
Function un.onInit
MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "您确实要完全移除 $(^Name) ,及其所有的组件?" IDYES +2
Abort
;检测程序是否运行
FindProcDLL::FindProc "flighty.exe"
Pop $R0
IntCmp $R0 1 0 no_run
MessageBox MB_ICONSTOP "卸载程序检测到 ${PRODUCT_NAME} 正在运行,请关闭之后再卸载!"
Quit
no_run:
FunctionEnd
Function un.onUninstSuccess
HideWindow
MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) 已成功地从您的计算机移除。"
FunctionEnd