NSIS脚本学习:NSIS编译程序中默认的变量与常量

一、变量

NSIS脚本使用var关键字定义变量,使用StrCpy命令为变量赋值,下面是一个使用变量的例子

var myVariable
Function .onInit
  StrCpy $myVariable "MyVariable"
  MessageBox MB_OK $myVariable
FunctionEnd

NSIS脚本中所有的变量都是全局变量,也可以用“/GLOBAL”显式指定变量为全局变量(在callback、Section内声明时则必须用GLOBAL显式指定)

var /GLOBAL myVariable

NSIS脚本中的变量名可以由数字(0-9)、字母(a-z、A-Z)和下划线(_)构成,变量名的长度最多为1024个字符

在NSIS脚本中,有20个预置的变量:

$0,$1,$2,$3,$4,$5,$6,$7,$8,$9,$R0,$R1,$R2,$R3,$R4,$R5,$R6,$R7,$R8,$R9

这些变量和你自己写的变量用法是一样的,但通常用于共享的方法和宏中。这些变量不需要专门去声明,建议使用栈(stack)来存放这些变量的值。这些变量也可被用于插件(plug-in)间的通信,因为它们可被插件DLL文件读写。

另外还有四个变量:

1、$INSTDIR:安装目录

可以用StrCpy、ReadRegStr、ReadINIStr等函数赋值,也可用下面的方法赋值

InstallDir "E:\NSIS_Test\Output"

2、$OUTDIR:当前的输出目录

可以用StrCpy、ReadRegStr、ReadINIStr等函数赋值,也可用下面的方法赋值

SetOutPath "E:\NSIS_Test\Output"

3、$CMDLINE:进入安装包的命令行

如NSIS脚本执行完毕后生成的安装包名为Galatea.exe,在命令行中输入“Galatea.exe -1 -2 -3”打开安装包,则变量$CMDLINE的值就会被赋为“Galatea.exe -1 -2 -3”

4、$LANGUAGE:当前使用的语言

可以在.onInit回调中指定语言,如英语(美国)是1033,简体中文是2052

Windows的语言代码可以查阅MSDN上相关文档:

Regional and language settings (Windows SharePoint Services 2.0)

https://technet.microsoft.com/en-us/library/cc287874%28v=office.12%29.aspx

二、常量

NSIS脚本中有大量系统预定义好的常量可以使用。不过需要注意的是,常量有它的使用范围,一些新加入的常量并不是每个操作系统都能适用。如$CDBURN_AREA只能作用于WinXP及以上版本的Windows操作系统。

1、$PROGRAMFILES、$PROGRAMFILES32、$PROGRAMFILES64 - ProgramFiles目录地址

在安装包运行时动态确定,在Windows(x64)系统中,$PROGRAMFILES会指向“C:\Program Files (x86)”,$PROGRAMFILES64会指向“C:\Program Files”。

我的电脑是32位的Win7操作系统,因此在我的电脑上程序运行时这三个常量的值都为:C:\Program Files

2、$COMMONFILES、$COMMONFILES32、$COMMONFILES64 - CommonFiles目录地址

该目录一般都在ProgramFiles目录下,这个地址的路径会在安装包运行时动态确定,因为前半部分有ProgramFiles目录,所以根据x86、x64系统的不同也被分为了三个常量。

我的电脑上程序运行时这三个常量的值都为:C:\Program Files\Common Files

3、$DESKTOP - Windows桌面地址

这个常量的上下文依赖于SetShellVarContext命令的设置,默认值为当前用户(即程序安装到当前用户的桌面上)。

我的电脑上用Tsybius用户登录时,这个常量的值为:C:\Users\Tsybius\Desktop

4、$EXEDIR、$EXEFILE、$EXEPATH - 安装包的路径、文件名

$EXEDIR是安装包所在的目录,如E:\NSIS_Test;$EXEFILE是安装程序文件名,如Galatea.exe;$EXEPATH是前两和拼合到一起的安装文件全路径,如E:\NSIS_Test\Galatea.exe

5、${NSISDIR} - NSIS程序的安装目录地址

如需使用NSIS目录下的图标等资源时会用到,我的电脑上此值为:D:\NSIS

6、$WINDIR - Windows目录地址

该地址在安装程序运行时确定,我电脑上此值为:C:\Windows

7、$SYSDIR - Windows下system目录地址

该地址在安装程序运行时确定,我电脑上此值为:C:\Windows\system32

8、$TEMP - 系统临时目录地址

该地址在安装程序运行时确定,我电脑上此值为:C:\Users\Tsybius\AppData\Local\Temp

9、$STARTMENU - 开始菜单地址

该地址在安装程序运行时确定,默认使用当前用户的开始菜单地址。

