Discuz! Board

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 2860|回复: 3
打印 上一主题 下一主题

nsis

[复制链接]

388

主题

602

帖子

2218

积分

金牌会员

Rank: 6Rank: 6

积分
2218
跳转到指定楼层
楼主
发表于 2015-9-14 15:16:36 | 只看该作者 回帖奖励 |正序浏览 |阅读模式
回复

使用道具 举报

1272

主题

2067

帖子

7962

积分

认证用户组

Rank: 5Rank: 5

积分
7962
地板
发表于 2020-4-6 19:39:26 | 只看该作者
nsis安装包_示例脚本语法解析



上一节讲了nsis安装包_向导脚本初级个性化,虽然末尾提到“更多个性化,敬请期待”,但在接下来的几篇并不打算继续介绍如何个性化脚本,而是要回归到基础语法和对NSIS的进一步认识。



上一节只是很生硬地在讲解几处个性化,如果对别人有帮助的话,最多也只算授人以鱼,根据那几处个性化的修改,不可能想到还有哪些地方可以个性化和怎样个性化。要想授人以渔,必须学习和分享更加通用的知识和技能。



首先语法是必不可少的,但即便是中文的,也很少有人愿意系统阅读帮助文档(不过这对程序员来说应该是小菜一碟)。本节主要针对上一节的向导脚本涉及到的语法进行解析,以此打开掌握语法的突破口。当语法和相关知识了解到一定程度后,再去系统阅读帮助文件,查漏补缺,就会容易很多,而且对系统掌握NSIS很有帮助。



如需要,可下载示例脚本:

http://download.csdn.net/detail/signjing/4540492



以下是代码及解析,其中有底色的部分为脚本内容。

注释、!define、变量、!include、常量
; Script generated by the HM NIS Edit Script Wizard.

; HM NIS Edit Wizard helper defines



!define PRODUCT_NAME "signjing安装示例"

!define PRODUCT_VERSION "0.0.0.1"

!define PRODUCT_PUBLISHER "signjing"

!define PRODUCT_WEB_SITE "http://blog.csdn.net/signjing"

!define PRODUCT_DIR_REGKEY "Software\Microsoft\Windows\CurrentVersion\App Paths\GenPat.exe"

!define PRODUCT_UNINST_KEY "Software\Microsoft\Windows\CurrentVersion\Uninstall\${PRODUCT_NAME}"

!define PRODUCT_UNINST_ROOT_KEY "HKLM"



; MUI 1.67 compatible ------

!include "MUI.nsh"



; MUI Settings

!define MUI_ABORTWARNING

......

;个性化图素;

!define MUI_WELCOMEFINISHPAGE_BITMAP "C:\util\nsis_uis\白玉山塔.bmp"



!define MUI_WELCOMEPAGE_TITLE "\r\n   signjing安装示例向导"



!define MUI_WELCOMEPAGE_TEXT "  signjing安装示例是signjing开发的一个NSIS安装示例软件。\r\n\r\n  软件作者:signjing \r\n\r\n  官方网址:http://blog.csdn.net/signjing\r\n\r\n  $_CLICK"



注释
以 ; 或 #开始的行为注释行。可以在命令后面添加注释,也可以使用C规范的注释来注释一行或多行。如果参数需要由;或#开头,可以用双引号把它括起来。

如:

; 注释

# 注释



/*

注释

注释

*/

!define
[/date] 符号 [值]

这个命令将会向全局定义列表中添加“符号”。这个效果与对编译器使用 /D命令行切换效果相似。(只有在 !define 命令之后,定义才有效)



如果使用了 /date,则定义的值会被格式化为 strtime格式。strtime 会把代表当前的时间日期转换为实际的值。例如 %H会转换为当前时间的 24 小时格式。完整的格式化字串列表你可以查找 MSDN。在 POSIX平台,你可以使用 man strtime 来获取列表。

如:

!define USE_SOMETHING

!define VERSION 1.2

!define /date NOW "%H:%M:%S %d %b, %Y"

变量
所有的变量都是全局的并且可以用于区段和函数。需要注意的是,在默认情况下变量被限制在 1024字节。要扩大这个限制你需要重新构建一个使用了更大 NSIS_MAX_STRLEN值的 NSIS 或使用特别版本。

