精华内容
下载资源
问答
  • nsis打包脚本

    2012-06-08 17:45:39
    可以在windows 32平台将自己的项目打包成exe,方便用户下一步安装
  • NSIS 打包脚本基础

    2017-10-18 09:00:00
    NSIS 打包脚本基础 目录 简介   工具: 脚本结构   属性   页面   区段   函数     用户自定义函数     回调函数       安装逻辑回调函数       卸载逻辑回调...

    原文地址:http://www.cnblogs.com/jingmoxukong/p/5033622.html

     

    NSIS 打包脚本基础

     

    简介

    NSIS(Nullsoft Scriptable Install System)是一个开源的 Windows 系统下安装程序制作程序。它提供了安装、卸载、系统设置、文件解压缩等功能。这如其名字所指出的那样,NSIS 是通过它的脚本语言来描述安装程序的行为和逻辑的。NSIS 的脚本语言和通常的编程语言有类似的结构和语法,但它是为安装程序这类应用所设计的。

    工具:

    HW VNISEdit(NSIS脚本编辑器)

    1、 使用编辑器中NSIS脚本向导功能,自动生成对应的nsi脚本。

    点击文件->新建脚本:向导,接下来根据向导页面的设置选项一步步设置你需要的安装条件。

     

    2、也可以在编辑器中编写nsi脚本,然后再编译生成exe安装包文件。

     

    脚本结构

    NSIS脚本(下称nsi脚本)主要包含安装程序属性、页面、区段、函数。

     

    属性

    用来定义安装程序的行为和界面风格,这些属性大部分是编译时刻属性,即不能在运行时刻改变。

     

    页面

    安装程序的向导页面

    例:

    Page license

    Page components

    Page directory

    Page instfiles

    UninstPage uninstConfirm

    UninstPage instfiles

     

    区段

    是对应某种安装/卸载选项的处理逻辑,该段代码仅当用户选择相应的选项才被执行。卸载程序的区段名用"un."作为前缀。

    例:

    Section "Installer Section"

    SectionEnd

     

    Section "un.Uninstaller Section"

    SectionEnd

     

    区段名的修饰符/o表示该区段默认不选上,-表示隐藏区段(匿名区段也是隐藏区段),!表示需要粗体显示的区段。

    SectionIn表示该区段和安装类型之间的关系

    SubSection表示子区段

    SectionIn insttype_index [insttype_index] ... [RO]

    ;RO修饰符表示不可修改。

    SubSection [/e] Caption [subsection_name index output]

    ;修饰符/e用于该子区段的所有区段是否默认展开。

     

    函数

    包含了模块化的安装逻辑。

    在nsi脚本中函数分为两种:用户自定义函数和回调函数。

    用户自定义函数

    用户自定义函数仅当是Call指令调用时才被执行,如果函数体中没有abort语句,则安装程序执行完了用户自定义函数,继续运行Call语句和指令。

    用户自定义函数的语法:

    Function <函数名>

    # some commands

    FunctionEn

     

    回调函数

    回调函数则是由在特定的时间点触发的程序段。

    例:

    Function .onInit

    MessageBox MB_YESNO "This will install My Program. Do you wish to continue?" IDYES gogogo

    Abort

    gogogo:

    FunctionEnd

     

    安装逻辑回调函数

    NSIS对于安装逻辑定义以下回调函数:

    .onGUIInit、.onInit、.onInstFailed、.onInstSuccess、.onGUIEnd、.onMouseOverSection、.onRebootFailed、.onSelChange、.onUserAbort、.onVerifyInstDir

    卸载逻辑回调函数

    NSIS对于卸载逻辑定义以下回调函数:
    un.onGUIInit、un.onInit、un.onUninstFailed、un.onUninstSuccess、un.onGUIEnd、un.onRebootFailed、un.onUserAbort

    基本语法

    变量

    nsi脚本用var关键字来定义变量,使用$来引用变量。

    注意:变量是全局的并且是大小写敏感的。

    除了用户自定义的变量外,nsi脚本中定义了寄存器变量0 9,R0 R9用于参数传递,以及系统变量用于特定用途,这些变量主要有:

    $INSTDIR
    用户定义的解压路径。
    $PROGRAMFILES
    程序文件目录(通常为 C:\Program Files 但是运行时会检测)。
    $COMMONFILES
    公用文件目录。这是应用程序共享组件的目录(通常为 C:\Program Files\Common Files 但是运行时会检测)。
    $DESKTOP
    Windows 桌面目录(通常为 C:\windows\desktop 但是运行时会检测)。该常量的内容(所有用户或当前用户)取决于SetShellVarContext 设置。默认为当前用户。
    $EXEDIR
    安装程序运行时的位置。(从技术上来说你可以修改改变量,但并不是一个好方法)。
    ${NSISDIR}
    包含 NSIS 安装目录的一个标记。在编译时会检测到。常用于在你想调用一个在 NSIS 目录下的资源时,例如:图标、界面……
    $WINDIR
    Windows 目录(通常为 C:\windows 或 C:\winnt 但在运行时会检测)
    $SYSDIR
    Windows 系统目录(通常为 C:\windows\system 或 C:\winnt\system32 但在运行时会检测)
    $TEMP
    系统临时目录(通常为 C:\windows\temp 但在运行时会检测)
    $STARTMENU
    开始菜单目录(常用于添加一个开始菜单项,使用 CreateShortCut)。该常量的内容(所有用户或当前用户)取决于SetShellVarContext 设置。默认为当前用户。
    $SMPROGRAMS
    开始菜单程序目录(当你想定位 $STARTMENU\程序 时可以使用它)。该常量的内容(所有用户或当前用户)取决于SetShellVarContext 设置。默认为当前用户。
    $SMSTARTUP
    开始菜单程序/启动 目录。该常量的内容(所有用户或当前用户)取决于 SetShellVarContext 设置。默认为当前用户。
    $QUICKLAUNCH
    在 IE4 活动桌面及以上的快速启动目录。如果快速启动不可用,仅仅返回和 $TEMP 一样。
    $DOCUMENTS
    文档目录。一个当前用户典型的路径形如 C:\Documents and Settings\Foo\My Documents。这个常量的内容(所有用户或当前用户)取决于 SetShellVarContext 设置。默认为当前用户。
    该常量在 Windows 95 且 Internet Explorer 4 没有安装时无效。
    $SENDTO
    该目录包含了“发送到”菜单快捷项。
    $RECENT
    该目录包含了指向用户最近文档的快捷方式。
    $FAVORITES
    该目录包含了指向用户网络收藏夹、文档等的快捷方式。这个常量的内容(所有用户或当前用户)取决于SetShellVarContext 设置。默认为当前用户。
    该常量在 Windows 95 且 Internet Explorer 4 没有安装时无效。
    $MUSIC
    用户的音乐文件目录。这个常量的内容(所有用户或当前用户)取决于 SetShellVarContext 设置。默认为当前用户。
    该常量仅在 Windows XP、ME 及以上才有效。
    $PICTURES
    用户的图片目录。这个常量的内容(所有用户或当前用户)取决于 SetShellVarContext 设置。默认为当前用户。
    该常量仅在 Windows 2000、XP、ME 及以上才有效。
    $VIDEOS
    用户的视频文件目录。这个常量的内容(所有用户或当前用户)取决于 SetShellVarContext 设置。默认为当前用户。
    该常量仅在 Windows XP、ME 及以上才有效。
    $NETHOOD
    该目录包含了可能存在于我的网络位置、网上邻居文件夹的链接对象。
    该常量在 Windows 95 且 Internet Explorer 4 和活动桌面没有安装时无效。
    $FONTS
    系统字体目录。
    $TEMPLATES
    文档模板目录。这个常量的内容(所有用户或当前用户)取决于 SetShellVarContext 设置。默认为当前用户。
    $APPDATA
    应用程序数据目录。当前用户路径的检测需要 Internet Explorer 4 及以上。所有用户路径的检测需要 Internet Explorer 5 及以上。这个常量的内容(所有用户或当前用户)取决于 SetShellVarContext 设置。默认为当前用户。
    该常量在 Windows 95 且 Internet Explorer 4 和活动桌面没有安装时无效。
    $PRINTHOOD
    该目录包含了可能存在于打印机文件夹的链接对象。
    该常量在 Windows 95 和 Windows 98 上无效。
    $INTERNET_CACHE
    Internet Explorer 的临时文件目录。
    该常量在 Windows 95 和 Windows NT 且 Internet Explorer 4 和活动桌面没有安装时无效。
    $COOKIES
    Internet Explorer 的 Cookies 目录。
    该常量在 Windows 95 和 Windows NT 且 Internet Explorer 4 和活动桌面没有安装时无效。
    $HISTORY
    Internet Explorer 的历史记录目录。
    该常量在 Windows 95 和 Windows NT 且 Internet Explorer 4 和活动桌面没有安装时无效。
    $PROFILE
    用户的个人配置目录。一个典型的路径如 C:\Documents and Settings\Foo。
    该常量在 Windows 2000 及以上有效。
    $ADMINTOOLS
    一个保存管理工具的目录。这个常量的内容(所有用户或当前用户)取决于 SetShellVarContext 设置。默认为当前用户。
    该常量在 Windows 2000、ME 及以上有效。 
    $RESOURCES
    该资源目录保存了主题和其他 Windows 资源(通常为 C:\Windows\Resources 但在运行时会检测)。
    该常量在 Windows XP 及以上有效。 
    $RESOURCES_LOCALIZED
    该本地的资源目录保存了主题和其他 Windows 资源(通常为 C:\Windows\Resources\1033 但在运行时会检测)。
    该常量在 Windows XP 及以上有效。
    $CDBURN_AREA
    一个在烧录 CD 时储存文件的目录。.
    该常量在 Windows XP 及以上有效。
    $HWNDPARENT
    父窗口的十进制 HWND。
    $PLUGINSDIR
    该路径是一个临时目录,当第一次使用一个插件或一个调用 InitPluginsDir 时被创建。该文件夹当解压包退出时会被自动删除。这个文件夹的用意是用来保存给 InstallOptions 使用的 INI 文件、启动画面位图或其他插件运行需要的文件。

    编译器指令

    nsi脚本的编译器指令主要指仅在编译时刻执行的命令。这些命令主要用来包含文件、条件化编译、定义常量、定义宏等。定义常量和宏是编译器指令的最主要应用。

     

    常用指令

    文件、目录操作

    File

    作用:释放文件到当前输出路径。

    如果使用了 /nonfatal 开关且当文件未找到时使用警告来代替错误

    如果使用了 /a 开关,则被添加的文件的属性将会保持

    如果使用了 /r 开关,匹配的文件将会在子目录里被递归的搜索。如果目录名匹配则所有包含的内容都会被递归添加,目录结构也会被保持

    使用 /x 开关可以用来来排除文件或目录

    例:

    将ProjectFiles目录下的所有文件释放到输出目录

    SetOutPath "$INSTDIR"

    SetOverwrite ifnewer

    File /r "ProjectFiles\*.*"

     

    Delete

    作用:从目标系统删除文件

    例:删除文件

    Delete "$SMPROGRAMS\Test.exe"

     

    Rename

    作用:把源文件重命名为目标文件

    例:

    重命名文件

    Rename INSTDIR\file.extINSTDIR\file.dat

     

    CreateDirectory

    作用:创建 (递归创建) 指定的目录。当目录不能创建时会放置一个错误标记。你也可以指定一个绝对路径。

    例:在默认Program Files目录下创建一个Temp目录

    CreateDirectory "$SMPROGRAMS\Temp"

     

    RMDir

    作用:删除目录

    例:

    删除Resources及其子目录

    RMDir /r $INSTDIR\Resources

     

    SetOutPath

    作用:设置输出路径($OUTDIR)且当路径不存在时创建(需要时会递归创建)。必须为绝对路径名,通常都使用 $INSTDIR。

    例:

    将用户定义的解压路径作为输出目录

    SetOutPath $INSTDIR

     

    CreateShortCut

    作用:创建快捷文件.lnk 目标文件

    例:

    设置Test.exe的快捷方式Test.lnk,图标为Test.ico。

    CreateShortCut "DESKTOP\Test.lnk""INSTDIR\Test.exe" "" "$INSTDIR\Resources\Picture\Icon\ Test.ico"

     

    注册表操作

    WriteRegStr、WriteRegExpandStr

    作用:把字符串写入注册表。根键必须为下面列表之一:

    HKCR 或 HKEY_CLASSES_ROOT

    HKLM 或HKEY_LOCAL_MACHINE

    HKCU 或HKEY_CURRENT_USER

    HKU 或HKEY_USERS

    HKCC 或HKEY_CURRENT_CONFIG

    HKDD 或HKEY_DYN_DATA

    HKPD 或HKEY_PERFORMANCE_DATA

    SHCTX 或SHELL_CONTEXT

    如果字串不能写入注册表则放置一个错误的标记。字串的类型为 REG_SZ 对应 WriteRegStr,或 REG_EXPAND_STR 对应WriteRegExpandStr。如果注册表键不存在则会自动创建。

    例:

    将程序信息写入注册表

    Section -Post

      WriteUninstaller "$INSTDIR\uninst.exe"

      WriteRegStr HKLM "PRODUCTDIRREGKEY""""INSTDIR\Test.exe"

      WriteRegStr PRODUCTUNINSTROOTKEY"{PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"

      WriteRegStr PRODUCTUNINSTROOTKEY"{PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"

      WriteRegStr PRODUCTUNINSTROOTKEY"{PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\Test.exe"

      WriteRegStr PRODUCTUNINSTROOTKEY"{PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"

      WriteRegStr PRODUCTUNINSTROOTKEY"{PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"

      WriteRegStr PRODUCTUNINSTROOTKEY"{PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"

    SectionEnd

     

    ReadRegDWORD

    作用:读取注册表信息

    例:

    在注册表中读取.net 版本

    Function GetNetFrameworkVersion

        Push $1

        Push $0

        ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" "Install"

        ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" "Version"

        StrCmp $0 1 KnowNetFrameworkVersion +1

        ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5" "Install"

        ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5" "Version"

        StrCmp $0 1 KnowNetFrameworkVersion +1

        ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0\Setup" "InstallSuccess"

        ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0\Setup" "Version"

        StrCmp $0 1 KnowNetFrameworkVersion +1

        ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v2.0.50727" "Install"

        ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v2.0.50727" "Version"

        StrCmp $1 "" +1 +2

        StrCpy $1 "2.0.50727.832"

        StrCmp $0 1 KnowNetFrameworkVersion +1

        ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322" "Install"

        ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322" "Version"

        StrCmp $1 "" +1 +2

        StrCpy $1 "1.1.4322.573"

        StrCmp $0 1 KnowNetFrameworkVersion +1

        ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\.NETFramework\policy\v1.0" "Install"

        ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\.NETFramework\policy\v1.0" "Version"

        StrCmp $1 "" +1 +2

        StrCpy $1 "1.0.3705.0"

        StrCmp $0 1 KnowNetFrameworkVersion +1

        StrCpy $1 "not .NetFramework"

        KnowNetFrameworkVersion:

        Pop $0

     

        Exch $1

    FunctionEnd

     

    DeleteRegKey

    作用:删除一个注册表键。如果指定了 /ifempty,则该注册表键仅当它无子键时才会被删除(否则,整个注册表键将被删除)。有效的根键值在后面的 WriteRegStr 列出。如果该键不能被删除(或如果它不存在)则会放置一个错误的标记。

    例:

    清除注册表信息

    DeleteRegKey PRODUCTUNINSTROOTKEY"{PRODUCT_UNINST_KEY}"

    DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"

    SetAutoClose true

     

    INI文件操作

    ReadINIStr 用户变量(输出) INI文件 区段 项

     

    作用:读取INI文件。从 “INI文件” 的 “区段” 区段读取 “项” 的值并把该值输出到用户变量。如果该项未找到时会放置一个错误标记且该用户变量被赋为空值。

    例:

    读取TimeZoneZh.ini文件中Field 1区段的State项,将值输出到$0

    ReadINIStr 0"PLUGINSDIR\TimeZoneZh.ini" "Field 1" "State"

     

    外部调用

    ReserveFile

    作用:把文件保存在稍后使用的数据区块用于下面的调用。有时,预先打包文件,方便安装加速释放之用。

    例:

    ReserveFile "TimeZoneZh.ini"

     

    Exec

    作用:这应该算是常用的命令了,执行一个指定的程序并且立即继续安装,就是直接执行一个程序。

    例:

    安装Microsoft.NET.exe,程序不等待继续执行下个步骤。

    Exec '$INSTDIR\Microsoft.NET.exe

     

    ExecWait

    作用:执行一个指定的程序并且等待运行处理结束。

    例:

    静默安装Microsoft.Net.exe安装包,并等待安装包运行结束。

    ExecWait 'INSTDIR\Microsoft.NET.exe/quiet/norestart′R1

     

    RegDLL

    作用:载入指定的 DLL 并且调用 DllRegisterServer (或入口点名称,当指定之后)。当产生一个错误的时候会置一个错误标记(例如不能载入 DLL,不能初始化 OLE,不能找到入口点,或者函数返回任何其它错误 ERROR_SUCCESS (=0))。

    其实就是注册或加载你要的插件!

    例:

    注册TIMProxy.dll插件

    regdll “$instdir\TIMProxy.dll”

     

    UnRegDLL

    作用:注销DLL插件

    例:

    注销TIMProxy.dll插件

    unregdll “$instdir\TIMProxy.dll”

     

    !include

    作用:包含头文件

    例:

    引用"MUI.nsh"头文件

    !include "MUI.nsh"

     

    !insertmacro

    作用:插入宏

    例:

    通过宏插入欢迎页面

    !insertmacro MUI_PAGE_WELCOME

     

    字符串操作

    StrCpy

    作用:复制字符串

    StrCpy $0 "a bbbbbbbb" 就有$0 = "a bbbbbbbb"

    StrCpy $0 "a bbbbbbbb" 3就有$0 = "a b"

     

    StrCmp

    作用:比较(不区分大小写)“字串1”和“字串2”,如果两者相等,跳转到“相同时跳转的标记”,否则跳转到“不相同时跳转的标记”。

     

    逻辑操作

    Push

    作用:把一个字串压入堆栈,该字串可随后从堆栈里弹出。

     

    Pop

    作用:从堆栈里弹出一个字串到用户变量 $x。如果堆栈是空的,则会置一个错误标记。

     

    if

    (1) IfAbort 退出时要跳转的标记 [不是退出时要跳转的标记]

    如果调用退出时它将返回 true

    (2) IfErrors 错误时跳转的标记 [没有错误时跳转的标记]

    检测并清除错误标记,如果设了错误标记,则跳转到“错误时跳转的标记”,否则跳转到“没有错误时跳转的标记”。

    (3)IfFileExists 要检测的文件 文件存在时跳转的标记 [文件不存在时跳转的标记]

    检测“要检测的文件”是否存在(可以用通配符,或目录),并当文件存在时跳转到“文件存在时跳转”,否则跳转到“文件不存在时跳转”。

     

    Goto

    作用:跳转到指定标记。nsi脚本常常使用相对跳转表示条件分枝,其语法是[+-][1-9],加号表示从当前位置往前跳转,减号则表示从当前位置往后跳转。数字表示跳转的语句条数。

    例:

    按数字跳转

    Goto +4 ; 跳转以下4条语句

    Goto -3 ; 跳转到前3条语句

    例:

    按标记跳转

    name "NSISDemo"

    outfile 'NSISDemo.exe'

    Section "NSISDemo"

    ReadRegStr $R0 HKLM SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Test "DisplayVersion"

    IntCmp $R0 "5.0" is5 lessthan5 morethan5  ;详情查看 帮助4.9.4.13 IntCmp

    is5:

      DetailPrint "$R0 == 5.0"

      Goto int

    lessthan5:

      DetailPrint "$R0 < 5.0"

      Goto error2

    morethan5:

      DetailPrint "$R0 > 5.0"

      Goto error1

    int:

    MessageBox MB_OK  "你系统中现有版本为$R0,点击OK安装更新" IDOK 

    DetailPrint "安装版本为: $R0"

    goto done

    error1:

    MessageBox MB_ICONSTOP|MB_OK  "你系统中版本$R0高于更新版本" IDOK 

    error2:

    MessageBox MB_ICONSTOP|MB_OK  "你系统中版本$R0低于更新版本" IDOK 

    done:

    SectionEnd

     

    MessageBox

    作用:显示一个包含“消息框文本”的消息框。“消息框选项列表”必须为下面的一个或多个,多个使用 | 来隔开。

    MB_OK - 显示 OK 按钮

    MB_OKCANCEL - 显示 OK 和取消按钮

    MB_ABORTRETRYIGNORE - 显示退出、重试、忽略按钮

    MB_RETRYCANCEL - 显示重试和取消按钮

    MB_YESNO - 显示是和否按钮

    MB_YESNOCANCEL - 显示是、否、取消按钮

    MB_ICONEXCLAMATION - 显示惊叹号图标

    MB_ICONINFORMATION - 显示信息图标

    MB_ICONQUESTION - 显示问号图标

    MB_ICONSTOP - 显示终止图标

    MB_TOPMOST - 使消息框在最前端显示

    MB_SETFOREGROUND - 设置前景

    MB_RIGHT - 右对齐文本

    MB_RTLREADING - RTL 阅读次序

    MB_DEFBUTTON1 - 默认为按钮 1

    MB_DEFBUTTON2 - 默认为按钮 2

    MB_DEFBUTTON3 - 默认为按钮 3

    MB_DEFBUTTON4 - 默认为按钮 4

     

    参考

    官方论坛:http://forums.winamp.com/forumdisplay.php?s=&forumid=65

    NSIS中文论坛:http://www.nsisfans.com/

    轻狂志博客(NSIS大神):http://www.flighty.cn/html/bushu/index.html

    作者:静默虚空
    欢迎任何形式的转载,但请务必注明出处。
    限于本人水平,如果文章和代码有表述不当之处,还请不吝赐教。

    转载于:https://www.cnblogs.com/cheng2015/p/7685012.html

    展开全文
  • 一个NSIS打包脚本

    千次阅读 2018-09-20 17:02:21
    文中用到了一个NSIS查找进程是否存在的插件FindProc.dll, 请移步下面地址下载 链接: https://pan.baidu.com/s/1efp8Azs5b8sEtQUTyhywMw 提取码: nbt3   ;XXXNSIS安装脚本 ;-------------------------------- !...

    文中用到了一个NSIS查找进程是否存在的插件FindProc.dll, 请移步下面地址下载

    链接: https://pan.baidu.com/s/1efp8Azs5b8sEtQUTyhywMw 提取码: nbt3

     

    ;XXXNSIS安装脚本
    
    ;--------------------------------
    !include "MUI2.nsh"
    
    ;--------------------------------
    ;General
    !define APPNAME "XXX"
    !define COMPANYNAME "xxx信息技术有限公司"
    !define DESCRIPTION "XXX 1.0"
    !define PROCESS_NAME "PROGRESSNAME"
    !define MAIN_EXE_NAME "PROGRESSNAME"
    !define ABOUTURL "http://xxxxxx.com//"
    
    # These three must be integers
    !define VERSIONMAJOR 1
    !define VERSIONMINOR 0
    !define VERSIONBUILD 0
    
    !define INSTALLSIZE 415*1024
    
    ;Name and file
    Name "${APPNAME}"
    OutFile "XXX安装包.exe"
    
    Var DefaultInstallDir
    
    ;Default installation folder
    InstallDir "$PROGRAMFILES\${APPNAME}"
    
    ;Request application privileges for Windows Vista
    RequestExecutionLevel admin
    
    ;--------------------------------
    ;Interface Settings
    
    !define MUI_ABORTWARNING
    
    !define MUI_ICON "PROGRESSNAMEDG\icon\project.ico"
    !define MUI_UNICON "PROGRESSNAMEDG\icon\project-uninstall.ico"
    
    ;--------------------------------
    ;Pages
    
    !insertmacro MUI_PAGE_WELCOME
    !define MUI_PAGE_CUSTOMFUNCTION_SHOW BEFORE_DIRECTORY
    !insertmacro MUI_PAGE_DIRECTORY
    !insertmacro MUI_PAGE_INSTFILES
    !insertmacro MUI_PAGE_FINISH
    
    !insertmacro MUI_UNPAGE_WELCOME
    !insertmacro MUI_UNPAGE_CONFIRM
    !insertmacro MUI_UNPAGE_INSTFILES
    !insertmacro MUI_UNPAGE_FINISH
    
    ;--------------------------------
    ;Languages
    
    !insertmacro MUI_LANGUAGE "SimpChinese"
    
    
    ;开始安装时检查是否正在运行
    ;${PROCESS_NAME}为自定义的常量
    Function .onInit
    	FindProcDLL::FindProc "${PROCESS_NAME}.exe"
    	Pop $R0
    	IntCmp $R0 1 0 no_run
    	MessageBox MB_ICONSTOP "安装程序检测到 ${APPNAME} 正在运行,请退出程序后重试"
    	Quit
    	no_run:
    	ReadRegStr $DefaultInstallDir HKLM "Software\${APPNAME}" "InstallLocation"
    	StrLen $0 $DefaultInstallDir
    	${If} $0 > 0
    		StrCpy $INSTDIR $DefaultInstallDir
    	${EndIf}
    FunctionEnd
    
    ;开始卸载时检查:
    Function un.onInit
    	FindProcDLL::FindProc "${PROCESS_NAME}.exe"
    	Pop $R0
    	IntCmp $R0 1 0 no_run
    	MessageBox MB_ICONSTOP "安装程序检测到 ${APPNAME} 正在运行,请退出程序后重试"
    	Quit
    	no_run:
    FunctionEnd
    
    ; 如果已经是安装过的, 禁用修改目录的地方
    Function BEFORE_DIRECTORY
    	StrLen $1 $DefaultInstallDir
    	${If} $1 > 0
    		;禁用浏览按钮    
    		FindWindow $0 "#32770" "" $HWNDPARENT    
    		GetDlgItem $0 $0 1001    
    		EnableWindow $0 0    
    		
    		;禁止编辑目录    
    		FindWindow $0 "#32770" "" $HWNDPARENT    
    		GetDlgItem $0 $0 1019    
    		EnableWindow $0 0
        ${EndIf}
    FunctionEnd
    
    ;--------------------------------
    ;Installer Sections
    Section "install"
    	; 释放文件
    	SetOutPath "$INSTDIR"
    	File /r PROGRESSNAMEDG\*.*
    	
    	; 创建桌面快捷方式
    	CreateShortCut "$desktop\${APPNAME}.lnk" "$INSTDIR\${MAIN_EXE_NAME}.exe" "" "$INSTDIR\icon\project.ico"
    	
    	;Create uninstaller
    	WriteUninstaller "$INSTDIR\Uninstall.exe"
    	
    	# Start Menu
    	createDirectory "$SMPROGRAMS\${COMPANYNAME}"
    	createShortCut "$SMPROGRAMS\${COMPANYNAME}\${APPNAME}.lnk" "$INSTDIR\${MAIN_EXE_NAME}.exe" "" "$INSTDIR\icon\project.ico"
    	createShortCut "$SMPROGRAMS\${COMPANYNAME}\卸载客户端.lnk" "$INSTDIR\Uninstall.exe" "" "$INSTDIR\icon\project-uninstall.ico"
     
    	; 写入注册信息
    	WriteRegStr HKLM "Software\${APPNAME}" "InstallLocation" "$INSTDIR"
    	
    	# Registry information for add/remove programs
    	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "DisplayName" "${DESCRIPTION}"
    	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "UninstallString" "$INSTDIR\uninstall.exe"
    	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "QuietUninstallString" "$INSTDIR\uninstall.exe /S"
    	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "InstallLocation" "$INSTDIR"
    	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "DisplayIcon" "$INSTDIR\icon\project.ico"
    	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "Publisher" "${COMPANYNAME}"
    	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "URLInfoAbout" "${ABOUTURL}"
    	WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "DisplayVersion" "${VERSIONMAJOR}.${VERSIONMINOR}.${VERSIONBUILD}"
    	WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "VersionMajor" ${VERSIONMAJOR}
    	WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "VersionMinor" ${VERSIONMINOR}
    	# There is no option for modifying or repairing the install
    	WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "NoModify" 1
    	WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "NoRepair" 1
    	# Set the INSTALLSIZE constant (!defined at the top of this script) so Add/Remove Programs can accurately report the size
    	WriteRegDWORD HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}" "EstimatedSize" ${INSTALLSIZE}
    SectionEnd
    
    ;--------------------------------
    ;Uninstaller Section
    Section "Uninstall"
    	; 删除文件
    	RMDir /r $INSTDIR
    	
    	; 删除桌面快捷方式
    	Delete "$desktop\${APPNAME}.lnk"
    	
    	; 删除开始菜单
    	RMDir /r "$SMPROGRAMS\${COMPANYNAME}"
    	
    	# Remove uninstaller information from the registry
    	DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\${COMPANYNAME} ${APPNAME}"
    	
    	;删除注册表项
    	DeleteRegKey HKLM "Software\${APPNAME}"
    SectionEnd
    

     

    展开全文
  • NSIS打包脚本基础

    千次阅读 2016-04-26 09:16:45
    脚本结构  属性  页面  区段  函数  用户自定义函数  回调函数  安装逻辑回调函数  卸载逻辑回调函数 基本语法  变量  编译器指令  常用指令  文件、目录操作  注册表操作  INI文件...
     
     
    

    简介

    NSISNullsoft Scriptable Install System)是一个开源的 Windows 系统下安装程序制作程序。它提供了安装、卸载、系统设置、文件解压缩等功能。这如其名字所指出的那样,NSIS 是通过它的脚本语言来描述安装程序的行为和逻辑的。NSIS 的脚本语言和通常的编程语言有类似的结构和语法,但它是为安装程序这类应用所设计的。

    工具:

    HW VNISEditNSIS脚本编辑器)

    1、 使用编辑器中NSIS脚本向导功能,自动生成对应的nsi脚本。

    点击文件->新建脚本:向导,接下来根据向导页面的设置选项一步步设置你需要的安装条件。

     

    2、也可以在编辑器中编写nsi脚本,然后再编译生成exe安装包文件。

     

    脚本结构

    NSIS脚本(下称nsi脚本)主要包含安装程序属性、页面、区段、函数。

     

    属性

    用来定义安装程序的行为和界面风格,这些属性大部分是编译时刻属性,即不能在运行时刻改变。

     

    页面

    安装程序的向导页面

    例:

    Page license

    Page components

    Page directory

    Page instfiles

    UninstPage uninstConfirm

    UninstPage instfiles

     

    区段

    是对应某种安装/卸载选项的处理逻辑,该段代码仅当用户选择相应的选项才被执行。卸载程序的区段名用"un."作为前缀。

    例:

    Section "Installer Section"

    SectionEnd

     

    Section "un.Uninstaller Section"

    SectionEnd

     

    区段名的修饰符/o表示该区段默认不选上,-表示隐藏区段(匿名区段也是隐藏区段),!表示需要粗体显示的区段。

    SectionIn表示该区段和安装类型之间的关系

    SubSection表示子区段

    SectionIn insttype_index [insttype_index] ... [RO]

    ;RO修饰符表示不可修改。

    SubSection [/e] Caption [subsection_name index output]

    ;修饰符/e用于该子区段的所有区段是否默认展开。

     

    函数

    包含了模块化的安装逻辑。

    nsi脚本中函数分为两种:用户自定义函数和回调函数。

    用户自定义函数

    用户自定义函数仅当是Call指令调用时才被执行,如果函数体中没有abort语句,则安装程序执行完了用户自定义函数,继续运行Call语句和指令。

    用户自定义函数的语法:

    Function <函数名>

    # some commands

    FunctionEn

     

    回调函数

    回调函数则是由在特定的时间点触发的程序段。

    例:

    Function .onInit

    MessageBox MB_YESNO "This will install My Program. Do you wish to continue?" IDYES gogogo

    Abort

    gogogo:

    FunctionEnd

     

    安装逻辑回调函数

    NSIS对于安装逻辑定义以下回调函数:

    .onGUIInit.onInit.onInstFailed.onInstSuccess.onGUIEnd.onMouseOverSection.onRebootFailed.onSelChange.onUserAbort.onVerifyInstDir

    卸载逻辑回调函数

    NSIS对于卸载逻辑定义以下回调函数:
    un.onGUIInit
    un.onInitun.onUninstFailedun.onUninstSuccessun.onGUIEndun.onRebootFailedun.onUserAbort

    基本语法

    变量

    nsi脚本用var关键字来定义变量,使用$来引用变量。

    注意:变量是全局的并且是大小写敏感的。

    除了用户自定义的变量外,nsi脚本中定义了寄存器变量 0  9, R0  R0 R9用于参数传递,以及系统变量用于特定用途,这些变量主要有:

    $INSTDIR
    用户定义的解压路径。
    $PROGRAMFILES
    程序文件目录(通常为 C:\Program Files 但是运行时会检测)
    $COMMONFILES
    公用文件目录。这是应用程序共享组件的目录(通常为 C:\Program Files\Common Files 但是运行时会检测)
    $DESKTOP
    Windows 
    桌面目录(通常为 C:\windows\desktop 但是运行时会检测)。该常量的内容(所有用户或当前用户)取决于SetShellVarContext 设置。默认为当前用户。
    $EXEDIR
    安装程序运行时的位置。(从技术上来说你可以修改改变量,但并不是一个好方法)
    ${NSISDIR}
    包含 NSIS 安装目录的一个标记。在编译时会检测到。常用于在你想调用一个在 NSIS 目录下的资源时,例如:图标、界面……
    $WINDIR
    Windows 
    目录(通常为 C:\windows  C:\winnt 但在运行时会检测)
    $SYSDIR
    Windows 
    系统目录(通常为 C:\windows\system  C:\winnt\system32 但在运行时会检测)
    $TEMP
    系统临时目录(通常为 C:\windows\temp 但在运行时会检测)
    $STARTMENU
    开始菜单目录(常用于添加一个开始菜单项,使用 CreateShortCut)。该常量的内容(所有用户或当前用户)取决于SetShellVarContext 设置。默认为当前用户。
    $SMPROGRAMS
    开始菜单程序目录(当你想定位 $STARTMENU\程序 时可以使用它)。该常量的内容(所有用户或当前用户)取决于SetShellVarContext 设置。默认为当前用户。
    $SMSTARTUP
    开始菜单程序/启动 目录。该常量的内容(所有用户或当前用户)取决于 SetShellVarContext 设置。默认为当前用户。
    $QUICKLAUNCH
     IE4 活动桌面及以上的快速启动目录。如果快速启动不可用,仅仅返回和 $TEMP 一样。
    $DOCUMENTS
    文档目录。一个当前用户典型的路径形如 C:\Documents and Settings\Foo\My Documents。这个常量的内容(所有用户或当前用户)取决于 SetShellVarContext 设置。默认为当前用户。
    该常量在 Windows 95  Internet Explorer 4 没有安装时无效。
    $SENDTO
    该目录包含了发送到菜单快捷项。
    $RECENT
    该目录包含了指向用户最近文档的快捷方式。
    $FAVORITES
    该目录包含了指向用户网络收藏夹、文档等的快捷方式。这个常量的内容(所有用户或当前用户)取决于 SetShellVarContext 设置。默认为当前用户。
    该常量在 Windows 95  Internet Explorer 4 没有安装时无效。
    $MUSIC
    用户的音乐文件目录。这个常量的内容(所有用户或当前用户)取决于 SetShellVarContext 设置。默认为当前用户。
    该常量仅在 Windows XPME 及以上才有效。
    $PICTURES
    用户的图片目录。这个常量的内容(所有用户或当前用户)取决于 SetShellVarContext 设置。默认为当前用户。
    该常量仅在 Windows 2000XPME 及以上才有效。
    $VIDEOS
    用户的视频文件目录。这个常量的内容(所有用户或当前用户)取决于 SetShellVarContext 设置。默认为当前用户。
    该常量仅在 Windows XPME 及以上才有效。
    $NETHOOD
    该目录包含了可能存在于我的网络位置、网上邻居文件夹的链接对象。
    该常量在 Windows 95  Internet Explorer 4 和活动桌面没有安装时无效。
    $FONTS
    系统字体目录。
    $TEMPLATES
    文档模板目录。这个常量的内容(所有用户或当前用户)取决于 SetShellVarContext 设置。默认为当前用户。
    $APPDATA
    应用程序数据目录。当前用户路径的检测需要 Internet Explorer 4 及以上。所有用户路径的检测需要 Internet Explorer 5及以上。这个常量的内容(所有用户或当前用户)取决于 SetShellVarContext 设置。默认为当前用户。
    该常量在 Windows 95  Internet Explorer 4 和活动桌面没有安装时无效。
    $PRINTHOOD
    该目录包含了可能存在于打印机文件夹的链接对象。
    该常量在 Windows 95  Windows 98 上无效。
    $INTERNET_CACHE
    Internet Explorer 
    的临时文件目录。
    该常量在 Windows 95  Windows NT  Internet Explorer 4 和活动桌面没有安装时无效。
    $COOKIES
    Internet Explorer 
     Cookies 目录。
    该常量在 Windows 95  Windows NT  Internet Explorer 4 和活动桌面没有安装时无效。
    $HISTORY
    Internet Explorer 
    的历史记录目录。
    该常量在 Windows 95  Windows NT  Internet Explorer 4 和活动桌面没有安装时无效。
    $PROFILE
    用户的个人配置目录。一个典型的路径如 C:\Documents and Settings\Foo
    该常量在 Windows 2000 及以上有效。
    $ADMINTOOLS
    一个保存管理工具的目录。这个常量的内容(所有用户或当前用户)取决于 SetShellVarContext 设置。默认为当前用户。
    该常量在 Windows 2000ME 及以上有效。 
    $RESOURCES
    该资源目录保存了主题和其他 Windows 资源(通常为 C:\Windows\Resources 但在运行时会检测)
    该常量在 Windows XP 及以上有效。 
    $RESOURCES_LOCALIZED
    该本地的资源目录保存了主题和其他 Windows 资源(通常为 C:\Windows\Resources\1033 但在运行时会检测)
    该常量在 Windows XP 及以上有效。
    $CDBURN_AREA
    一个在烧录 CD 时储存文件的目录。.
    该常量在 Windows XP 及以上有效。
    $HWNDPARENT
    父窗口的十进制 HWND
    $PLUGINSDIR
    该路径是一个临时目录,当第一次使用一个插件或一个调用 InitPluginsDir 时被创建。该文件夹当解压包退出时会被自动删除。这个文件夹的用意是用来保存给 InstallOptions 使用的 INI 文件、启动画面位图或其他插件运行需要的文件。

    编译器指令

    nsi脚本的编译器指令主要指仅在编译时刻执行的命令。这些命令主要用来包含文件、条件化编译、定义常量、定义宏等。定义常量和宏是编译器指令的最主要应用。

     

    常用指令

    文件、目录操作

    File

    作用:释放文件到当前输出路径。

    如果使用了 /nonfatal 开关且当文件未找到时使用警告来代替错误

    如果使用了 /a 开关,则被添加的文件的属性将会保持

    如果使用了 /r 开关,匹配的文件将会在子目录里被递归的搜索。如果目录名匹配则所有包含的内容都会被递归添加,目录结构也会被保持

    使用 /x 开关可以用来来排除文件或目录

    例:

    ProjectFiles目录下的所有文件释放到输出目录

    SetOutPath "$INSTDIR"

    SetOverwrite ifnewer

    File /r "ProjectFiles\*.*"

     

    Delete

    作用:从目标系统删除文件

    例:删除文件

    Delete "$SMPROGRAMS\Test.exe"

     

    Rename

    作用:把源文件重命名为目标文件

    例:

    重命名文件

    Rename  INSTDIR\file.ext INSTDIR\file.extINSTDIR\file.dat

     

    CreateDirectory

    作用:创建 (递归创建指定的目录。当目录不能创建时会放置一个错误标记。你也可以指定一个绝对路径。

    例:在默认Program Files目录下创建一个Temp目录

    CreateDirectory "$SMPROGRAMS\Temp"

     

    RMDir

    作用:删除目录

    例:

    删除Resources及其子目录

    RMDir /r $INSTDIR\Resources

     

    SetOutPath

    作用:设置输出路径($OUTDIR)且当路径不存在时创建(需要时会递归创建)。必须为绝对路径名,通常都使用 $INSTDIR

    例:

    将用户定义的解压路径作为输出目录

    SetOutPath $INSTDIR

     

    CreateShortCut

    作用:创建快捷文件.lnk 目标文件

    例:

    设置Test.exe的快捷方式Test.lnk,图标为Test.ico

    CreateShortCut " DESKTOP\Test.lnk"" DESKTOP\Test.lnk""INSTDIR\Test.exe" "" "$INSTDIR\Resources\Picture\Icon\ Test.ico"

     

    注册表操作

    WriteRegStrWriteRegExpandStr

    作用:把字符串写入注册表。根键必须为下面列表之一:

    HKCR  HKEY_CLASSES_ROOT

    HKLM HKEY_LOCAL_MACHINE

    HKCU HKEY_CURRENT_USER

    HKU HKEY_USERS

    HKCC HKEY_CURRENT_CONFIG

    HKDD HKEY_DYN_DATA

    HKPD HKEY_PERFORMANCE_DATA

    SHCTX SHELL_CONTEXT

    如果字串不能写入注册表则放置一个错误的标记。字串的类型为 REG_SZ 对应 WriteRegStr,或 REG_EXPAND_STR 对应WriteRegExpandStr。如果注册表键不存在则会自动创建。

    例:

    将程序信息写入注册表

    Section -Post

      WriteUninstaller "$INSTDIR\uninst.exe"

      WriteRegStr HKLM " PRODUCTDIRREGKEY"""" PRODUCTDIRREGKEY""""INSTDIR\Test.exe"

      WriteRegStr  PRODUCTUNINSTROOTKEY" PRODUCTUNINSTROOTKEY"{PRODUCT_UNINST_KEY}" "DisplayName" "$(^Name)"

      WriteRegStr  PRODUCTUNINSTROOTKEY" PRODUCTUNINSTROOTKEY"{PRODUCT_UNINST_KEY}" "UninstallString" "$INSTDIR\uninst.exe"

      WriteRegStr  PRODUCTUNINSTROOTKEY" PRODUCTUNINSTROOTKEY"{PRODUCT_UNINST_KEY}" "DisplayIcon" "$INSTDIR\Test.exe"

      WriteRegStr  PRODUCTUNINSTROOTKEY" PRODUCTUNINSTROOTKEY"{PRODUCT_UNINST_KEY}" "DisplayVersion" "${PRODUCT_VERSION}"

      WriteRegStr  PRODUCTUNINSTROOTKEY" PRODUCTUNINSTROOTKEY"{PRODUCT_UNINST_KEY}" "URLInfoAbout" "${PRODUCT_WEB_SITE}"

      WriteRegStr  PRODUCTUNINSTROOTKEY" PRODUCTUNINSTROOTKEY"{PRODUCT_UNINST_KEY}" "Publisher" "${PRODUCT_PUBLISHER}"

    SectionEnd

     

    ReadRegDWORD

    作用:读取注册表信息

    例:

    在注册表中读取.net 版本

    Function GetNetFrameworkVersion

        Push $1

        Push $0

        ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" "Install"

        ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" "Version"

        StrCmp $0 1 KnowNetFrameworkVersion +1

        ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5" "Install"

        ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.5" "Version"

        StrCmp $0 1 KnowNetFrameworkVersion +1

        ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0\Setup" "InstallSuccess"

        ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v3.0\Setup" "Version"

        StrCmp $0 1 KnowNetFrameworkVersion +1

        ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v2.0.50727" "Install"

        ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v2.0.50727" "Version"

        StrCmp $1 "" +1 +2

        StrCpy $1 "2.0.50727.832"

        StrCmp $0 1 KnowNetFrameworkVersion +1

        ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322" "Install"

        ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v1.1.4322" "Version"

        StrCmp $1 "" +1 +2

        StrCpy $1 "1.1.4322.573"

        StrCmp $0 1 KnowNetFrameworkVersion +1

        ReadRegDWORD $0 HKLM "SOFTWARE\Microsoft\.NETFramework\policy\v1.0" "Install"

        ReadRegDWORD $1 HKLM "SOFTWARE\Microsoft\.NETFramework\policy\v1.0" "Version"

        StrCmp $1 "" +1 +2

        StrCpy $1 "1.0.3705.0"

        StrCmp $0 1 KnowNetFrameworkVersion +1

        StrCpy $1 "not .NetFramework"

        KnowNetFrameworkVersion:

        Pop $0

     

        Exch $1

    FunctionEnd

     

    DeleteRegKey

    作用:删除一个注册表键。如果指定了 /ifempty,则该注册表键仅当它无子键时才会被删除(否则,整个注册表键将被删除)。有效的根键值在后面的 WriteRegStr 列出。如果该键不能被删除(或如果它不存在)则会放置一个错误的标记。

    例:

    清除注册表信息

    DeleteRegKey  PRODUCTUNINSTROOTKEY" PRODUCTUNINSTROOTKEY"{PRODUCT_UNINST_KEY}"

    DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"

    SetAutoClose true

     

    INI文件操作

    ReadINIStr 用户变量(输出) INI文件 区段 

     

    作用:读取INI文件。从 INI文件”  “区段” 区段读取 “项” 的值并把该值输出到用户变量。如果该项未找到时会放置一个错误标记且该用户变量被赋为空值。

    例:

    读取TimeZoneZh.ini文件中Field 1区段的State项,将值输出到$0

    ReadINIStr  0" 0"PLUGINSDIR\TimeZoneZh.ini" "Field 1" "State"

     

    外部调用

    ReserveFile

    作用:把文件保存在稍后使用的数据区块用于下面的调用。有时,预先打包文件,方便安装加速释放之用。

    例:

    ReserveFile "TimeZoneZh.ini"

     

    Exec

    作用:这应该算是常用的命令了,执行一个指定的程序并且立即继续安装,就是直接执行一个程序。

    例:

    安装Microsoft.NET.exe,程序不等待继续执行下个步骤。

    Exec '$INSTDIR\Microsoft.NET.exe

     

    ExecWait

    作用:执行一个指定的程序并且等待运行处理结束。

    例:

    静默安装Microsoft.Net.exe安装包,并等待安装包运行结束。

    ExecWait ' INSTDIR\Microsoft.NET.exe/quiet/norestart INSTDIR\Microsoft.NET.exe/quiet/norestart′R1

     

    RegDLL

    作用:载入指定的 DLL 并且调用 DllRegisterServer (或入口点名称,当指定之后)。当产生一个错误的时候会置一个错误标记(例如不能载入 DLL,不能初始化 OLE,不能找到入口点,或者函数返回任何其它错误 ERROR_SUCCESS (=0))

    其实就是注册或加载你要的插件!

    例:

    注册TIMProxy.dll插件

    regdll “$instdir\TIMProxy.dll”

     

    UnRegDLL

    作用:注销DLL插件

    例:

    注销TIMProxy.dll插件

    unregdll “$instdir\TIMProxy.dll”

     

    !include

    作用:包含头文件

    例:

    引用"MUI.nsh"头文件

    !include "MUI.nsh"

     

    !insertmacro

    作用:插入宏

    例:

    通过宏插入欢迎页面

    !insertmacro MUI_PAGE_WELCOME

     

    字符串操作

    StrCpy

    作用:复制字符串

    StrCpy $0 "a bbbbbbbb" 就有$0 = "a bbbbbbbb"

    StrCpy $0 "a bbbbbbbb" 3就有$0 = "a b"

     

    StrCmp

    作用:比较(不区分大小写)“字串1”和“字串2”,如果两者相等,跳转到“相同时跳转的标记”,否则跳转到“不相同时跳转的标记”。

     

    逻辑操作

    Push

    作用:把一个字串压入堆栈,该字串可随后从堆栈里弹出。

     

    Pop

    作用:从堆栈里弹出一个字串到用户变量 $x。如果堆栈是空的,则会置一个错误标记。

     

    if

    1 IfAbort 退出时要跳转的标记 [不是退出时要跳转的标记]

    如果调用退出时它将返回 true

    2 IfErrors 错误时跳转的标记 [没有错误时跳转的标记]

    检测并清除错误标记,如果设了错误标记,则跳转到“错误时跳转的标记”,否则跳转到“没有错误时跳转的标记”。

    3IfFileExists 要检测的文件 文件存在时跳转的标记 [文件不存在时跳转的标记]

    检测“要检测的文件”是否存在(可以用通配符,或目录),并当文件存在时跳转到“文件存在时跳转”,否则跳转到“文件不存在时跳转”。

     

    Goto

    作用:跳转到指定标记。nsi脚本常常使用相对跳转表示条件分枝,其语法是[+-][1-9],加号表示从当前位置往前跳转,减号则表示从当前位置往后跳转。数字表示跳转的语句条数。

    例:

    按数字跳转

    Goto +4 ; 跳转以下4条语句

    Goto -3 ; 跳转到前3条语句

    例:

    按标记跳转

    name "NSISDemo"

    outfile 'NSISDemo.exe'

    Section "NSISDemo"

    ReadRegStr $R0 HKLM SOFTWARE\Microsoft\Windows\CurrentVersion\Uninstall\Test "DisplayVersion"

    IntCmp $R0 "5.0" is5 lessthan5 morethan5  ;详情查看 帮助4.9.4.13 IntCmp

    is5:

      DetailPrint "$R0 == 5.0"

      Goto int

    lessthan5:

      DetailPrint "$R0 < 5.0"

      Goto error2

    morethan5:

      DetailPrint "$R0 > 5.0"

      Goto error1

    int:

    MessageBox MB_OK  "你系统中现有版本为$R0,点击OK安装更新" IDOK 

    DetailPrint "安装版本为: $R0"

    goto done

    error1:

    MessageBox MB_ICONSTOP|MB_OK  "你系统中版本$R0高于更新版本" IDOK 

    error2:

    MessageBox MB_ICONSTOP|MB_OK  "你系统中版本$R0低于更新版本" IDOK 

    done:

    SectionEnd

     

    MessageBox

    作用:显示一个包含“消息框文本”的消息框。“消息框选项列表”必须为下面的一个或多个,多个使用 | 来隔开。

    MB_OK - 显示 OK 按钮

    MB_OKCANCEL - 显示 OK 和取消按钮

    MB_ABORTRETRYIGNORE - 显示退出、重试、忽略按钮

    MB_RETRYCANCEL - 显示重试和取消按钮

    MB_YESNO - 显示是和否按钮

    MB_YESNOCANCEL - 显示是、否、取消按钮

    MB_ICONEXCLAMATION - 显示惊叹号图标

    MB_ICONINFORMATION - 显示信息图标

    MB_ICONQUESTION - 显示问号图标

    MB_ICONSTOP - 显示终止图标

    MB_TOPMOST - 使消息框在最前端显示

    MB_SETFOREGROUND - 设置前景

    MB_RIGHT - 右对齐文本

    MB_RTLREADING - RTL 阅读次序

    MB_DEFBUTTON1 - 默认为按钮 1

    MB_DEFBUTTON2 - 默认为按钮 2

    MB_DEFBUTTON3 - 默认为按钮 3

    MB_DEFBUTTON4 - 默认为按钮 4

     

    参考

    官方论坛:http://forums.winamp.com/forumdisplay.php?s=&forumid=65

    NSIS中文论坛:http://www.nsisfans.com/

    轻狂志博客(NSIS大神):http://www.flighty.cn/html/bushu/index.html

    展开全文
  • NSIS打包基础脚本

    2018-10-31 09:56:07
    define MUI_LANGDLL_REGISTRY_VALUENAME "NSIS:Language" ; These indented statements modify settings for MUI_PAGE_FINISH !define MUI_FINISHPAGE_NOAUTOCLOSE !define MUI_FINISHPAGE_RUN !define MUI_...

    !define PRODUCT_NAME "Lenovo Moto Smart Assistant"
    !define PRODUCT_VERSION "3.9.7.13"
    !define PRODUCT_PUBLISHER "Lenovo"
    !define PRODUCT_LINK_NAME "Lenovo Moto Smart Assistant.lnk"
    !define PRODUCT_MAIN_EXE "Lenovo Moto Smart Assistant.exe"
    #!define PRODUCT_MAIN_EXE "WpfApplication7.exe"
    !define PRODUCT_UNINSTALL_SURVEY "Survey\UninstallSurvey.exe"
    !define PRODUCT_WEB_SITE "http://www.lenovo.com"
    !define PRODUCT_TEMP "$APPDATA\lmsa"
    !define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\Lenovo Moto Smart Assistant.exe"
    !define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"
    !define PRODUCT_WEBBROWSER_IE_VERSION "Software\Microsoft\Internet Explorer\MAIN\FeatureControl\FEATURE_BROWSER_EMULATION"
    !define PRODUCT_UNINST_ROOT_KEY "HKLM"
    !define HKEY_LOCAL_MACHINE 0x80000002

    SetCompressor lzma

    ; MUI 1.67 compatible ------
    !include "MUI.nsh"
    !include "LogicLib.nsh"
    !include "FileFunc.nsh"
    !include "NSISList.nsh"

    ; MUI Settings
    !define MUI_ABORTWARNING
    !define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\orange-install.ico"
    !define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\orange-uninstall.ico"

    ; Language Selection Dialog Settings
    !define MUI_LANGDLL_REGISTRY_ROOT "${PRODUCT_UNINST_ROOT_KEY}"
    !define MUI_LANGDLL_REGISTRY_KEY "${PRODUCT_UNINST_KEY}"
    !define MUI_LANGDLL_REGISTRY_VALUENAME "NSIS:Language"

    ; These indented statements modify settings for MUI_PAGE_FINISH
    !define MUI_FINISHPAGE_NOAUTOCLOSE
    !define MUI_FINISHPAGE_RUN
    !define MUI_FINISHPAGE_RUN_CHECKED
    !define MUI_FINISHPAGE_RUN_TEXT "Launch the program"
    !define MUI_FINISHPAGE_RUN_FUNCTION "LaunchLink"
    ;!define MUI_FINISHPAGE_SHOWREADME_NOTCHECKED
    ;!define MUI_FINISHPAGE_SHOWREADME $INSTDIR\readme.txt

    ; Welcome page
    !insertmacro MUI_PAGE_WELCOME
    ; License page
    #!define MUI_LICENSEPAGE_CHECKBOX
    !define MUI_LICENSEPAGE_RADIOBUTTONS
    !insertmacro MUI_PAGE_LICENSE ".\lmsa\Installation\Resources\license.rtf"
    ; Directory page
    !insertmacro MUI_PAGE_DIRECTORY
    ; Instfiles page
    !insertmacro MUI_PAGE_INSTFILES
    ; Finish page
    !insertmacro MUI_PAGE_FINISH

    ; Uninstaller pages
    !insertmacro MUI_UNPAGE_INSTFILES

    ; Language files
    !insertmacro MUI_LANGUAGE "English"
    #!insertmacro MUI_LANGUAGE "SimpChinese"

    ; Reserve files
    !insertmacro MUI_RESERVEFILE_INSTALLOPTIONS

    ; MUI end ------

    Name "${PRODUCT_NAME}"
    OutFile "${PRODUCT_NAME}-${PRODUCT_VERSION}.exe"
    InstallDir "$PROGRAMFILES\Lenovo Moto Smart Assistant"
    InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""
    #RequestExecutionLevel admin
    ShowInstDetails show
    ShowUnInstDetails show
    #BrandingText "Lenovo"
    BrandingText " "
    XPStyle on

    !macro KillProcMacro un
      Function ${un}KillProcFunc
        StrCpy $0 "${PRODUCT_MAIN_EXE}"
        KillProc::FindProcesses
        ${If} $1 = 0
        ${AndIf} $0 > 0
            MessageBox MB_ICONQUESTION|MB_OKCANCEL|MB_DEFBUTTON2 "The ${PRODUCT_MAIN_EXE} is running, whether to continue uninstalling?" IDOK done_uninstall
            Abort
                
            done_uninstall:
                StrCpy $0 "${PRODUCT_MAIN_EXE}"
                KillProc::KillProcesses
        ${EndIf}
      FunctionEnd
    !macroend
    !insertmacro KillProcMacro ""
    !insertmacro KillProcMacro "un."

    Function CheckAndDownloadDotNet45
        Var /GLOBAL dotNET45IsThere
        Var /GLOBAL dotNET_CMD_LINE
        Var /GLOBAL EXIT_CODE

        ReadRegDWORD $dotNET45IsThere HKLM "SOFTWARE\Microsoft\NET Framework Setup\NDP\v4\Full" "Release"
        IntCmp $dotNET45IsThere 378389 is_equal is_less is_greater
        is_equal:
            Goto done_compare_not_needed
        is_greater:
            Goto done_compare_not_needed
        is_less:
            Goto done_compare_exit
            #Goto done_compare_needed
        done_compare_exit:
            MessageBox MB_OK|MB_ICONEXCLAMATION "Your computer does not have .NET Framework 4.5, please install it first."
            Abort
        done_compare_needed:
            # Microsoft Download Center EXE:
            # Web Bootstrapper: http://go.microsoft.com/fwlink/?LinkId=225704
            # Full Download: http://go.microsoft.com/fwlink/?LinkId=225702
            
            # Let's see if the user is doing a Silent install or not
            IfSilent is_quiet is_not_quiet

            is_quiet:
                StrCpy $dotNET_CMD_LINE "/q /norestart"
                Goto LookForLocalFile
            is_not_quiet:
                StrCpy $dotNET_CMD_LINE "/showrmui /passive /norestart"
                Goto LookForLocalFile

            LookForLocalFile:
                IfFileExists "$EXEPATH\components\dotNET45Full.exe" do_local_install do_network_install

                do_local_install:
                    ExecWait '"$EXEPATH\components\dotNET45Full.exe" $dotNET_CMD_LINE' $EXIT_CODE
                    Goto is_reboot_requested

                do_network_install:
                    Var /GLOBAL dotNetDidDownload
                    NSISdl::download "http://go.microsoft.com/fwlink/?LinkId=225704" "$TEMP\dotNET45Web.exe" $dotNetDidDownload

                    StrCmp $dotNetDidDownload success fail
                    success:
                        ExecWait '"$TEMP\dotNET45Web.exe" $dotNET_CMD_LINE' $EXIT_CODE
                        Goto is_reboot_requested

                    fail:
                        MessageBox MB_OK|MB_ICONEXCLAMATION "Unable to download .NET Framework.  ${PRODUCT_NAME} will be installed, but will not function without the Framework!"
                        Goto done_dotNET_function

                    is_reboot_requested:
                        ${If} $EXIT_CODE = 1641
                        ${OrIf} $EXIT_CODE = 3010
                            SetRebootFlag true
                        ${EndIf}

        done_compare_not_needed:
            Goto done_dotNET_function
        done_dotNET_function:
    FunctionEnd

    Function CheckSingleInstallation
        ;Single case installation
        System::Call 'kernel32::CreateMutexA(i 0, i 0, t "myMutex") i .r1 ?e'
        Pop $R0
        StrCmp $R0 0 +3
        MessageBox MB_OK|MB_ICONEXCLAMATION "The installer is running..."
        Abort
    FunctionEnd

    ;$var=0 Versions are equal
    ;$var=1 Version1 is newer
    ;$var=2 Version2 is newer
    Function VersionCompare
        !define VersionCompare `!insertmacro VersionCompareCall`

        !macro VersionCompareCall _VER1 _VER2 _RESULT
            Push `${_VER1}`
            Push `${_VER2}`
            Call VersionCompare
            Pop ${_RESULT}
        !macroend

        Exch $1
        Exch
        Exch $0
        Exch
        Push $2
        Push $3
        Push $4
        Push $5
        Push $6
        Push $7

        begin:
        StrCpy $2 -1
        IntOp $2 $2 + 1
        StrCpy $3 $0 1 $2
        StrCmp $3 '' +2
        StrCmp $3 '.' 0 -3
        StrCpy $4 $0 $2
        IntOp $2 $2 + 1
        StrCpy $0 $0 '' $2

        StrCpy $2 -1
        IntOp $2 $2 + 1
        StrCpy $3 $1 1 $2
        StrCmp $3 '' +2
        StrCmp $3 '.' 0 -3
        StrCpy $5 $1 $2
        IntOp $2 $2 + 1
        StrCpy $1 $1 '' $2

        StrCmp $4$5 '' equal

        StrCpy $6 -1
        IntOp $6 $6 + 1
        StrCpy $3 $4 1 $6
        StrCmp $3 '0' -2
        StrCmp $3 '' 0 +2
        StrCpy $4 0

        StrCpy $7 -1
        IntOp $7 $7 + 1
        StrCpy $3 $5 1 $7
        StrCmp $3 '0' -2
        StrCmp $3 '' 0 +2
        StrCpy $5 0

        StrCmp $4 0 0 +2
        StrCmp $5 0 begin newer2
        StrCmp $5 0 newer1
        IntCmp $6 $7 0 newer1 newer2

        StrCpy $4 '1$4'
        StrCpy $5 '1$5'
        IntCmp $4 $5 begin newer2 newer1

        equal:
        StrCpy $0 0
        goto end
        newer1:
        StrCpy $0 1
        goto end
        newer2:
        StrCpy $0 2

        end:
        Pop $7
        Pop $6
        Pop $5
        Pop $4
        Pop $3
        Pop $2
        Pop $1
        Exch $0
    FunctionEnd

    ;$R0=0 exists
    ;$R0=2 not exists
    ;$R0=other error
    ;$R1 Handle of the key ($0)
    Function CheckRegKeyExists
        StrCpy $1 "Software\Microsoft\Windows\CurrentVersion\Uninstall\$0"
        ;Create a cache for the handle of the key
        System::Call "*(i 0) i .R0"
        Push $1
        ;Check with API, return value in $R1
        system::call 'Advapi32::RegOpenKey(i ${HKEY_LOCAL_MACHINE}, t s, i R0) .iR1'
        ;Close the handle of the key
        system::call 'Advapi32::RegCloseKey(i R0)'
        ;Free memory of $R0
        system::free $1
    FunctionEnd

    Function CheckInstallshieldPackage
        #Var /GLOBAL Installshield_Package_UninstallString
        Var /GLOBAL Installshield_Product_ID
        #StrCpy $Installshield_Product_ID ""
        
        ${List.Create} Product_ID_Array
        ${List.Add} Product_ID_Array "{1930BFD1-2F0A-43D9-B760-FAA2A40806DE}"
        ${List.Add} Product_ID_Array "{21E28485-F3A3-4D3E-86A3-7E17C1BAAF42}"
        ${List.Add} Product_ID_Array "{63BF7D1C-95B4-4E37-97A7-F8835B8A13D0}"
        ${List.Add} Product_ID_Array "{3E34ECBE-D771-4D2B-8BDB-F4CF0BF663D1}"
        ${List.Add} Product_ID_Array "{B72D19C8-EDA7-4C56-B8E8-EA3D35749BF4}"
        ${List.Add} Product_ID_Array "{DB16BC9B-89C2-46A5-840F-79410CAB73B1}"
        ${List.Add} Product_ID_Array "{C5E66E98-6776-477B-B0B3-B1A8372F8CC6}"
        ${List.Add} Product_ID_Array "{4EE4FC82-5245-478B-BBD2-15E977072240}"
        ${List.Add} Product_ID_Array "{4F7F8A4C-5D6E-4A4D-AD0B-8FF4964CA277}"
        ${List.Add} Product_ID_Array "{A92D6B74-8528-4284-841F-76B3D9CE478B}"
        ${List.Add} Product_ID_Array "{4226EB1C-E6C5-471F-88BC-5081A8D3FBD8}"
        #${List.Add} Product_ID_Array "{F3D02057-5B79-4AAE-A989-4EB8E71D6BEE}"
        
        ${List.All} Product_ID_Array
        Loop1:
            Pop $0
            ${If} $0 != ""
            ${AndIf} $0 != "__LAST"
                Call CheckRegKeyExists
                ${If} $R1 <> 0
                    MessageBox MB_OK "TEST1"
                    Goto Loop1
                ${Else}
                    StrCpy $Installshield_Product_ID $0
                    Call KillProcFunc
                    ExecCmd::exec 'cmd /c MsiExec.exe /qb /x $Installshield_Product_ID'
                ${EndIf}
            ${EndIf}
            
            #Pop $0
            #StrCmp $0 "" +5 0
            #ReadRegDWORD $Installshield_Package_UninstallString ${PRODUCT_UNINST_ROOT_KEY} "Software\Microsoft\Windows\CurrentVersion\Uninstall\$0" "UninstallString"
            #StrCmp $Installshield_Package_UninstallString "" +3
            #StrCpy $Installshield_Product_ID $0
            #Goto +2
            #StrCmp $0 "__LAST" +3 Loop1
            
        #Call KillProcFunc
        #ExecCmd::exec 'cmd /c MsiExec.exe /qb /x $Installshield_Product_ID'
    FunctionEnd

    Function CheckExistsOrUpgrade
        ReadRegStr $0 ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "DisplayVersion"
        ReadRegStr $R0 ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "UninstallString"
        ${VersionCompare} $0 ${PRODUCT_VERSION} $0
        ${If} $R0 != ""
            MessageBox MB_OKCANCEL|MB_ICONEXCLAMATION \
                "${PRODUCT_NAME} ${PRODUCT_VERSION} is already installed. $\n$\nClick `OK` to remove the \
                previous version or `Cancel` to cancel this upgrade." \
                IDOK continue_install
            Abort
            
            continue_install:
                ${If} $0 = 2
                    WriteRegDWORD ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_DIR_REGKEY}" "Upgrade" 0x1
                ${EndIf}
                
                ClearErrors
                #Exec $R0
                ExecWait '$R0 _?=$INSTDIR'
        ${EndIf}
    FunctionEnd

    Function .onInit
        Call CheckSingleInstallation
        Call CheckInstallshieldPackage
        Call CheckExistsOrUpgrade
        Call CheckAndDownloadDotNet45
        !insertmacro MUI_LANGDLL_DISPLAY
    FunctionEnd

    Function .onInstFailed
    FunctionEnd

    Function .onInstSuccess
        #DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
    FunctionEnd

    Section "MainSection" SEC01
        SetOutPath "$INSTDIR"
        SetOverwrite try
        File ".\Bin\adb.exe"
        File ".\Bin\AdbWinApi.dll"
        File ".\Bin\AdbWinUsbApi.dll"
        File ".\Bin\LibUsbDotNet.dll"
        File ".\Bin\BouncyCastle.Crypto.dll"
        File ".\Bin\Common.Logging.Core.dll"
        File ".\Bin\Common.Logging.dll"
        File ".\Bin\Common.Logging.Log4Net1215.dll"
        File ".\Bin\EntityFramework.dll"
        File ".\Bin\fastboot.exe"
        File ".\Bin\Gma.QrCodeNet.Encoding.dll"
        File ".\Bin\GoogleAnalytics.Core.dll"
        File ".\Bin\GoogleAnalytics.WPF.Managed.dll"
        File ".\Bin\Lenovo Moto Smart Assistant.exe"
        File ".\Bin\Lenovo Moto Smart Assistant.exe.config"
        File ".\Bin\lenovo.themes.generic.exe"
        File ".\Bin\Newtonsoft.Json.dll"
        File ".\Bin\Microsoft.Expression.Interactions.dll"
        File ".\Bin\System.Windows.Interactivity.dll"
        File ".\Bin\SevenZipSharp.dll"
        File ".\Bin\SharpAdbClient.dll"
        
        File ".\Bin\plugins.xml"
        File ".\Bin\download-config.xml"
        File ".\Bin\user*.xml"
        
        File ".\Bin\lenovo.mbg.service.*.dll"
        File ".\Bin\SharpVectors.*.dll"
        File ".\Bin\log4net.*"
        #File /r /x lmsa*.exe /x *.pdb /x *.nsi ".\*.*"
        CreateDirectory "$SMPROGRAMS\Lenovo"
        CreateShortCut "$SMPROGRAMS\Lenovo\${PRODUCT_LINK_NAME}" "$INSTDIR\${PRODUCT_MAIN_EXE}"
        CreateShortCut "$DESKTOP\${PRODUCT_LINK_NAME}" "$INSTDIR\${PRODUCT_MAIN_EXE}"
        
        SetOutPath "$INSTDIR\Survey"
        File ".\UninstallSurvey\UninstallSurvey\Release\UninstallSurvey.exe.*"
        
        SetOutPath "$INSTDIR\Document"
        File ".\lmsa\Installation\Resources\Document\*.*"
        
        SetOutPath "$INSTDIR\7z"
        File /r ".\Bin\7z\*.*"
        
        SetOutPath "$INSTDIR\7zSharp"
        File /r ".\Bin\7zSharp\*.*"
        
        SetOutPath "$INSTDIR\apk"
        File /r ".\Bin\apk\lmsa.apk"
        
        SetOutPath "$INSTDIR\en"
        File /r ".\Bin\en\*.*"
        
        SetOutPath "$INSTDIR\lang"
        File /r ".\lmsa\Installation\Resources\Document\lang\*.*"
        
        SetOutPath "$INSTDIR\pluginIcons"
        File /r ".\Bin\pluginIcons\*.*"
        
        SetOutPath "$INSTDIR\plugins\02928af025384c75ae055aa2d4f256c8"
        File /x "lenovo.mbg.service.framework.devicemgt.dll" \
             /x "lenovo.mbg.service.framework.lang.dll" \
             /x "lenovo.mbg.service.lmsa.hostproxy.dll" \
             /x "LibUsbDotNet.dll" \
             /x "Microsoft.Windows.Shell.dll" \
             /x "SharpAdbClient.dll" \
                ".\Bin\plugins\02928af025384c75ae055aa2d4f256c8\*.dll"
        File ".\Bin\plugins\02928af025384c75ae055aa2d4f256c8\lenovo.mbg.service.lmsa.phoneManager.exe"
        File ".\Bin\plugins\02928af025384c75ae055aa2d4f256c8\lenovo.mbg.service.lmsa.phoneManager.exe.config"
        SetOutPath "$INSTDIR\plugins\02928af025384c75ae055aa2d4f256c8\en"
        File /r ".\Bin\plugins\02928af025384c75ae055aa2d4f256c8\en\*.*"
        
        SetOutPath "$INSTDIR\plugins\310f47ad70d54880b33225d864e6fe68"
        File ".\Bin\plugins\310f47ad70d54880b33225d864e6fe68\*.dll"
        File ".\Bin\plugins\310f47ad70d54880b33225d864e6fe68\lenovo.mbg.service.lmsa.forum.exe"
        File ".\Bin\plugins\310f47ad70d54880b33225d864e6fe68\lenovo.mbg.service.lmsa.forum.exe.config"
        
        SetOutPath "$INSTDIR\plugins\8ab04aa975e34f1ca4f9dc3a81374e2c"
        File ".\lmsa\Installation\Resources\Avatar\reaper.cfg"
        File ".\lmsa\Installation\Resources\Avatar\reaper_x86_Debug_MultiByte.dll"
        File ".\lmsa\Installation\Resources\Avatar\reaper_x86_Release_MultiByte.dll"
        File /x "lenovo.mbg.service.framework.lang.dll" \
             /x "lenovo.mbg.service.lmsa.hostproxy.dll" \
                ".\Bin\plugins\8ab04aa975e34f1ca4f9dc3a81374e2c\*.dll"
        File ".\Bin\plugins\8ab04aa975e34f1ca4f9dc3a81374e2c\*.exe"
        File ".\Bin\plugins\8ab04aa975e34f1ca4f9dc3a81374e2c\*.exe.config"
        SetOutPath "$INSTDIR\plugins\8ab04aa975e34f1ca4f9dc3a81374e2c\en"
        File /r ".\Bin\plugins\8ab04aa975e34f1ca4f9dc3a81374e2c\en\*.*"
        
        SetOutPath "$INSTDIR\plugins\992e746537954a7d9ae613d5ec9bc7a6"
        File /x "lenovo.mbg.service.lmsa.hostproxy.dll" ".\Bin\plugins\992e746537954a7d9ae613d5ec9bc7a6\*.dll"
        File ".\Bin\plugins\992e746537954a7d9ae613d5ec9bc7a6\lenovo.mbg.service.lmsa.tips.exe"
        File ".\Bin\plugins\992e746537954a7d9ae613d5ec9bc7a6\lenovo.mbg.service.lmsa.tips.exe.config"
        
        SetOutPath "$INSTDIR\plugins\d7deab64b8cb4e31b600ad0d839b6d73"
        File ".\Bin\plugins\d7deab64b8cb4e31b600ad0d839b6d73\index.html"
        File ".\Bin\plugins\d7deab64b8cb4e31b600ad0d839b6d73\*.dll"
        File ".\Bin\plugins\d7deab64b8cb4e31b600ad0d839b6d73\lenovo.mbg.service.lmsa.messenger.exe"
        File ".\Bin\plugins\d7deab64b8cb4e31b600ad0d839b6d73\lenovo.mbg.service.lmsa.messenger.exe.config"
        SetOutPath "$INSTDIR\plugins\d7deab64b8cb4e31b600ad0d839b6d73\web"
        File /r ".\Bin\plugins\d7deab64b8cb4e31b600ad0d839b6d73\web\*.*"
        
        SetOutPath "$INSTDIR\plugins\dd537b5c6c074ae49cc8b0b2965ce54a"
        File ".\Bin\plugins\dd537b5c6c074ae49cc8b0b2965ce54a\*.dll"
        File ".\LmsaPlugins\toolBox\Ringtone\Comm\libmp3lame.32.dll"
        File ".\Bin\plugins\dd537b5c6c074ae49cc8b0b2965ce54a\lenovo.mbg.service.lmsa.toolbox.exe.config"
        File ".\Bin\plugins\dd537b5c6c074ae49cc8b0b2965ce54a\lenovo.mbg.service.lmsa.toolbox.exe"
        
        ${GetSize} "$INSTDIR" "/S=OK" $0 $1 $2
        IntFmt $0 "0x%08X" $0
        WriteRegDWORD ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}" "EstimatedSize" "$0"
    SectionEnd
        
    Section -AdditionalIcons
        SetOutPath $INSTDIR
        #WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}"
        #CreateShortCut "$SMPROGRAMS\lmsa\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url"
        CreateShortCut "$SMPROGRAMS\lmsa\Uninstall.lnk" "$INSTDIR\uninst.exe"
    SectionEnd

    Section -Post
        WriteUninstaller "$INSTDIR\uninst.exe"
        WriteRegStr ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\${PRODUCT_MAIN_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}" "DisplayIcon" "$INSTDIR\${PRODUCT_MAIN_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}"
        WriteRegDWORD ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_WEBBROWSER_IE_VERSION}" "${PRODUCT_MAIN_EXE}" 0x11001
    SectionEnd

    Function LaunchLink
        ExecShell "" "$SMPROGRAMS\lmsa\${PRODUCT_LINK_NAME}"
    FunctionEnd

    Function un.onUninstSuccess
        # do something
        HideWindow
        MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) has been successfully removed from your computer."
    FunctionEnd

    Function un.onInit
        Call un.KillProcFunc
        !insertmacro MUI_UNGETLANGUAGE
    FunctionEnd

    Function un.PreUninstall
        ReadRegDWORD  $R0 ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_DIR_REGKEY}" "Upgrade"
        ; Not Upgrade
        ${IfNot} $R0 = 1
            MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "Are you sure you want to completely uninstall $(^Name) and all components?" IDYES +2
            Abort
            ExecWait "$INSTDIR\${PRODUCT_UNINSTALL_SURVEY}"
            ClearErrors
        ${EndIf}
    FunctionEnd

    Section Uninstall
        Call un.PreUninstall
        
        Delete "$INSTDIR\uninst.exe"
        
        ;Upgrade
        ${If} $R0 = 1
            CreateDirectory "${PRODUCT_TEMP}"
            CopyFiles /SILENT "$INSTDIR\*.xml" "${PRODUCT_TEMP}"
            CopyFiles /SILENT "$INSTDIR\*.json" "${PRODUCT_TEMP}"
            CopyFiles /SILENT "$INSTDIR\*.res" "${PRODUCT_TEMP}"
            CreateDirectory "${PRODUCT_TEMP}\logs"
            CopyFiles /SILENT "$INSTDIR\logs\*.*" "${PRODUCT_TEMP}\logs"
            CreateDirectory "${PRODUCT_TEMP}\plugins\8ab04aa975e34f1ca4f9dc3a81374e2c\log"
            CopyFiles /SILENT "$INSTDIR\plugins\8ab04aa975e34f1ca4f9dc3a81374e2c\log\*.*" "${PRODUCT_TEMP}\plugins\8ab04aa975e34f1ca4f9dc3a81374e2c\log"
            CreateDirectory "${PRODUCT_TEMP}\download"
            CopyFiles /SILENT "$INSTDIR\download\*.*" "${PRODUCT_TEMP}\download"
            Delete "$INSTDIR\*.*"
            RMDir /r "$INSTDIR"
            CreateDirectory "$INSTDIR"
            CopyFiles /SILENT "${PRODUCT_TEMP}\*.*" "$INSTDIR"
            Delete "${PRODUCT_TEMP}\*.*"
            RMDir /r "${PRODUCT_TEMP}"
        ${Else}
            Delete "$INSTDIR\*.*"
            RMDir /r "$INSTDIR"
        ${EndIf}
        #Delete "$INSTDIR\*.*"
        Delete "$SMPROGRAMS\lmsa\Uninstall.lnk"
        #Delete "$SMPROGRAMS\lmsa\Website.lnk"
        Delete "$DESKTOP\${PRODUCT_LINK_NAME}"
        Delete "$SMPROGRAMS\lmsa\${PRODUCT_LINK_NAME}"

        #RMDir /r "$INSTDIR"
        RMDir "$SMPROGRAMS\lmsa"

        DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"
        DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_DIR_REGKEY}"
        #DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_WEBBROWSER_IE_VERSION}"
        SetAutoClose true
    SectionEnd

    展开全文
  • NSIS打包exe样例脚本

    2020-11-21 21:33:04
    NSIS打包exe样例脚本 包含卸载,服务注册,卸载结束程序 ; 该脚本使用 HM VNISEdit 脚本编辑器向导产生 ; 安装程序初始定义常量 !define PRODUCT_NAME "小v内网助手" !define PRODUCT_VERSION "1.0" !define ...
  • nsis打包相关脚本设置

    2019-11-01 18:08:12
    1.控制面板中软件后面显示大小,在nsi脚本中加入: !define ARP "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}" !include "FileFunc.nsh" Section "Install" ; [...copy all files here,...
  • NSIS
  • NSIS脚本打包程序

    2019-03-11 18:34:26
    Windows平台下,通过编辑NSIS脚本生成对程序进行打包
  • NSIS脚本实例NSIS脚本实例NSIS脚本实例NSIS脚本实例NSIS脚本实例NSIS脚本实例NSIS脚本实例NSIS脚本实例NSIS脚本实例NSIS脚本实例NSIS脚本实例NSIS脚本实例NSIS脚本实例
  • 为了重装系统后安装软件方便,把自己常用软件打包NSIS安装脚本脚本中的软件请自行下载!
  • 此资源为nsis打包软件配套脚本,大家如果想使用参考可进行下载或关注博主, 此脚本带有软件运行时进行安装提示框,卸载运行时提示框等错误操作提示;
  • nsis 打包的程序

    2019-01-29 10:54:26
    安装之后可进行nsis 打包,需要编写nsis脚本,这是一段描述
  • NSIS打包教程

    千次阅读 2019-05-25 14:22:12
    NSIS是"Nullsoft 脚本安装系统"(Nullsoft scriptable Installation System)的缩写,它是是一个免费的win32安装、卸载系统,可以很方便的打包windows应用程序。它的特点:脚本简洁高效;系统开销少;支持安装、卸载、...
  • NSIS打包

    2019-07-24 20:06:00
    二、打包 1、启动NSIS,打开脚本编辑 2、新建脚本 2.1编辑程序信息 转载于:https://my.oschin...
  • 关于NSIS脚本打包程序

    2017-04-22 13:49:07
    可在百度下载NSIS与nisedit,也可在我的资源下载-&gt;资源使用nisedit2.0.3.exe向导生成.nsi文件脚本可以在文件的结尾的SectionEnd再加上下面一段代码 这样可以实现安装完成后再安装程序所需要的运行环境Lang...
  • nsis打包程序

    2018-12-26 11:25:43
    该程序可以实现打包资源,做出一个可安装的应用程序,可通过向导制作或使用nsi脚本文件
  • 程序打包NSIS脚本

    千次阅读 2015-06-15 12:00:25
    程序打包NSIS脚本  2013-12-04 16:30:19| 分类: 学习笔记|举报|字号 订阅   下载LOFTER客户端 这段时间负责公司的程序的打包,于是...
  • NSIS打包程序步骤

    2021-04-12 10:42:41
    最近有个需求是需要将几个程序打包成一个win安装包,通过资料查询,知道了NSIS这个工具,特此记录NSIS打包工具的用法步骤
  • NSIS打包工具 含说明

    2014-02-12 11:29:58
    NSIS打包工具 含教程 包括脚本编译器,脚本可视化向导生成,如何查看应用程序依赖的工具等

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,142
精华内容 456
关键字:

nsis打包脚本