我的电脑上用Tsybius用户登录时,这个常量的值为:C:\Users\Tsybius\AppData\Roaming\Microsoft\Windows\Start Menu

10、$SMPROGRAMS - 开始菜单下Programs地址

该地址在安装程序运行时确定,默认使用当前用户的开始菜单地址。

我的电脑上用Tsybius用户登录时,这个常量的值为:C:\Users\Tsybius\AppData\Roaming\Microsoft\Windows\Start Menu\Programs

11、$QUICKLAUNCH - 快速启动栏

适用于IE4和以上版本的IE浏览器,如果QuickLaunch功能被禁用了,则返回$TEMP的值。

我电脑上此值为:C:\Users\Tsybius\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch

12、$DOCUMENTS - “我的文档”目录地址

这个常量对未安装IE4的Windows95系统无效

我的电脑上用Tsybius用户登录时,这个常量的值为:C:\Users\Tsybius\Documents

13、$SENDTO - “发送到”目录地址

我的电脑上用Tsybius用户登录时,这个常量的值为:C:\Users\Tsybius\AppData\Roaming\Microsoft\Windows\SendTo

这是我电脑里的SendTo目录截图:

NSIS脚本学习:NSIS编译程序中默认的变量与常量_第1张图片

右键单击一个程序时,会有“发送到”菜单,里面的快捷方式就放在这里,如下图:

14、$RECENT - “最近使用的项目”目录地址

这个目录记录了最近使用的文档的快捷方式

NSIS脚本学习:NSIS编译程序中默认的变量与常量_第2张图片

我的电脑上用Tsybius用户登录时,这个常量的值为:C:\Users\Tsybius\AppData\Roaming\Microsoft\Windows\Recent

15、$FAVORITES - IE浏览器“收藏夹”目录地址

这个常量对未安装IE4的Windows95系统无效

我的电脑上用Tsybius用户登录时,这个常量的值为:C:\Users\Tsybius\Favorites

16、$MUSIC - “我的音乐”目录地址

这个常量对Windows XP、ME及以上版本有效

我的电脑上用Tsybius用户登录时,这个常量的值为:C:\Users\Tsybius\Music

17、$PICTURES - “我的图片”目录地址

这个常量对Windows 2000、XP、ME及以上版本有效

我的电脑上用Tsybius用户登录时,这个常量的值为:C:\Users\Tsybius\Pictures

18、$VIDEOS - “我的视频”目录地址

这个常量对Windows XP、ME及以上版本有效

我的电脑上用Tsybius用户登录时,这个常量的值为:C:\Users\Tsybius\Videos

19、$NETHOOD - “网络位置”目录地址

这个常量对未安装IE4的Windows95系统或未安装活动桌面的Windows系统无效

这个目录下的文件可在“我的电脑”中的“网络位置”栏目下看到。

我的电脑上用Tsybius用户登录时,这个常量的值为:C:\Users\Tsybius\AppData\Roaming\Microsoft\Windows\Network Shortcuts

NSIS脚本学习:NSIS编译程序中默认的变量与常量_第3张图片

20、$FONTS - “字体”目录地址

存放了电脑上安装的所有字体

我的电脑上此常量的值为:C:\Windows\Fonts

21、$TEMPLATES - “模板”目录地址

我的电脑上用Tsybius用户登录时,这个常量的值为:C:\Users\Tsybius\AppData\Roaming\Microsoft\Windows\Templates

22、$APPDATA - AppData下的Roaming目录地址

AppData目录一般用于存放软件的配置和临时文件

这个常量对未安装IE4的Windows95系统或未安装活动桌面的Windows系统无效

我的电脑上用Tsybius用户登录时,这个常量的值为:C:\Users\Tsybius\AppData\Roaming

23、$LOCALAPPDATA - AppData下的Local目录地址

这个常量对Windows 2000及以上版本有效

我的电脑上用Tsybius用户登录时,这个常量的值为:C:\Users\Tsybius\AppData\Local

24、$PRINTHOOD - 打印相关目录地址

这个常量对Windows 95、98无效

我的电脑上用Tsybius用户登录时,这个常量的值为:C:\Users\Tsybius\AppData\Roaming\Microsoft\Windows\Printer Shortcuts

25、$INTERNET_CACHE - “互联网缓存”目录地址

这个常量对Windows 95、未安装活动桌面和IE4的Windows NT系统无效

我的电脑上用Tsybius用户登录时,这个常量的值为:C:\Users\Tsybius\AppData\Local\Microsoft\Windows\Temporary Internet Files

26、$COOKIES - Cookies目录地址

这个常量对Windows 95、未安装活动桌面和IE4的Windows NT系统无效

我的电脑上用Tsybius用户登录时,这个常量的值为:C:\Users\Tsybius\AppData\Roaming\Microsoft\Windows\Cookies

