• .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

    ###########################  卸载函数   ####################################
    ############################################################################
    ############################################################################

  • 相关阅读:
    睡眠错误
    Linux中安装Mysql授权远程访问
    lamp安装
    MySQL 数据类型(Day41)
    MySQL 表操作 (Day40)
    MySQL之存储引擎(Day39)
    MySQL下载安装
    python并发编程之IO模型(Day38)
    同步锁,死锁现象与递归锁,信息量Semaphore.....(Day36)
    多线程并发练习(Day35)
  • 原文地址:https://www.cnblogs.com/daxingxing/p/2178605.html
Copyright © 2020-2023  润新知