!include
文件这个命令可以将一个文件包含到脚本中,就像是脚本的一部分一样。请注意,如果一个文件包含在了另一个目录中,那么当前目录仍是编译脚本的地方(不是要包含的文件所在的目录)。如果编译器无法找到文件,那么它将会在每一个包含目录中查找。

常量
常量通常用在 InstallDir属性里。

需要注意的是一些新的常量并不是在所有的 OS上都是正常的。例如 $CDBURN_AREA 仅在 Windows XP及以上系统中才正常。如果在 Windows 98 中使用将会得到空值。除非特别提示,否则该常量都是在所有 OS上有效的。



$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和活动桌面没有安装时无效。

$LOCALAPPDATA

本机应用程序数据目录。该常量仅在 Windows 2000或以上系统有效。.

$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

父窗口的十进制窗口句柄。

$PLUGINSDIR

该路径是一个临时目录,当第一次使用一个插件或一个调用 InitPluginsDir时被创建。该文件夹当安装程序退出时会被自动删除。这个文件夹的用意是用来保存给 InstallOptions使用的 INI 文件、启动画面位图或其他插件运行需要的文件。

字串里使用的常量

$$

转义,用来表示 $。

$\r

用来表示一个回车(\r)。

$\n

用来表示新的一行(\n)。

$\t

用来表示一个 Tab(\t)。

!insertmacro、Name、OutFile、InstallDir、InstallDirRegKey、ShowInstDetails、ShowUnInstDetails、BrandingText
; Welcome page

!insertmacro MUI_PAGE_WELCOME

; License page

!insertmacro MUI_PAGE_LICENSE "协议许可.rtf"

; Directory page

!insertmacro MUI_PAGE_DIRECTORY

; Instfiles page

!insertmacro MUI_PAGE_INSTFILES

; Finish page

!define MUI_FINISHPAGE_RUN "$INSTDIR\Bin\GenPat.exe"

!insertmacro MUI_PAGE_FINISH



; Uninstaller pages

!insertmacro MUI_UNPAGE_INSTFILES



; Language files

!insertmacro MUI_LANGUAGE "SimpChinese"



; MUI end ------



Name "${PRODUCT_NAME} ${PRODUCT_VERSION}"

;OutFile "Setup.exe"

;OutFile "${PRODUCT_NAME}.exe"

OutFile "自定义.exe"

InstallDir "$PROGRAMFILES\signjing安装示例"

InstallDirRegKey HKLM "${PRODUCT_DIR_REGKEY}" ""

ShowInstDetails show

ShowUnInstDetails show



BrandingText " signjing博客 http://blog.csdn.net/signjing"

!insertmacro
宏名称 [参数] [...]

插入一个由 !macro 创建的宏的内容。如果创建的宏带有参数,那么你必须按宏的需求向它传送足够的参数。

!macro Print text

DetailPrint "${text}"

!macroend

!insertmacro Print "some text"

!insertmacro Print "some more text"

name
名称 [双与名称]

设置安装程序的名称。名称通常用来显示产品的名称比如“我的程序””。如果在名称里有一个或多个与符号(&),把第二个参数设为与第一个相同,有 &的地方使用两个 & 来表示。例如你的产品名称为“foo & bar2000”,那么使用:

Name "foo & bar2000" "foo && bar2000"

如果你的安装程序名称里有 & 符号并且对名称使用了一个 LangString,那么你还需要创建另一个含有双 &字符的名称作为第二个参数。

接受变量。如果使用了变量,使用的变量必须在 .onInit被初始化。

outfile
[路径\]安装程序.exe

指定 MakeNSIS 要写入安装程序的输出文件。仅仅是 MakeNSIS 要写入的文件,它不会对安装程序的内容有任何影响。

installdir
默认安装目录设定默认的安装目录。查看变量一节得到可用于该字串的变量(尤其是 $PROGRAMFILES)。注意该字串中最后一个 \后面的部分会被保留,当用户在安装时选择“浏览”并取得新的目录字串时,该部分会自动附加在后面(要禁止该行为你需要在目录字串后面添加一个额外的 \,但是你要使用引号把目录字串括起来以避免被认为是断行处理)。如果没有起作用的话,还是使用浏览按钮吧。

