NSIS学习笔记转.docx
《NSIS学习笔记转.docx》由会员分享,可在线阅读,更多相关《NSIS学习笔记转.docx(13页珍藏版)》请在冰豆网上搜索。
NSIS学习笔记转
MessageBoxMB_OK'$$0is"$0"';$0是某个值
${If}$0=='somevalue'
MessageBoxMB_OK'$$0issomevalue'
${ElseIf}$0=='someothervalue'
MessageBoxMB_OK'$$0issomeothervalue'
${Else}
MessageBoxMB_OK'$$0is"$0"'
${EndIf}
logiclib就是使用${IF}语句${while}循环
IntOp
用户变量输出
outfile"xunh.exe"
!
include"logiclib.nsh"
section
StrCpy$R10
${While}$R1<5
IntOp$R1$R1+1
DetailPrint$R1
${EndWhile}
sectionend
pagelicense;许可协议页面
pagecomponents;安装的组件
pagedirectory;安装的目录
pageinstfiles;选择的组件
uninstpageuninstconfirm;卸载确认页面
uninstpageinstfiles;卸载
使用在段里的指令和安装程序属性指令不一样,他们在用户电脑运行环境里执行。
这些指令可以解压文件读取和写入注册表、INI文件或普通文件,创建目录,创建快捷方式和更多功能。
你可以在指令找到更多。
更多的基本用法说明SetOutPath告诉安装程序要把文件输出到哪里,和要解压哪些文件。
回调函数就相当与一个调用函数,在安装程序一开始就调用而已
除了区段里的代码,还有一些在回调函数里的代码也会被执行,而且可能会在区段之前就执行了。
比如.onInit回调函数就最先被执行,或者在页面显示过程中执行某些页面回调函数。
outfile"xunh.exe"
!
include"logiclib.nsh"
section
StrCpy$R10
${While}$R1<5
IntOp$R1$R1+1
DetailPrint$R1
${EndWhile}
sectionend
.onInit
MessageBoxMB_YESNO"即将安装我的程序,要继续吗?
"IDYESgogogo
Abort
gogogo:
End
条件判断或执行代码循环可以使用StrCmp,IntCmp,IfErrors,Goto和其它来实现
使用MessageBoxes或DetailPrint来显示变量内容,对所有变量使用DumpState插件来勾画总体大纲。
定义符号可以通过!
define定义或使用/D命令行切换。
这些定义符号可以用于条件编译
(通过!
ifdef定义)或用于符号替换(一种格式简单的宏)。
若要用它的值替换一个符号,
请使用${符号}(如果没有定义符号,那么不会产生转换)。
这个转换为first-come-first-served,
一个插件的调用像这样:
DLL名:
:
函数名"参数1""参数2""参数3"
InstallOptions是一个受欢迎的插件,它允许你建立自定义的的页面,并与NSIS页面命令结合(看页面)。
开始菜单插件提供了一个可允许用户选择一个开始菜单目录的页面。
这里还有许多不同用途的大量插件,查看Docs目录里的帮助文件和例子。
你也可以在线查找另外的插件:
NSIS维客.
引号的作用是是可以包含‘”他们可以是单引号、双引号或向后的单引号。
$INSTDIR安装目录
$OUTDIR当前输出路径
$CMDLINE安装程序的命令行输入。
$LANGUAGE
下面这些都是常量
当前使用的语言标识符
$DESKTOP
Windows桌面目录(通常为C:
\Windows\Desktop但是运行时会检测)。
该常量的内容(所有用户或当前用户)取决于SetShellVarContext设置。
默认为当前用户。
$EXEDIR
安装程序运行时的位置。
(从技术上来说你可以修改此变量,但并不是一个好方法)。
$EXEFILE
安装程序的名称。
$EXEPATH
安装程序运行时的完整路径。
${NSISDIR}
包含NSIS安装目录的符号定义标记。
常用于在你想调用在NSIS目录下的资源时,例如:
图标、界面……
$SYSDIR
Windows系统目录(通常为C:
\Windows\System或C:
\WinNT\System32但在运行时会检测)。
$STARTMENU
开始菜单目录(常用于添加一个开始菜单项,使用CreateShortCut)。
该常量的内容(所有用户或当前用户)取决于SetShellVarContext设置。
默认为当前用户。
$SMPROGRAMS
开始菜单程序目录(当你想定位$STARTMENU\程序时可以使用它)。
该常量的内容(所有用户或当前用户)取决于SetShellVarContext设置。
默认为当前用户。
$SMSTARTUP
开始菜单程序/启动目录。
该常量的内容(所有用户或当前用户)取决于SetShellVarContext设置。
默认为当前用户。
$\r\n\t
要显示
必须使用下面的这个
$
转义,用来表示$。
$\r
用来表示一个回车(\r)。
$\n
用来表示新的一行(\n)。
$\t
用来表示一个Tab(\t)。
在引号里面加入"${sec2_id}的名称:
$\n$0" $\n表示新的一行,且不显示,去掉$将显示
每个内建的页面都有三个回调函数。
一个预置函数、一个显示创建函数和一个离开函数
一个自定义的页面仅有两个回调函数,一个是必须的创建页面,另一个离开函数的作用就和内建页面的离开函数一样。
Page
custom[创建函数][离开函数][标题][/ENABLECANCEL]
或
内置的页面类型[预置函数][显示函数][离开函数][/ENABLECANCEL]
要添加一个安装程序页面,请看上面关于相对于自定义页面的内建页面和关于回调函数的段。
内置的页面类型:
license-许可协议页面
components-组件选择页面
directory-安装目录选择页面
instfiles-安装执行页面
uninstConfirm-卸载确认页面
""引号好像在NSIS里面没有用
StrCpy$01
MessageBoxMB_OK'$0' 就显示1
StrCpy$01
MessageBoxMB_OK'$0is$0'1is1
学会了调试
看到了
一般函数名以.开头的(例如".Whatever")作为回调函数保留
也就是说:
以.开头的是回调函数
SendMessage
窗口句柄消息第一个消息参数第二个消息参数[用户变量(返回值)][/TIMEOUT=毫秒]
AddBrandingImage
(left|right|top|bottom)(宽|高)
AddBrandingImageleft0
AddBrandingImageright50
AddBrandingImagetop20
AddBrandingImagebottom35
AddBrandingImageleft1005
安装程序界面,默认为0
页面选项
下面的这个列表列出了某个页面类型受什么样的命令影响。
除非特别提及,否则这些命令都可以在PageEx区块内外使用。
如果在一个PageEx区块内部使用那么他们仅仅对由PageEx设置的当前页面产生影响,否则他们将被设为其他所有页面的默认值。
许可页面
LicenseText
LicenseData
LicenseForceSelection
组件选择页面
ComponentText
目录选择页面
DirText
DirVar-仅能在PageEx里使用。
DirVerify
卸载、安装记录页面
DetailsButtonText
CompletedText
卸载确认页面
DirVar-仅能在PageEx里使用。
UninstallText
要设置页面标题请使用Caption。
Icon
[路径\]图标文件.ico
设置安装程序的图标。
在图标文件里的每一个图标将会被包含在安装程序里
icon功能强大,输出的EXE文件图标和安装时用的图标都是它
例如它:
iconf:
\tub\LD.ico
$INSTDIR
安装目录
是安装变量
$PROGRAMFILES是安装常量
$language是变量,英语是1033
繁体中文是1028
简体中文是2052
WriteRegStr是写入注册表
解决了注册表的问题
WriteRegStrHKLM software\loadmasterversion"4.0"
writeregstrHKLM software\loadmasterpath"$INSTDIR"
$instdir是变量,路径,解决。
呵呵,又测试成功
InstallDir$programfiles\Loadmaster1
InstallDirRegKeyHKLMSoftware\loadmasterpath
InstallDirRegKey的作用是检测以前的安装路径
LoadLanguageFile
语言文件.nlf
载入语言文件
loadlanguagefile"D:
\ProgramFiles\NSIS\Contrib\Languagefiles\SimpChinese.nlf"
;loadlanguagefile "D:
\ProgramFiles\NSIS\Contrib\Languagefiles\English.nlf"
如果用;loadlanguagefileSimpChinese.nlf
loadlanguagefile English.nlf
不知道缺少了哪个头文件
$LANGUAGE
当前使用的语言标识符,是一个变量。
使用loadlanguagefile对于的语言ID将会被定义(例如:
${LANG_ENGLISH}将会被定义为1033)。
检测语言,然后显示许可功能已经完成
LicenseLangStringln${LANG_SIMPCHINESE}f:
\cnlicence.txt
LicenseLangStringln${LANG_ENGLISH}f:
\enlicence.txt
LicenseLangStringlicense${LANG_TRADCHINESE}f:
\tnlicence.txt
LicenseData$(ln)
Pop
用户变量(输出)
从堆栈里弹出一个字串到用户变量$x。
如果堆栈是空的,则会置一个错误标记。
Push1
Push2
Exch
Pop$0#=1
弹出1赋值给变量$0
学会了SWITCH语句
outfile"switch.exe"
!
include"LogicLib.nsh"
pageinstfiles
section
StrCpy$0"2"
${switch} $0
${Case}1
SetOutPath"$programfiles"
file"f:
\tub\pic.bmp"
${Break}
${Case} 2
SetOutPath"$programfiles"
file"f:
\tub\pic2.bmp"
${Break}
${EndSwitch}
问:
如何运行一个安装文件.reg
答:
注:
your.reg为文件名
ExecWait"regedit.exe/syour.reg"
问:
如何运行一个安装文件.inf
答:
注:
skins.inf为文件名
ExecWait"RunDll32advpack.dll,LaunchINFSectionskins.inf,DefaultInstall"
问:
如何运行一个安装文件.msi
答:
注:
soapsdk.msi为文件名
Execwait`msiexec/qn/i"soapsdk.msi"`
问:
关联文件图标后,图标没变化。
答:
刷新图标
'System:
:
Callshell32.dll:
:
SHChangeNotify(l,l,i,i)v(0x08000000,0,0,0)'
问:
安装窗体变窄了。
答:
SetFont/LANG=2052"tahoma"8
原问题见帖子
问:
如何运行一个批处理文件.bat
答:
注:
your.bat为文件名
ExecWait"your.bat"
不显示黑框框
nsExec:
:
Exec"your.bat"
sectionend
ReadRegDWORD
用户变量(输出)根键子键项
ReadRegStr
用户变量(输出)根键子键项
WriteRegBin
根键子键项值数据
该命令将会写一个区块的二进制数据到注册表
WriteRegStr
根键子键项值
把字串写入注册表
EnumRegKey
用户变量(输出)根键子键索引
与
ReadRegStr 相得益彰呵呵,一个读变量名,一个读里面的内容
ReadRegStr
用户变量(输出)根键子键项
ClearErrors
清除错误位标记。
ExecShell"open""空了一格都运行错误
${NSD_CreateText}013u100%12u最后一个为高度
FindWindow
用户变量(窗口句柄输出)窗口类名[窗口标题][父窗口句柄][childafter]
GetDlgItem
用户变量(输出)窗口句柄控件ID
Section-AdditionalIcons
${switch}$language
${Case}${LANG_ENGLISH}
; WriteIniStr"$INSTDIR\${PRODUCT_NAME}.url""InternetShortcut""URL""${PRODUCT_WEB_SITE}"
CreateDirectory"$SMPROGRAMS\LoadMaster"
CreateShortCut"$SMPROGRAMS\LoadMaster\Website.lnk""$INSTDIR\${PRODUCT_NAME}.url"
CreateShortCut"$SMPROGRAMS\LoadMaster\Uninstall.lnk""$INSTDIR\uninst.exe"
${Break}
${Case}${SIMPCHINESE}
;WriteIniStr"$INSTDIR\${PRODUCT_NAME}.url""InternetShortcut""URL""${PRODUCT_WEB_SITE}"
CreateDirectory"$SMPROGRAMS\装箱大师企业版"
CreateShortCut"$SMPROGRAMS\装箱大师企业版\装箱大师官方网站.lnk""$INSTDIR\${PRODUCT_NAME}.url"
CreateShortCut"$SMPROGRAMS\装箱大师企业版\装箱大师企业版卸载.lnk""$INSTDIR\uninst.exe"
CreateShortCut"$SMPROGRAMS\装箱大师企业版\装箱大师企业版帮助文档.lnk""$INSTDIR\Manual.chm"
${Break}
${Case}1028
CreateDirectory"$SMPROGRAMS\裝箱大師企業版"
CreateShortCut"$SMPROGRAMS\裝箱大師企業版\裝箱大師官方網站.lnk""$INSTDIR\${PRODUCT_NAME}.url"
CreateShortCut"$SMPROGRAMS\裝箱大師企業版\裝箱大師企業版卸載.lnk""$INSTDIR\uninst.exe"
CreateShortCut"$SMPROGRAMS\裝箱大師企業版\裝箱大師企業版幫助文檔.lnk""$INSTDIR\Manual.chm"
${Break}
${EndSwitch}
SectionEnd
InstallDir$programfiles\LoadMaster
InstallDirRegKeyHKLMSoftware\loadmasterpath
检测安装程序以前的路径,如果有,则安装在以前的目录下
SectionIn如果指定RO作为一个参数,则该区段将被设为只读区段,
SetBrandingImage
[/IMGID=对话里的ID项][/RESIZETOFIT]位图.bmp
如果指定了/RESIZETOFIT则图像会自动改变尺寸到图像控件的大小。
PagelicenselicenseImage
licenseImage
PAGE还可以这样用
delete$SMPROGRAMS\LoadMaster
删除不了,下面的这个可以
RMDir"$SMPROGRAMS\LoadMaster"
SetAutoClosetrue自动关闭界面,
如自动关闭卸载界面
在sectionunistall
delete....
setautoclose
sentionend
/nounload的作用
当插件命令执行时NSIS将会解压所需的插件DLL文件到一个临时目录($PLUGINSDIR),把指定的参数全部压入(从右到左次序),然后执行DLL函数。
如果指定了/NOUNLOAD选项则插件将不会卸载直到安装程序退出或下一次你使用该插件并不带/NOUNLOAD参数。
需要注意的是最后一次调用该插件的时候必须不能有/NOUNLOAD否则插件将不能从$PLUGINSDIR里删除,而导致垃圾文件留在用户的机器里。
查看安装程序内部的语言在
D:
\ProgramFiles\NSIS\Contrib\Languagefiles\simpchinese.nsh文件夹
v2.0.1.0
怎样去掉V
其实把它当作一个字符串,从第一个往后赋给一个新的变量
StrCpy$R0$0""1
intop$8$r0-2
System:
:
Call"Kernel32:
:
GetSystemDefaultLangID(v..)i.s"
Pop$3
检测系统语言,用到上面这个DLL。
system是DLL,CALL是函数
Push$0
Push$1
messageboxMB_OK"$language"
System:
:
Call"mscoree:
:
GetCORVersion(w.r0,i${NSIS_MAX_STRLEN},*i)i.r1?
u"
${if}$language=2052
StrCmp$0""0+4
MessageboxMB_OK"安装程序检测到您计算机上没有安装.Network2.0,您必须先安装.Network2.0或以上版本,才能安装运行本软件!
"
ExecShell"open""
abort
${endif}
检测.net用到上面这个函数$0就是版本号,返回值
还可以用下面的方法,检测微软.net安装路径的注册表里面。
读取索引号,读取里面的值
在HKLM\software\microsoft\networksetup下面
WriteINIStr
INI文件区段项值
WriteIniStr"$INSTDIR\${PRODUCT_NAME}.url""InternetShortcut""URL""${PRODUCT_WEB_SITE}"
RMDir
[/r][/REBOOTOK]目录名
删除指定的目录(完整路径)。
没有/r参数时只有在目录为空时才会被删除
RMDir "$desktop\裝箱大師企業版4.0.lnk" 竟然删不掉
该为delete就可
我的理解是rmdir删除的是目录
delete删除的是完整路径
RMDir/r "$INSTDIR\Media\*.*"
$instdir就是c:
\programs\loadmaster4.0
插入宏,有三种选择
1.在
D:
\ProgramFiles\NSIS\Contrib\ModernUI\system.nsh
2.!
include"MUI.nsh"其实就是上面这种选择
3.在
!
include"MUI2.nsh"
SMSTARTUP
开始菜单程序/启动目录。
该常量的内容(所有用户或当前用户)取决于SetShellVarContext设置。
默认为当前用户。
$QUICKLAUNCH
在IE4活动桌面及以上的快速启动目录。
如果快速启动不可用,仅仅返回和$TEMP一样。
!
ifdefFULL
!
definePRODUCT_NAME`迅雷Ayu去广告版`
!
defineEXEFN`迅雷_${PRODUCT_VERSION}_Full.exe`
!
else
!
definePRODUCT_NAME`迅雷Ayu去广告精简版`
!
defineEXEFN`迅雷_${PRODUCT_VERSION}_Lite.exe`
!
endif
${if}$1==""
DetailPrint'$(Associatedfiletypes)*.${ext}$(For)"${desc}"...'
WriteRegStrHKCR"Back.${Project}\.${ext}""""_Blank_"
${Else}
DetailPrint'$(Modifyfiletypes)*.${ext}$(For)"${desc}"...'
${EndIf}
If|Unless..{ElseIf|ElseUnless}..