27、$HISTORY - “网页浏览历史”目录地址

这个常量对Windows 95、未安装活动桌面和IE4的Windows NT系统无效

我的电脑上用Tsybius用户登录时,这个常量的值为:C:\Users\Tsybius\AppData\Local\Microsoft\Windows\History

NSIS脚本学习:NSIS编译程序中默认的变量与常量_第4张图片

28、$PROFILE - “用户”目录地址

这个常量对Windows 2000及以上版本有效

我的电脑上用Tsybius用户登录时,这个常量的值为:C:\Users\Tsybius

29、$ADMINTOOLS - “开始菜单→程序→管理工具”目录地址

这个常量对Windows 2000、ME及以上版本有效

我的电脑上用Tsybius用户登录时,这个常量的值为:C:\Users\Tsybius\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Administrative Tools

30、$RESOURCES - Windows下resources目录地址

这个常量对Windows XP及以上版本有效

我的电脑上此常量的值为:C:\Windows\Resources

31、$RESOURCES_LOCALIZED - Windows下本地resources目录地址

这个常量对Windows XP及以上版本有效

我的电脑上此常量的值为:C:\Windows\resources\0804

32、$CDBURN_AREA - “临时刻录文件夹”目录地址

这个常量对Windows XP及以上版本有效

该目录存储待刻录的文件。

我的电脑上用Tsybius用户登录时,这个常量的值为:C:\Users\Tsybius\AppData\Local\Microsoft\Windows\Burn\Burn

33、$HWNDPARENT - 父窗体的HWND

如我的电脑上一次运行安装包时此常量的值为:592430

34、$PLUGINSDIR

第一次调用InitPluginsDir或使用插件生成的临时目录的地址,这个目录会在安装程序运行结束时自动删除。

三、示例程序

下面这段代码是一个示例NSIS脚本的代码:

!define DEBUG_PATH "E:\NSIS_Test\TmpProgram"
!define OUTPUT_PATH "E:\NSIS_Test\Output"
!define INSTALL_PATH "E:\NSIS_Test\Output"

Name "NSIS_VariableConstants_Test"
Caption "NSIS_VariableConstants_Test"

InstallDir ${INSTALL_PATH}

OutFile "Galatea.exe"
Section "My Program"

  SetOutPath ${OUTPUT_PATH}
  File /r "${DEBUG_PATH}\*.*"

  DetailPrint ""
  DetailPrint "---- Writable Variables (START) ----"
  DetailPrint "$$INSTDIR $INSTDIR"
  DetailPrint "$$OUTDIR $OUTDIR"
  DetailPrint "$$CMDLINE $CMDLINE"
  DetailPrint "$$LANGUAGE $LANGUAGE"
  DetailPrint "---- Writable Variables (FINISH) ----"
  DetailPrint ""
  DetailPrint "---- Constants (START) ----"
  DetailPrint "$$PROGRAMFILES $PROGRAMFILES"
  DetailPrint "$$PROGRAMFILES32 $PROGRAMFILES32"
  DetailPrint "$$PROGRAMFILES64 $PROGRAMFILES64"
  DetailPrint "$$COMMONFILES $COMMONFILES"
  DetailPrint "$$COMMONFILES32 $COMMONFILES32"
  DetailPrint "$$COMMONFILES64 $COMMONFILES64"
  DetailPrint "$$DESKTOP $DESKTOP"
  DetailPrint "$$EXEDIR $EXEDIR"
  DetailPrint "$$EXEFILE $EXEFILE"
  DetailPrint "$$EXEPATH $EXEPATH"
  DetailPrint "$$ {NSISDIR} ${NSISDIR}"
  DetailPrint "$$WINDIR $WINDIR"
  DetailPrint "$$SYSDIR $SYSDIR"
  DetailPrint "$$TEMP $TEMP"
  DetailPrint "$$STARTMENU $STARTMENU"
  DetailPrint "$$SMPROGRAMS $SMPROGRAMS"
  DetailPrint "$$QUICKLAUNCH $QUICKLAUNCH"
  DetailPrint "$$DOCUMENTS $DOCUMENTS"
  DetailPrint "$$SENDTO $SENDTO"
  DetailPrint "$$RECENT $RECENT"
  DetailPrint "$$FAVORITES $FAVORITES"
  DetailPrint "$$MUSIC $MUSIC"
  DetailPrint "$$PICTURES $PICTURES"
  DetailPrint "$$VIDEOS $VIDEOS"
  DetailPrint "$$NETHOOD $NETHOOD"
  DetailPrint "$$FONTS $FONTS"
  DetailPrint "$$TEMPLATES $TEMPLATES"
  DetailPrint "$$APPDATA $APPDATA"
  DetailPrint "$$LOCALAPPDATA $LOCALAPPDATA"
  DetailPrint "$$PRINTHOOD $PRINTHOOD"
  DetailPrint "$$INTERNET_CACHE $INTERNET_CACHE"
  DetailPrint "$$COOKIES $COOKIES"
  DetailPrint "$$HISTORY $HISTORY"
  DetailPrint "$$PROFILE $PROFILE"
  DetailPrint "$$ADMINTOOLS $ADMINTOOLS"
  DetailPrint "$$RESOURCES $RESOURCES"
  DetailPrint "$$RESOURCES_LOCALIZED $RESOURCES_LOCALIZED"
  DetailPrint "$$CDBURN_AREA $CDBURN_AREA"
  DetailPrint "$$HWNDPARENT $HWNDPARENT"
  DetailPrint "$$PLUGINSDIR $PLUGINSDIR"
  DetailPrint "---- Constants (FINISH) ----"
  DetailPrint ""
  