installdirregkey
根键子键键名该属性让安装程序去检测一注册表里的一个字串,如果该字串可用那么把它用来作为安装目录。如果预置了该属性,当指定的注册表键可用时它会越过 InstallDir指定的字串,否则使用默认的 InstallDir 指定值。查询注册表时,该命令将自动截去引号(如 "C:\program files\poop" "%1",可得到 C:\program files\poop )。如果该字串以 .exe结尾,它还会自动移去字串里的文件名部分(如 C:\program files\poop\poop.exe,将得到 C:\program files\poop )。对于更多高级的安装目录配置,可在 .onInit函数里设定 $INSTDIR。[译者注:事实上它还可以自动截取如 "C:\program files\poop\poop.exe" "%1"而得到 C:\program files\poop ,这样你只要知道了某个程序关联的文件类型,就可以直接用它获得该程序的安装目录。比如 InstallDirRegKey HKCR "FlashGet.Document\shell\open\command" "" 即可获得网际快车的安装目录]

showinstdetails
hide|show|nevershow

设置是否显示安装详细信息。你可以设为 hide来隐藏详细信息但用户可以查看,show 用来默认显示详细信息,nevershow可以阻止用户查看任何信息。注意区段里可以使用 SetDetailsView 来更改它的设置。

showuninstdetails
hide|show|nevershow

设置是否显示卸载详细信息。你可以设为 hide来隐藏详细信息但用户可以查看,show 用来默认显示详细信息,nevershow可以阻止用户查看任何信息。注意区段里可以使用 SetDetailsView 来更改它的设置。

brandingtext
/TRIM(LEFT|RIGHT|CENTER)文本设置显示在安装程序窗口底部的文本(默认为“Nullsoft Install System vX.XX”)。如果设为空字串("")则使用默认值;设为" "(一个空格)则显示空白。如果你不知道哪个适合你,那就保留默认值吧,这样可以使每个人知道你使用的 NSIS版本。使用 /TRIMLEFT、/TRIMRIGHT或 /TRIMCENTER 来裁剪控制大小到字串大小。

section、SetOutPath、SetOverwrite、File、CreateDirectory、CreateShortCut、SectionEnd
Section "MainSection" SEC01

SetOutPath "$INSTDIR\Bin"

SetOverwrite try

File "..\..\Program Files\NSIS\Bin\GenPat.exe"

CreateDirectory "$SMPROGRAMS\signjing安装示例"

CreateShortCut "$SMPROGRAMS\signjing安装示例\signjing安装示例.lnk" "$INSTDIR\Bin\GenPat.exe"

CreateShortCut "$DESKTOP\signjing安装示例.lnk" "$INSTDIR\Bin\GenPat.exe"

……

File "..\..\Program Files\NSIS\NSIS.chm"

CreateShortCut "$SMPROGRAMS\signjing安装示例\Help.lnk" "$INSTDIR\NSIS.chm"

……

SetOutPath "$INSTDIR"

File "..\..\Program Files\NSIS\uninst-nsis.exe"

SectionEnd

Section
[/o] [([!]|[-])区段名] [区段索引输出]

开始并且打开一个新的区段。如果区段名为空、遗漏或者以一个 -开头,那么它将是一个隐藏的区段,用户也不能选择禁止它。如果一个区段名为“Uninstall”或以“un.”为前缀,那么它就是一个卸载程序区段。如果指定了区段索引输出,该参数将被定义 (!defined)为区段索引(然后可以对它使用 SectionSetText等)。如果区段名以一个 !开头,那么该区段的显示名称将以粗体字显示。如果指定了 /o 开关,则该区段默认为不选。



Section "-隐藏区段"

SectionEnd

Section # 隐藏区段

SectionEnd

Section "!描黑区段"

SectionEnd

Section /o "可选区段"

SectionEnd

Section "某些安装" SEC_IDX

SectionEnd

SectionEnd
该命令关闭当前打开的区段。

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



SetOutPath $INSTDIR

File program.exe

SetOverwrite
on|off|try|ifnewer|ifdiff|lastused

该命令设置了由 File 命令使用的覆盖标记来决定目标文件已存在时是否覆盖。如果覆盖标记为 on ,则目标文件被覆盖(这个是默认值)。如果覆盖标记为 off ,则已存在的文件不会被覆盖。如果覆盖标记为 try ,文件仅当可以被覆盖时(就是说假如文件不能写入,它会自动略过而不需要用户决定)才会覆盖目标文件。如果覆盖标记为 ifnewer,则仅当已存在的文件比新文件旧时才会覆盖目标文件。如果覆盖标记为 ifdiff ,则仅当已存在的文件比新文件旧或新时才会覆盖目标文件。注意在 ifnewer 或 ifdiff模式下,目标文件的日期都会被设为新文件的日期,而不管 SetDateSave 是怎么设置的。



