.nsi安装脚本示例
; The Egret Video Converter setup script.
; 注意各种定义的顺序,
; 1. 全局配置
; 2. 然后是页配置
; 3. 插入各种语言 !insertmacro MUI_LANGUAGE
; 4. 定义各种LangString
; 5. 打包保留文件
!include "MUI2.nsh"
############################################################################
############################################################################
#################### 这里放置一些预定义常量 ################################
!define PACKET_PATH "client" ; 程序打包目录
!define PRODUCT_APP "VideoConverter.exe" ; 可执行文件体
!define PRODUCT_UNINST "UnInstall.exe" ; 卸载文件名
!define PRODUCT_VERSION "2.2" ; 软件的用户可见版本号
!define PRODUCT_WEB "http://www.egretsoft.com" ; 网址
!define PRODUCT_VENDOR "egret" ; OEM厂商
!define PRODUCT_FILEVERSION "2.2009.815.1" ; 软件的内部属性编号(4个的)
!define WRITE_REG_POS "HKEY_LOCAL_MACHINE" ; 写入注册表的跟(管理员权限)
!define PRODUCT_MAIN_MUTEX "EGRET_CONVERTER_2009" ; 主软件的锁
!define PRODUCT_SETUP_MUTEX "EGRET_SETUP_MUTEX" ; 安装程序的锁,同时只能运行一个安装程序
;-----------------------------------------------------------------------------
; 一些附加资源
!define RES_PATH "setupres" ; 资源目录
!define SPLASHBMP "splash.bmp" ; 闪屏文件
#################### 这里放置一些预定义常量 ################################
############################################################################
############################################################################
############################################################################
############################################################################
########################## 一些全局的配置项 ################################
;------------------------------------------------------
; 使用最大全局压缩
;------------------------------------------------------
SetCompressor /SOLID lzma
;------------------------------------------------------
; 软件名称
;------------------------------------------------------
!ifdef NAME
Name NAME
!else
Name "$(ProductName)-${PRODUCT_VERSION}"
!endif
;------------------------------------------------------
; 编译输出文件名称
;------------------------------------------------------
!ifdef OUTFILE
OutFile "${OUTFILE}"
!else
OutFile "EgretConverter-${PRODUCT_VERSION}-${PRODUCT_VENDOR}.exe"
!endif
;------------------------------------------------------
; 标题名称
;------------------------------------------------------
!ifdef CAPTION
Caption "${CAPTION}"
!else
Caption "$(ProductName) - ${PRODUCT_VERSION} $(StrSetupWizard)"
!endif
;------------------------------------------------------
; 横条文本
;------------------------------------------------------
!ifdef BRANDINGTEXT
BrandingText "${BRANDINGTEXT}";
!else
BrandingText " ";
!endif
;------------------------------------------------------
; 默认的安装目录 = program + 产品名
;------------------------------------------------------
InstallDir "$PROGRAMFILES\$(ProductName)"
;------------------------------------------------------
; 默认的注册表放置目标
;------------------------------------------------------
;!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\$(ProductName)"
!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\$(ProductName)"
InstallDirRegKey HKLM "${PRODUCT_UNINST_KEY}" "UninstallString"
;RequestExecutionLevel user
;--------------------------------
; 界面样式设置
!define MUI_HEADERIMAGE ; 定义为HEADER模式
!define MUI_ABORTWARNING ; 点击取消时显示对话框
!define MUI_FINISHPAGE_LINK "${PRODUCT_WEB}"
!define MUI_FINISHPAGE_LINK_LOCATION "${PRODUCT_WEB}"
!define MUI_FINISHPAGE_RUN "$INSTDIR\${PRODUCT_APP}"
!define MUI_ICON "${RES_PATH}\Install-Icon.ico" ; 安装的图标
!define MUI_UNICON "${RES_PATH}\UnInstall-Icon.ico" ; 卸载的图标
!define MUI_HEADERIMAGE_BITMAP "${RES_PATH}\Install-Header.bmp" ; 安装的HEADER图像
!define MUI_HEADERIMAGE_UNBITMAP "${RES_PATH}\Install-Header.bmp" ; 卸载的HEADER图像
########################## 一些全局的配置项 ################################
############################################################################
############################################################################
############################################################################
############################################################################
########################## 安装页 ################################
!insertmacro MUI_PAGE_LICENSE $(myLicenseData) ;"${MY_LICENCE_FILE}"
!insertmacro MUI_PAGE_DIRECTORY
!insertmacro MUI_PAGE_INSTFILES
!insertmacro MUI_UNPAGE_CONFIRM
!insertmacro MUI_UNPAGE_INSTFILES
!insertmacro MUI_PAGE_FINISH
########################## 安装页 ################################
############################################################################
############################################################################
############################################################################
############################################################################
########################## 语言处理项 ################################
; 加载语言文件
!insertmacro MUI_LANGUAGE "English"
!insertmacro MUI_LANGUAGE "French"
!insertmacro MUI_LANGUAGE "SimpChinese"
!insertmacro MUI_LANGUAGE "TradChinese"
!insertmacro MUI_LANGUAGE "Japanese"
#LoadLanguageFile "${NSISDIR}\Contrib\Language files\English.nlf"
#LoadLanguageFile "${NSISDIR}\Contrib\Language files\French.nlf"
#LoadLanguageFile "${NSISDIR}\Contrib\Language files\TradChinese.nlf"
#LoadLanguageFile "${NSISDIR}\Contrib\Language files\SimpChinese.nlf"
#LoadLanguageFile "${NSISDIR}\Contrib\Language files\Japanese.nlf"
; license 文件
LicenseLangString myLicenseData ${LANG_ENGLISH} "${RES_PATH}\license.txt"
LicenseLangString myLicenseData ${LANG_FRENCH} "${RES_PATH}\license.txt"
LicenseLangString myLicenseData ${LANG_TRADCHINESE} "${RES_PATH}\license-tc.txt"
LicenseLangString myLicenseData ${LANG_SIMPCHINESE} "${RES_PATH}\license-sc.txt"
LicenseLangString myLicenseData ${LANG_JAPANESE} "${RES_PATH}\license.txt"
LicenseData $(myLicenseData)
; 产品名称
LangString ProductName ${LANG_ENGLISH} "Egret Video Converter"
LangString ProductName ${LANG_FRENCH} "Egret Video Converter"
LangString ProductName ${LANG_TRADCHINESE} "白鷺視頻轉換器"
LangString ProductName ${LANG_SIMPCHINESE} "白鹭视频转换器"
LangString ProductName ${LANG_JAPANESE} "Egret Video Converter"
; 官方站点
LangString WebShortName ${LANG_ENGLISH} "Official Site"
LangString WebShortName ${LANG_FRENCH} "Site Officiel"
LangString WebShortName ${LANG_TRADCHINESE} "官方首頁"
LangString WebShortName ${LANG_SIMPCHINESE} "官方站点"
LangString WebShortName ${LANG_JAPANESE} "公式サイト"
; 卸载程序
LangString UninstallName ${LANG_ENGLISH} "Uninstall"
LangString UninstallName ${LANG_FRENCH} "Uninstall"
LangString UninstallName ${LANG_TRADCHINESE} "Uninstall"
LangString UninstallName ${LANG_SIMPCHINESE} "Uninstall"
LangString UninstallName ${LANG_JAPANESE} "Uninstall"
; 白鹭工作室
LangString StrCompanyName ${LANG_ENGLISH} "Bailu Studio"
LangString StrCompanyName ${LANG_FRENCH} "Bailu Studio"
LangString StrCompanyName ${LANG_TRADCHINESE} "白鷺工作室 - Bailu Studio"
LangString StrCompanyName ${LANG_SIMPCHINESE} "白鹭工作室 - Bailu Studio"
LangString StrCompanyName ${LANG_JAPANESE} "Bailu Studio"
; 安装向导
LangString StrSetupWizard ${LANG_ENGLISH} "Setup Wizard"
LangString StrSetupWizard ${LANG_FRENCH} "Assistant"
LangString StrSetupWizard ${LANG_TRADCHINESE} "安裝嚮導"
LangString StrSetupWizard ${LANG_SIMPCHINESE} "安装向导"
LangString StrSetupWizard ${LANG_JAPANESE} "セットアップウィザード"
; 安装程序正在运行中
LangString StrAlreadyHaveOne ${LANG_ENGLISH} "Already exist one instance."
LangString StrAlreadyHaveOne ${LANG_FRENCH} "Il existe déjà un exemple."
LangString StrAlreadyHaveOne ${LANG_TRADCHINESE} "已經有一個安裝程序正在運行中。"
LangString StrAlreadyHaveOne ${LANG_SIMPCHINESE} "已经有一个安装程序正在运行中。"
LangString StrAlreadyHaveOne ${LANG_JAPANESE} "すでに実行中のインストールプログラムです."
; 感谢您的使用
LangString StrUninstallThanks ${LANG_ENGLISH} "Thank you very much! $(ProductName) has been successfully removed."
LangString StrUninstallThanks ${LANG_FRENCH} "Merci pour votre utilisation! $(ProductName) a été supprié de votre ordinateur."
LangString StrUninstallThanks ${LANG_TRADCHINESE} "非常感謝您的使用! $(ProductName) 已成功從從您的計算機中移除。"
LangString StrUninstallThanks ${LANG_SIMPCHINESE} "非常感謝您的使用! $(ProductName) 已成功地从您的计算机中移除。"
LangString StrUninstallThanks ${LANG_JAPANESE} "本当にありがとうございます! $(ProductName) を正常に削除されています."
; 主程序在运行
LangString StrMainRunning ${LANG_ENGLISH} "System detected you are running $(ProductName). Setup will not be able to continue."
LangString StrMainRunning ${LANG_FRENCH} "Le système a détecté que vous utilisez $(ProductName). Le programme d'installation ne sera pas en mesure de continuer."
LangString StrMainRunning ${LANG_TRADCHINESE} "系統檢測到您正在運行$(ProductName)。安裝程序將無法繼續下去。"
LangString StrMainRunning ${LANG_SIMPCHINESE} "系统检测出您正在运行$(ProductName)。安装程序将不能继续。"
LangString StrMainRunning ${LANG_JAPANESE} "$(ProductName) を実行しているシステムで検出された。セットアップを続行することはできなくなります."
########################## 语言处理项 ################################
############################################################################
############################################################################
;--------------------------------
; 各种保打包保留文件
!insertmacro MUI_RESERVEFILE_LANGDLL
ReserveFile "${NSISDIR}\Plugins\advsplash.dll"
ReserveFile "${RES_PATH}\${SPLASHBMP}"
############################################################################
############################################################################
########################### 主安装函数 ####################################
Section "MainSection" SEC01
; 设置输出目录
SetOutPath "$INSTDIR"
; 解压缩所有文件
File /r "${PACKET_PATH}\*.*"
; 创建反安装程序及反安装注册表项
WriteUninstaller "$INSTDIR\${PRODUCT_UNINST}"
WriteRegStr ${WRITE_REG_POS} "${PRODUCT_UNINST_KEY}" "DisplayName" "$(ProductName)"
WriteRegStr ${WRITE_REG_POS} "${PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\${PRODUCT_UNINST}"
WriteRegStr ${WRITE_REG_POS} "${PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\${PRODUCT_APP}"
WriteRegStr ${WRITE_REG_POS} "${PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"
WriteRegStr ${WRITE_REG_POS} "${PRODUCT_UNINST_KEY}" "HelpLink" "${PRODUCT_WEB}"
WriteRegStr ${WRITE_REG_POS} "${PRODUCT_UNINST_KEY}" "Publisher" "$(StrCompanyName)"
WriteRegStr ${WRITE_REG_POS} "${PRODUCT_UNINST_KEY}" "URLUpdateInfo" "${PRODUCT_WEB}"
WriteRegStr ${WRITE_REG_POS} "${PRODUCT_UNINST_KEY}" "INSTDIR" "$INSTDIR"
; 创建开始菜单(由于隐藏,所以程序组名称定死了)
CreateDirectory "$SMPROGRAMS\$(ProductName)"
CreateShortCut "$SMPROGRAMS\$(ProductName)\$(UninstallName).lnk" "$INSTDIR\${PRODUCT_UNINST}"
CreateShortCut "$SMPROGRAMS\$(ProductName)\$(ProductName).lnk" "$INSTDIR\${PRODUCT_APP}"
CreateShortCut "$SMPROGRAMS\$(ProductName)\$(WebShortName).lnk" "${PRODUCT_WEB}"
; 创建桌面图标
CreateShortCut "$DESKTOP\$(ProductName).lnk" "$INSTDIR\${PRODUCT_APP}"
; 创建快捷图标
CreateShortCut "$QUICKLAUNCH\$(ProductName).lnk" "$INSTDIR\${PRODUCT_APP}"
SectionEnd
########################### 主安装函数 ####################################
############################################################################
############################################################################
############################################################################
############################################################################
########################### 入口函数 ####################################
Function .onInit
; 检测多实例
System::Call 'kernel32::CreateMutexA(i 0, i 0, t "${PRODUCT_SETUP_MUTEX}" ) i .r1 ?e'
Pop $R0
StrCmp $R0 0 +3
MessageBox MB_OK|MB_ICONEXCLAMATION "$(StrAlreadyHaveOne)"
Abort
; 闪屏
InitPluginsDir
File "/oname=$PLUGINSDIR\Splash_splash.bmp" "${RES_PATH}\${SPLASHBMP}"
advsplash::show 1000 600 400 0xFF00FF "$PLUGINSDIR\Splash_splash" ; 使用闪屏插件显示闪屏
Pop $0 ; $0 返回 '1' 表示用户提前关闭闪屏, 返回 '0' 表示闪屏正常结束, 返回 '-1' 表示闪屏显示出错
!insertmacro MUI_LANGDLL_DISPLAY ; 首先显示语言页,因为里面有跳转,所以必须放到函数中
FunctionEnd
########################### 入口函数 ####################################
############################################################################
############################################################################
############################################################################
############################################################################
########################### 卸载函数 ####################################
Section "Uninstall"
# 删除安装目录
RMDir /r "$INSTDIR"
# 删除开始/程序项
RMDir /r "$SMPROGRAMS\$(ProductName)"
# 删除添加/删除列表选项
DeleteRegKey ${WRITE_REG_POS} "${PRODUCT_UNINST_KEY}"
;DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"
; 删除桌面图标(要删除所有语言的名称,以防有问题。尽量不要让用户手动去删除)
Delete "$DESKTOP\$(ProductName).lnk"
Delete "$DESKTOP\Egret Video Converter.lnk"
; 删除快捷图标
Delete "$QUICKLAUNCH\$(ProductName).lnk"
Delete "$QUICKLAUNCH\Egret Video Converter.lnk"
; 界面自动关闭
SetAutoClose true
SectionEnd
Function un.onInit
; 检测主程序是否在运行中,在运行中不能继续
System::Call 'kernel32::CreateMutexA(i 0, i 0, t "${PRODUCT_MAIN_MUTEX}" ) i .r1 ?e'
Pop $R0
StrCmp $R0 0 +3
MessageBox MB_OK|MB_ICONEXCLAMATION "$(StrMainRunning)"
Abort
; 似乎有一个BUG,那就是必须要关闭这个mutex。否则没有办法卸载,真正的HANDLE存储在$1中
; 这个BUG不仅仅影响卸载不能继续,另一个问题就是在完成的时候打开程序运行,也会出现错误的!
System::Call 'kernel32::CloseHandle(i "$1" )'
; 提示用户一下,万一点错了等情况
; MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "$(STR_UNINSTALL_CONFIRM)" IDYES +2
; Abort
; 语言切换
;!insertmacro MUI_UNGETLANGUAGE
FunctionEnd
Function un.onUninstSuccess
; 提示
MessageBox MB_ICONINFORMATION|MB_OK "$(StrUninstallThanks)"
FunctionEnd
########################### 卸载函数 ####################################
############################################################################
############################################################################