SectionEnd

编译后程序运行时打印的安装详细信息如下:

NSIS脚本学习:NSIS编译程序中默认的变量与常量_第5张图片

打印出的内容如下:

Output folder: E:\NSIS_Test\Output
Extract: MyProgram.exe
Extract: ReadMe.txt
Output folder: E:\NSIS_Test\Output

---- Writable Variables (START) ----
$INSTDIR E:\NSIS_Test\Output
$OUTDIR E:\NSIS_Test\Output
$CMDLINE "E:\NSIS_Test\Galatea.exe"
$LANGUAGE 1033
---- Writable Variables (FINISH) ----

---- Constants (START) ----
$PROGRAMFILES C:\Program Files
$PROGRAMFILES32 C:\Program Files
$PROGRAMFILES64 C:\Program Files
$COMMONFILES C:\Program Files\Common Files
$COMMONFILES32 C:\Program Files\Common Files
$COMMONFILES64 C:\Program Files\Common Files
$DESKTOP C:\Users\Tsybius\Desktop
$EXEDIR E:\NSIS_Test
$EXEFILE Galatea.exe
$EXEPATH E:\NSIS_Test\Galatea.exe
$ {NSISDIR} D:\NSIS
$WINDIR C:\Windows
$SYSDIR C:\Windows\system32
$TEMP C:\Users\Tsybius\AppData\Local\Temp
$STARTMENU C:\Users\Tsybius\AppData\Roaming\Microsoft\Windows\Start Menu
$SMPROGRAMS C:\Users\Tsybius\AppData\Roaming\Microsoft\Windows\Start Menu\Programs
$QUICKLAUNCH C:\Users\Tsybius\AppData\Roaming\Microsoft\Internet Explorer\Quick Launch
$DOCUMENTS C:\Users\Tsybius\Documents
$SENDTO C:\Users\Tsybius\AppData\Roaming\Microsoft\Windows\SendTo
$RECENT C:\Users\Tsybius\AppData\Roaming\Microsoft\Windows\Recent
$FAVORITES C:\Users\Tsybius\Favorites
$MUSIC C:\Users\Tsybius\Music
$PICTURES C:\Users\Tsybius\Pictures
$VIDEOS C:\Users\Tsybius\Videos
$NETHOOD C:\Users\Tsybius\AppData\Roaming\Microsoft\Windows\Network Shortcuts
$FONTS C:\Windows\Fonts
$TEMPLATES C:\Users\Tsybius\AppData\Roaming\Microsoft\Windows\Templates
$APPDATA C:\Users\Tsybius\AppData\Roaming
$LOCALAPPDATA C:\Users\Tsybius\AppData\Local
$PRINTHOOD C:\Users\Tsybius\AppData\Roaming\Microsoft\Windows\Printer Shortcuts
$INTERNET_CACHE C:\Users\Tsybius\AppData\Local\Microsoft\Windows\Temporary Internet Files
$COOKIES C:\Users\Tsybius\AppData\Roaming\Microsoft\Windows\Cookies
$HISTORY C:\Users\Tsybius\AppData\Local\Microsoft\Windows\History
$PROFILE C:\Users\Tsybius
$ADMINTOOLS C:\Users\Tsybius\AppData\Roaming\Microsoft\Windows\Start Menu\Programs\Administrative Tools
$RESOURCES C:\Windows\resources
$RESOURCES_LOCALIZED C:\Windows\resources\0804
$CDBURN_AREA C:\Users\Tsybius\AppData\Local\Microsoft\Windows\Burn\Burn
$HWNDPARENT 657012
$PLUGINSDIR 
---- Constants (FINISH) ----

Completed

注:本文写作过程中参考了NSIS官方使用手册 NSIS.chm

END

你可能感兴趣的:(variable,constant,NSIS)