SetOverwrite off

File program.cfg #配置文件将不会覆盖

SetOverwrite on

File
[/nonfatal] [/a] ([/r] [/x文件|通配符 [...]] (文件|通配符) [...] | /oname=输出路径\文件名输入路径\文件名)

释放文件到当前输出路径($OUTDIR)。



注意输出文件名是 $OUTDIR\文件名。

如果使用了 /oname=X 开关,则输出文件会变为 $OUTDIR\X。当使用了 /oname=开关时只能指定一个文件,且输出的文件名可以使用变量(或完整路径如 $SYSDIR\whatever.dll)。如果输出名称包含了空格,你需要用双引号把参数括起来,包括 /oname,就像下面例子显示的那样。

支持通配符。

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

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

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

如果覆盖模式被设定为 try 并且文件不能覆盖,那么 File 命令将会置一个错误标记,或者如果覆盖模式被设定为 on并且文件不能覆盖并用户选择了忽略时,也会放置一个错误标记。

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

File something.exe

File /a something.exe

File *.exe

File /r *.dat

File /r data

File /oname=$TEMP\temp.dat somefile.ext

File "/oname=$TEMP\name with spaces.dat" somefile.ext

File /nonfatal "一个可能不存在的文件"

File /r /x CVS myproject\*.*

File /r /x *.res /x *.obj /x *.pch source\*.*



CreateDirectory
要创建的路径

创建 (递归创建)指定的目录。当目录不能创建时会放置一个错误标记。

你也可以指定一个绝对路径。

CreateDirectory $INSTDIR\some\directory

CreateShortCut
快捷文件.lnk 目标文件 [参数 [图标文件 [图标索引号 [启动选项 [键盘快捷键 [描述]]]]]]

创建一个指向“目标文件”的快捷方式“快捷文件.lnk”,可以带“参数”参数。用于快捷方式的图标为“图标文件,图标索引号”;要使用默认图标的话把“图标文件”和“图标索引号”设为空字串。“启动选项”可以是它们之一: SW_SHOWNORMAL, SW_SHOWMAXIMIZED, SW_SHOWMINIMIZED, 或一个空字串。“键盘快捷键”应该为 flag|c格式且 flag 可以联合使用(使用 |): ALT, CONTROL, EXT,或 SHIFT。c为要使用的字符(a-z, A-Z, 0-9, F1-F24 等等)。注意在这些字串里不能含有空格。一个典型的例子为 "ALT|CONTROL|F8"。$OUTDIR被用来作为工作目录。你可以在创建快捷方式之前使用 SetOutPath 来指定或更改。“描述”为快捷方式的描述,或在 XP 下作为注释调用。当快捷方式不能创建的时候会放置一个错误标记(例如路径 (链接路径或目标路径)不存在或一些其它错误)。



CreateDirectory "$SMPROGRAMS\My Company"

CreateShortCut "$SMPROGRAMS\My Company\My Program.lnk" "$INSTDIR\My Program.exe" \

  "some command line parameters" "$INSTDIR\My Program.exe" 2 SW_SHOWNORMAL \

  ALT|CTRL|SHIFT|F5 "a description"

WriteIniStr、WriteUninstaller、WriteRegStr


Section -AdditionalIcons

WriteIniStr "$INSTDIR\${PRODUCT_NAME}.url" "InternetShortcut" "URL" "${PRODUCT_WEB_SITE}"

CreateShortCut "$SMPROGRAMS\signjing安装示例\Website.lnk" "$INSTDIR\${PRODUCT_NAME}.url"

CreateShortCut "$SMPROGRAMS\signjing安装示例\Uninstall.lnk" "$INSTDIR\uninst.exe"

SectionEnd



Section -Post

WriteUninstaller "$INSTDIR\uninst.exe"

WriteRegStr HKLM "${PRODUCT_DIR_REGKEY}" "" "$INSTDIR\Bin\GenPat.exe"

......

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

SectionEnd

