转自:
以下是代码及解析,其中有底色的部分为脚本内容。
; 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:///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:///signjing\r\n\r\n $_CLICK"
以 ; 或 #开始的行为注释行。可以在命令后面添加注释,也可以使用C规范的注释来注释一行或多行。如果参数需要由;或#开头,可以用双引号把它括起来。
如:
; 注释
# 注释
/*
注释
注释
*/
[/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 或使用特别版本。
常量通常用在 InstallDir属性里。
需要注意的是一些新的常量并不是在所有的 OS上都是正常的。例如 $CDBURN_AREA 仅在 Windows XP及以上系统中才正常。如果在 Windows 98 中使用将会得到空值。除非特别提示,否则该常量都是在所有 OS上有效的。
$PROGRAMFILES
$COMMONFILES
$DESKTOP
$EXEDIR
安装程序运行时的位置。(从技术上来说你可以修改改变量,但并不是一个好方法)。
${NSISDIR}
$WINDIR
$SYSDIR
$TEMP
$STARTMENU
$SMPROGRAMS
$SMSTARTUP
$QUICKLAUNCH
$DOCUMENTS
$SENDTO
$RECENT
$FAVORITES
$MUSIC
$PICTURES
$VIDEOS
$NETHOOD
$FONTS
$TEMPLATES
$APPDATA
$LOCALAPPDATA
$PRINTHOOD
$INTERNET_CACHE
$COOKIES
$HISTORY
$PROFILE
$ADMINTOOLS
$RESOURCES
$RESOURCES_LOCALIZED
$CDBURN_AREA
$HWNDPARENT
父窗口的十进制窗口句柄。
$PLUGINSDIR
字串里使用的常量
$$
转义,用来表示 $。
$\r
用来表示一个回车(\r)。
$\n
用来表示新的一行(\n)。
$\t
用来表示一个 Tab(\t)。
; 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:///signjing"
宏名称 [参数] [...]
插入一个由 !macro 创建的宏的内容。如果创建的宏带有参数,那么你必须按宏的需求向它传送足够的参数。
!macro Print text
DetailPrint "${text}"
!macroend
!insertmacro Print "some text"
!insertmacro Print "some more text"
名称 [双与名称]
设置安装程序的名称。名称通常用来显示产品的名称比如“我的程序””。如果在名称里有一个或多个与符号(&),把第二个参数设为与第一个相同,有 &的地方使用两个 &来表示。例如你的产品名称为“foo & bar2000”,那么使用:
Name "foo & bar2000" "foo && bar2000"
如果你的安装程序名称里有 & 符号并且对名称使用了一个 LangString,那么你还需要创建另一个含有双 &字符的名称作为第二个参数。
接受变量。如果使用了变量,使用的变量必须在 .onInit被初始化。
[路径\]安装程序.exe
指定 MakeNSIS 要写入安装程序的输出文件。仅仅是 MakeNSIS 要写入的文件,它不会对安装程序的内容有任何影响。
hide|show|nevershow
设置是否显示安装详细信息。你可以设为 hide来隐藏详细信息但用户可以查看,show 用来默认显示详细信息,nevershow可以阻止用户查看任何信息。注意区段里可以使用 SetDetailsView 来更改它的设置。
hide|show|nevershow
设置是否显示卸载详细信息。你可以设为 hide来隐藏详细信息但用户可以查看,show 用来默认显示详细信息,nevershow可以阻止用户查看任何信息。注意区段里可以使用 SetDetailsView 来更改它的设置。
/TRIM(LEFT|RIGHT|CENTER)文本设置显示在安装程序窗口底部的文本(默认为“Nullsoft Install System vX.XX”)。如果设为空字串("")则使用默认值;设为" "(一个空格)则显示空白。如果你不知道哪个适合你,那就保留默认值吧,这样可以使每个人知道你使用的 NSIS版本。使用 /TRIMLEFT、/TRIMRIGHT或 /TRIMCENTER 来裁剪控制大小到字串大小。
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
[/o] [([!]|[-])区段名] [区段索引输出]
开始并且打开一个新的区段。如果区段名为空、遗漏或者以一个 -开头,那么它将是一个隐藏的区段,用户也不能选择禁止它。如果一个区段名为“Uninstall”或以“un.”为前缀,那么它就是一个卸载程序区段。如果指定了区段索引输出,该参数将被定义 (!defined)为区段索引(然后可以对它使用 SectionSetText等)。如果区段名以一个 !开头,那么该区段的显示名称将以粗体字显示。如果指定了 /o 开关,则该区段默认为不选。
Section "-隐藏区段"
SectionEnd
Section # 隐藏区段
SectionEnd
Section "!描黑区段"
SectionEnd
Section /o "可选区段"
SectionEnd
Section "某些安装" SEC_IDX
SectionEnd
该命令关闭当前打开的区段。
输出路径设置输出路径($OUTDIR)且当路径不存在时创建(需要时会递归创建)。必须为全路径名,通常都使用 $INSTDIR。
SetOutPath $INSTDIR
File program.exe
on|off|try|ifnewer|ifdiff|lastused
该命令设置了由 File 命令使用的覆盖标记来决定目标文件已存在时是否覆盖。如果覆盖标记为 on ,则目标文件被覆盖(这个是默认值)。如果覆盖标记为 off ,则已存在的文件不会被覆盖。如果覆盖标记为 try ,文件仅当可以被覆盖时(就是说假如文件不能写入,它会自动略过而不需要用户决定)才会覆盖目标文件。如果覆盖标记为 ifnewer,则仅当已存在的文件比新文件旧时才会覆盖目标文件。如果覆盖标记为 ifdiff ,则仅当已存在的文件比新文件旧或新时才会覆盖目标文件。注意在ifnewer 或 ifdiff模式下,目标文件的日期都会被设为新文件的日期,而不管 SetDateSave 是怎么设置的。
SetOverwrite off
File program.cfg #配置文件将不会覆盖
SetOverwrite on
[/nonfatal] [/a] ([/r] [/x文件|通配符 [...]] (文件|通配符) [...] | /oname=输出路径\文件名输入路径\文件名)
释放文件到当前输出路径($OUTDIR)。
注意输出文件名是 $OUTDIR\文件名。
如果使用了 /oname=X 开关,则输出文件会变为 $OUTDIR\X。当使用了 /oname=开关时只能指定一个文件,且输出的文件名可以使用变量(或完整路径如 $SYSDIR\whatever.dll)。如果输出名称包含了空格,你需要用双引号把参数括起来,包括 /oname,就像下面例子显示的那样。
支持通配符。
如果使用了 /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 $INSTDIR\some\directory
快捷文件.lnk 目标文件 [参数 [图标文件 [图标索引号 [启动选项 [键盘快捷键 [描述]]]]]]
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"
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
INI文件区段项值把“项” =“值”写入“INI文件”的“区段名”区段。如果 INI文件不能写入则放置一个错误的标记。
WriteINIStr $TEMP\something.ini section1 something 123
WriteINIStr $TEMP\something.ini section1 somethingelse 1234
WriteINIStr $TEMP\something.ini section2 nsis true
[路径\]可执行文件名.exe
由指定的文件名(路径为可选项)写入卸载程序。仅在一个安装区段或函数里有效,并且你的脚本里必须有一个卸载区段。也可以参考卸载配置。你可以调用一次或多次来写入一个或多个卸载程序(副本)。
WriteUninstaller $INSTDIR\uninstaller.exe
根键子键项值把字串写入注册表。详细信息请查看 WriteRegExpandStr。
WriteRegStr HKLM "Software\My Company\My Software" "String Value" "dead beef"
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指令来调用。而当一个必然事件发生时回调函数将由安装程序调用。
函数必须在区段或其他函数之外声明。
[函数名]
开始并打开一个新的函数。一般函数名以 .开头的(例如 ".Whatever")作为回调函数保留。函数名以 un.开头的函数将会被创建在卸载程序里。因此,普通安装区段和函数不能调用卸载函数,而卸载区段和卸载函数也不能调用普通安装程序的函数。
Function func
# 一些命令
FunctionEnd
Section
Call func
SectionEnd
该命令关闭当前打开的函数。
隐藏安装程序。
消息框选项列表消息框文本 [/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 "不能安装"
[/REBOOTOK] 文件从目标系统删除文件(可以是文件或通配符,但必须指定一个完整的路径)。如果指定了 /REBOOTOK并且该文件当前不可删除,则会在系统重启时删除该文件 -- 如果该文件要在系统重启时删除,你还要设置一个重启的标记。如果找到的文件不能被删除则会置一个错误标记。但该错误标记不是为尝试删除一个不存在的文件设置的。
RMDir $INSTDIR
RMDir $INSTDIR\data
RMDir /r /REBOOTOK $INSTIDR
RMDir /REBOOTOK $INSTDIR\DLLs
SetOutPath $TEMP\dir
RMDir $TEMP\dir
SetOutPath $TEMP\dir
SetOutPath $TEMP
RMDir $TEMP\dir
[/ifempty] 根键子键删除一个注册表键。如果指定了 /ifempty,则该注册表键仅当它无子键时才会被删除(否则,整个注册表键将被删除)。有效的根键值在后面的 WriteRegStr列出。如果该键不能被删除(或如果它不存在)则会放置一个错误的标记。
DeleteRegKey HKLM "Software\My Company\My Software"
DeleteRegKey /ifempty HKLM "Software\A key that might have subkeys"
true|false
取代默认的窗口自动关闭标记(由 AutoCloseWindow指定,且对于写在程序为 false)。指定 true将使得安装程序在安装完成时立即关闭窗口,或者 false 来使它需要手动关闭。
一个向导默认生成的脚本便包含了这么多的语法,当然nsis的语法远不止这些。这并没有什么大不了了,随着对语法和nsis的了解和掌握,随着地编写脚本进行实践,这些语法、插件等资源都将为你服务。
因篇幅问题不能全部显示,请点此查看更多更全内容
Copyright © 2019- baoaiwan.cn 版权所有 赣ICP备2024042794号-3
违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com
本站由北京市万商天勤律师事务所王兴未律师提供法律服务