WriteINIStr
INI文件区段项值把“项” =“值”写入“INI文件”的“区段名”区段。如果 INI文件不能写入则放置一个错误的标记。



WriteINIStr $TEMP\something.ini section1 something 123

WriteINIStr $TEMP\something.ini section1 somethingelse 1234

WriteINIStr $TEMP\something.ini section2 nsis true

WriteUninstaller
[路径\]可执行文件名.exe

由指定的文件名(路径为可选项)写入卸载程序。仅在一个安装区段或函数里有效,并且你的脚本里必须有一个卸载区段。也可以参考卸载配置。你可以调用一次或多次来写入一个或多个卸载程序(副本)。

WriteUninstaller $INSTDIR\uninstaller.exe

WriteRegStr
根键子键项值把字串写入注册表。详细信息请查看 WriteRegExpandStr。

WriteRegStr HKLM "Software\My Company\My Software" "String Value" "dead beef"

函数、Function、HideWindow、MessageBox、Abort、FunctionEnd、Delete、RMDir、DeleteRegKey、SetAutoClose


Function un.onUninstSuccess

HideWindow

MessageBox MB_ICONINFORMATION|MB_OK "$(^Name) 已成功地从你的计算机移除。"

FunctionEnd



Function un.onInit

MessageBox MB_ICONQUESTION|MB_YESNO|MB_DEFBUTTON2 "你确实要完全移除 $(^Name),其及所有的组件?" IDYES +2

Abort

FunctionEnd



Section Uninstall

Delete "$INSTDIR\${PRODUCT_NAME}.url"

Delete "$INSTDIR\uninst.exe"

……

Delete "$INSTDIR\Bin\GenPat.exe"



Delete "$SMPROGRAMS\signjing安装示例\Uninstall.lnk"

……

Delete "$SMPROGRAMS\signjing安装示例\signjing安装示例.lnk"



RMDir "$SMPROGRAMS\signjing安装示例"

……

RMDir "$INSTDIR"



DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} "${PRODUCT_UNINST_KEY}"

DeleteRegKey HKLM "${PRODUCT_DIR_REGKEY}"

SetAutoClose true

SectionEnd

函数
函数类似于区段因为他们可以包含零个或多个指令。用户函数不会被安装程序直接调用,而必须在区段里使用 Call指令来调用。而当一个必然事件发生时回调函数将由安装程序调用。

函数必须在区段或其他函数之外声明。

Function
[函数名]

开始并打开一个新的函数。一般函数名以 .开头的(例如 ".Whatever")作为回调函数保留。函数名以 un.开头的函数将会被创建在卸载程序里。因此,普通安装区段和函数不能调用卸载函数,而卸载区段和卸载函数也不能调用普通安装程序的函数。



Function func

  # 一些命令

FunctionEnd



Section

  Call func

SectionEnd

FunctionEnd
该命令关闭当前打开的函数。

HideWindow
隐藏安装程序。

MessageBox
消息框选项列表消息框文本 [/SD返回] [检测返回值跳转到标记] [检测返回值2跳转到标记2]

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



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

“检测返回值”可以为 0(或空,或保留关闭),或下列之一:



IDABORT - 退出按钮

IDCANCEL - 取消按钮

IDIGNORE - 忽略按钮

IDNO - 否按钮

IDOK - OK 按钮

IDRETRY - 重试按钮

IDYES - 是按钮

如果消息框的返回值为“检测返回值”,则安装程序执行跳转。



用 /SD 来指定一个上面列出的返回值当在安装程序静默安装时作为返回值。详细信息请查看 section 4.12。



MessageBox MB_OK "简单消息框"

MessageBox MB_YESNO "真的吗?" IDYES true IDNO false

true:

  DetailPrint "是真的!"

  Goto next

false:

  DetailPrint "是假的"

next:

MessageBox MB_YESNO "真的吗?(静默安装时默认为是)" /SD IDYES IDNO false2

  DetailPrint "是真的 (或静默)!"

  Goto next2

false2:

  DetailPrint "是假的"

next2:

Abort
[用户信息]取消安装,停止执行脚本,并且在状态显示里显示用户信息。注意:你可以用于回调函数来实现一些特殊功能。页面回调也可以用 Abort 来实现特殊目的。

Abort

Abort "不能安装"

Delete
[/REBOOTOK] 文件从目标系统删除文件(可以是文件或通配符,但必须指定一个完整的路径)。如果指定了 /REBOOTOK并且该文件当前不可删除,则会在系统重启时删除该文件 -- 如果该文件要在系统重启时删除,你还要设置一个重启的标记。如果找到的文件不能被删除则会置一个错误标记。但该错误标记不是为尝试删除一个不存在的文件设置的。

RMDir
[/r] [/REBOOTOK]目录名删除指定的目录(完整路径)。没有 /r参数时只有在目录为空时才会被删除。如果指定了 /r,则目录会被递归删除,所以在指定目录下的所有文件和目录均被删除。如果指定了 /REBOOTOK,任何当前不能删除的文件或目录将会在重启后被删除——如果文件或目录需要在重启时被删除,会放置一个重启的标记。当文件或目录不能被删除时放置一个错误的标记。



RMDir $INSTDIR

RMDir $INSTDIR\data

RMDir /r /REBOOTOK $INSTIDR

RMDir /REBOOTOK $INSTDIR\DLLs

需要注意的是当前的工作目录不能删除。当前的工作目录由 SetOutPath设定。例如,下面的例子里将不能删除该目录。



SetOutPath $TEMP\dir

RMDir $TEMP\dir

而下面的例子可以删除该目录。



SetOutPath $TEMP\dir

SetOutPath $TEMP

RMDir $TEMP\dir

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



DeleteRegKey HKLM "Software\My Company\My Software"

DeleteRegKey /ifempty HKLM "Software\A key that might have subkeys"

SetAutoClose
true|false

取代默认的窗口自动关闭标记(由 AutoCloseWindow指定,且对于写在程序为 false)。指定 true将使得安装程序在安装完成时立即关闭窗口,或者 false 来使它需要手动关闭。



一个向导默认生成的脚本便包含了这么多的语法,当然nsis的语法远不止这些。这并没有什么大不了了,随着对语法和nsis的了解和掌握,随着地编写脚本进行实践,这些语法、插件等资源都将为你服务。
————————————————
版权声明:本文为CSDN博主「signjing」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/signjing/article/details/7944160

回复 支持 反对

使用道具 举报

1272

主题

2067

帖子

7962

积分

认证用户组

Rank: 5Rank: 5

积分
7962
板凳
发表于 2020-4-6 19:38:48 | 只看该作者
手把手教NIS Edit安装向导的使用
需求的软件环境:

NSIS 2.46

HM NIS Edit 2.03



1 安装完上述两款软件后启动HM NIS Edit,如图:



2 点击“文件”-“新建脚本:向导”,如图:



3 弹出向导欢迎界面,点击“下一步”:



4 可以自定义应用程序名称,版本,出版人,网站等信息,点击“下一步”:



5 安装程序语言取消选择“English”,选择“SimpChinese”,点击“下一步”:



6 设置授权文件的路径,点击“下一步”:



向导中默认的许可文件路径为“c:\path\to\licence\YourSoftwareLicence.txt”,但事实上这个路径并不存在,因此设置授权文件的路径,但要确保路径是存在的。为此,在C:\util\nsis_exam\目录下创建了协议许可.rtf文件。



此次是为了演示安装向导的使用,因此不必深究.rtf中文件的内容,只需创建它,用office word编辑它,随意保存些文本即可,如:



7 应用程序列表中有默认的两个文件,实际制作安装包时,这两个文件往往不是我们需求的文件:



选中它们,利用“删除文件”按钮将其移除:



然后点击“添加目录树”按钮:



弹出目录编辑界面,通过浏览文件夹按钮选择目录,如图目录为“C:\Program Files\NSIS”,点击“确定”按钮:



待文件全部加载到应用程序文件列表,如图,点击下一步:



8 确认下应用程序的图标信息,点击下一步:



9 可以指定安装程序完成时要执行的程序文件,点击“下一步”:



10 可以指定解除安装程序属性,然后点击“下一步”:



11 勾选“保存脚本”、“转换文件路径到相关路径”,点击“完成”:



12 提示保存脚本窗口,为脚本命名,如图为“signjing安装示例.nsi”,点击“保存”按钮:



13 脚本保存后自动回到编辑器主界面:



14 点击“NSIS”-“编译脚本”以编译脚本:



15 脚本开始编译,脚本编译时,可以通过日志窗格看到编译进程:



16 编译完成,在日志窗格会显示类似的信息:



17 在脚本的同目录下可以看到安装包Setup.exe已产生:





到此,利用安装向导制作的安装包就完成了,从认识NSIS到能做出安装包,这无疑是一个重大的改变,但我们的追求不能仅停留在这个层面,下一次将针对本次产生的脚本进行修改以实现一些安装包个性化的效果。
————————————————
版权声明:本文为CSDN博主「signjing」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/signjing/article/details/7855855

nsis安装包_向导脚本初级个性化


1运行nsis安装包_手把手教NIS Edit安装向导的使用中生成的安装包,效果如下:

运行安装包文件:



欢迎界面:



点击“下一步”后是接受许可协议页面:



点击“我接受”后是安装位置选择页面:



选择目标文件夹,点击“安装”后将进行安装,下面是安装进度页面:



安装进度条读满则安装完成,自动切换到完成页面:



在点击“完成”之前可以选择是否立即运行安装完成的软件。

开始菜单:





源脚本下载地址

http://download.csdn.net/detail/signjing/4526242



个性化脚本


1修改logo等图素

在源代码:

; MUI Settings

!define MUI_ABORTWARNING

!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"

!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"

下面添加:

!define MUI_WELCOMEFINISHPAGE_BITMAP "C:\util\nsis_uis\白玉山塔.bmp"



注释:

引号内为位图的路径,位图大小大约为169×257,而默认的NSIS该图的大小为164×314,从而产生一定比例的伸缩,因此最好采用164×314的尺寸。

效果:





修改源代码:

!define MUI_ICON "${NSISDIR}\Contrib\Graphics\Icons\modern-install.ico"

!define MUI_UNICON "${NSISDIR}\Contrib\Graphics\Icons\modern-uninstall.ico"

为:

!define MUI_ICON "C:\util\nsis_uis\smail.ico"

!define MUI_UNICON "C:\util\nsis_uis\ohmygod.ico"



注释:

源图标的效果无底色,而示例中的图标有底色。实际使用时应注意,尤其是商业目的的安装包更要注重细节。

效果:



开始菜单处的卸载图标:





2 安装包标题

接着上面的位置,添加如下代码:

!define MUI_WELCOMEPAGE_TITLE "\r\n   signjing安装示例向导"

注释:

\r\n为换行标志

效果:





3 软件介绍

接着上面的位置,在下面添加:

!define MUI_WELCOMEPAGE_TEXT "  signjing安装示例是signjing开发的一个NSIS安装示例软件。\r\n\r\n  软件作者:signjing \r\n\r\n  官方网址:http://blog.csdn.net/signjing\r\n\r\n  $_CLICK"

效果:





4 品牌文本

在源代码:

ShowInstDetails show

ShowUnInstDetails show

后添加:

BrandingText " signjing博客 http://blog.csdn.net/signjing"

效果:





5安装包名称

修改源代码

OutFile "Setup.exe"



OutFile "${PRODUCT_NAME}.exe"



OutFile "自定义.exe"

注释:

安装包的名称可以使用变量,也可以使用常量;

效果:







更多个性化,敬请期待...


————————————————
版权声明:本文为CSDN博主「signjing」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/signjing/article/details/7908808



回复 支持 反对

使用道具 举报

388

主题

602

帖子

2218

积分

金牌会员

Rank: 6Rank: 6

积分
2218
沙发
 楼主| 发表于 2015-9-14 17:53:51 | 只看该作者
页面
向导页面是 NSIS 安装程序中最重要的界面元素,在 nsi 脚本中可以使用 NSIS 内置页面或者定制界面,通过脚本可以指定页面的顺序、显示样子和行为。

!insertmacro MUI_PAGE_LICENSE "License.txt"
  !insertmacro MUI_PAGE_COMPONENTS
  !insertmacro MUI_PAGE_DIRECTORY
  !insertmacro MUI_PAGE_INSTFILES
  
  !insertmacro MUI_UNPAGE_CONFIRM
  !insertmacro MUI_UNPAGE_INSTFILES
  
  
  区段
  区段是对应某种安装/卸载选项的处理逻辑,该段代码仅当用户选择相应的选项才被执行。
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|firemail ( 粤ICP备15085507号-1 )

GMT+8, 2024-11-26 05:09 , Processed in 0.064676 second(s), 19 queries .

Powered by Discuz! X3

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表