学习NSIS一段时间了,在这段时间里自己遇到了很多问题,也用自己摸索的方法一个个解决了,先将积累的知识点以及自己遇到的问题及解决方案,与大家共享下: 第一部分:页面设置 ; MUI 预定义常量 通用页面
向导页面头上的文字!define MUI_PAGE_HEADER_TEXT text
向导页面头上的文字想到(解释用)!define MUI_PAGE_HEADER_SUBTEXT text 欢迎页面
大标题设置!define MUI_WELCOMEPAGE_TITLE \安装向导\标题下子内容设置!define MUI_WELCOMEPAGE_TEXT \欢迎说明或软件说明等\授权页面
安装协议定义!insertmacro MUI_PAGE_LICENSE “文件” 显示在页面顶部的文字!define MUI_LICENSEPAGE_TEXT_TOP text 显示在页面底部的文字!define MUI_LICENSEPAGE_TEXT_BOTTOM text 按钮方式时按钮上的文字!define MUI_LICENSEPAGE_BUTTON button_text
用户需要钩选该 checkbox 来接受软件许可!define MUI_LICENSEPAGE_CHECKBOX 在 checkbox 旁显示的文字!define MUI_LICENSEPAGE_CHECKBOX_TEXT text
钩选radio box 接受或拒绝许可!define MUI_LICENSEPAGE_RADIOBUTTONS
radio旁接受文字!define MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_ACCEPT text radio旁拒绝文字!define MUI_LICENSEPAGE_RADIOBUTTONS_TEXT_DECLINE text 组件选择页面 顶部文字!define MUI_COMPONENTSPAGE_TEXT_TOP text 组件旁文字!define MUI_COMPONENTSPAGE_TEXT_COMPLIST text 下拉框旁文字!define MUI_COMPONENTSPAGE_TEXT_INSTTYPE text 描述框顶部文字!define MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_TITLE text
无组件描述框文字!define MUI_COMPONENTSPAGE_TEXT_DESCRIPTION_INFO text 安装目录页面 页面顶部文字!define MUI_DIRECTORYPAGE_TEXT_TOP text 路径选择框上文字!define MUI_DIRECTORYPAGE_TEXT_DESTINATION text 存放用户选择的目录的变量,默认是 $INSTDIR !define MUI_DIRECTORYPAGE_VARIABLE variable
不禁用\下一步\按钮!define MUI_DIRECTORYPAGE_VERIFYONLEAVE 安装进度页面
页面头上的文字!define MUI_INSTFILESPAGE_FINISHHEADER_TEXT text 进一步说明!define MUI_INSTFILESPAGE_FINISHHEADER_SUBTEXT text 完成页面 页面标题!define MUI_FINISHPAGE_TITLE title 页面标题区的额外空格!define MUI_FINISHPAGE_TITLE_3LINES 显示在完成页面上文字!define MUI_FINISHPAGE_TEXT text 使checkbox 时,设定文本区额外空间!define MUI_FINISHPAGE_TEXT_LARGE
完成按钮的显示文字!define MUI_FINISHPAGE_BUTTON text
重启操作系统 checkbox 旁的文字!define MUI_FINISHPAGE_TEXT_REBOOT text 显示在'Reboot now'旁的文字!define MUI_FINISHPAGE_TEXT_REBOOTLATER text 指定checkbox 选择运行的应用程序!define MUI_FINISHPAGE_RUN exe_file
程序 checkbox 旁的文字!define MUI_FINISHPAGE_RUN_TEXT text
运行应用程序的参数!define MUI_FINISHPAGE_RUN_PARAMETERS parameters 指定checkbox 为非选中状态!define MUI_FINISHPAGE_RUN_NOTCHECKED
安装完成执行的nsi函数!define MUI_FINISHPAGE_RUN_FUNCTION function_name checkbox 选择查看文件网站!define MUI_FINISHPAGE_SHOWREADME file/url 用户可及点击的超链上的文字!define MUI_FINISHPAGE_LINK link_text
超链上文字的颜色,默认为 000080!define MUI_FINISHPAGE_LINK_COLOR 第二部分问题及我的方法 1、组件选择部分问题 组件的显示:组件的显示是根据section 定义的顺序,显示的是section的标题,若选择为空,如section “” sec01,它将不会显示在组件选择中。若要实现必选只要在section内定义SectionIn RO即可。 2、安装路径的问题 需要用到两个内置变量$INSTDIR 若要改变安装路径,只需要将安装路径写到注册表中,下次便能方便得读取; 写入注册表:!define PRODUCT_UNINST_ROOT_KEY \
WriteRegStr HKLM \ersion\\Uninstall\\${PRODUCT_NAME}\\$INSTDIR ;写入注册表
InstallDirRegKey HKLM \ersion\\Uninstall\\${PRODUCT_NAME}\\ ;读取安装路径键值
若要允许安装在根目录下,需要指定:AllowRootDirInstall true
$INSTDIR指定了默认的安装路径,若安装路径呗修改,注册表将会记录修改后的路径,$INSTDIR的值也成为修改后的路径值。
若你需要在安装路径的末尾添加文件夹可用StrCpy $INSTDIR \文件夹名\
若用户所在文件夹中已经存在,如修改后会变成 D:\\111\\111,此时你若只需要一个111,你可以先判断是否存在111文件,判断方为修改后的安装路径名最后几个字符是否与文件名字符想同,相同就不添加文件夹,不相等就自动添加文件夹:
代码: WriteRegStr HKLM \ersion\\Uninstall\\${PRODUCT_NAME}\\$INSTDIR ;写入注册表
StrCpy $1 $INSTDIR \ ;截取最后11个字符
${IF} $1 != \ ;判断是否安装在”ni hao”文件中
StrCpy $INSTDIR \ ;不是,则自动创建文件 ${EndIf}
SetOutPath \ SetOverwrite ifnewer ;覆盖
3、后台执行文件 用nsExec::ExecToLog即可,后面直接加可执行文件 4、快捷方式的创建 添加到开始菜单 CreateDirectory \
CreateShortCut
\ CreateShortCut \卸载.lnk\\
创建桌面快捷方式 CreateShortCut \创建快速启动项 CreateShortCut \\
开机立即启动
CreateShortCut \\\5、自定义页面 很多人想要在完成页面添加多个运行程序,但是NSIS默认的只能添加一个,因此,一般我们都采用自定义页面实现,我也不例外。自定义页面需要编写.ini脚本文件 一般的格式为 [Settings]
NumFields=3 ;几个小版块 State=0
CancelEnabled=1 NextButtonText=完成
[Field 1] Type=label
Text=\文字版块,可以不添加。 Left=0 ;位置设定 Right=-1 Top=0 Bottom=20
HWND=4981706 ;窗口句柄指定,科以不指定 。。。
使用时,读取并判断checkbox多选框的状态,以执行响应的文件 ReadINIStr $0 \获取checkbox状态 ${If} $0 = 1
CreateShortCut \\\
${EndIf}
我在使用了自定义页面后,曾出现安装完成后出现”下一步”按钮,只有点击”下一步”后才能进入到完成页面。此时我的结局办法是添加语句:AutoCloseWindow true ;安装完毕自动关闭程序 6、安全卸载 NSIS的安装包中未定义安全卸载所需要的插件,一般可以下载插件,也可以下载官方提供的-log.zip文件,替换原安装文件,里边有三个文件。 我的下载地址:http://download.csdn.net/detail/cnmbitch/4154974
下载完成后,添加文件!include \
; 激活安装日志记录,该日志文件将会作为卸载文件的依据(注意,本区段必须放置在所有区段之前)
Section \ LogSet on SectionEnd
; 根据安装日志卸载文件的调用宏 !macro DelFileByLog LogFile ifFileExists `${LogFile}` 0 +4 Push `${LogFile}` Call un.DelFileByLog Delete `${LogFile}` !macroend
Section Uninstall ;!insertmacro MUI_STARTMENU_GETFOLDER \$ICONS_GROUP
Delete \
; 调用宏只根据安装日志卸载安装程序自己安装过的文件 !insertmacro DelFileByLog \ ; 清除安装程序创建的且在卸载时可能为空的子目录,对于递归添加的文件目录,请由最内层的子目录开始清除(注意,不要带 /r 参数,否则会失去 DelFileByLog 的意义) ;RMDir \
; 调用宏只根据安装日志卸载安装程序自己安装过的文件 !insertmacro DelFileByLog \
; 清除安装程序创建的且在卸载时可能为空的子目录,对于递归添加的文件目录,请由最内层的子目录开始清除(注意,不要带 /r 参数,否则会失去 DelFileByLog 的意义) 其他另外生成的可在此处删除,如登录软件后生成的
DeleteRegKey ${PRODUCT_UNINST_ROOT_KEY} \ SetAutoClose true SectionEnd
; 以下是卸载程序通过安装日志卸载文件的专用函数,请不要随意修改 Function un.DelFileByLog Exch $R0 Push $R1 Push $R2 Push $R3
FileOpen $R0 $R0 r ${Do}
FileRead $R0 $R1
${IfThen} $R1 == `` ${|} ${ExitDo} ${|} StrCpy $R1 $R1 -2 StrCpy $R2 $R1 11
StrCpy $R3 $R1 20
${If} $R2 == \ ${OrIf} $R2 == \
${OrIf} $R3 == \ ${OrIf} $R3 == \ Push $R1 Push `\
Call un.DelFileByLog.StrLoc Pop $R2
${If} $R2 != \
IntOp $R2 $R2 + 1 StrCpy $R3 $R1 \ Push $R3 Push `\
Call un.DelFileByLog.StrLoc Pop $R2
${If} $R2 != \
StrCpy $R3 $R3 $R2 Delete /REBOOTOK $R3 ${EndIf} ${EndIf} ${EndIf}
StrCpy $R2 $R1 7
${If} $R2 == \ Push $R1 Push \
Call un.DelFileByLog.StrLoc Pop $R2
${If} $R2 != \
IntOp $R2 $R2 + 2 StrCpy $R3 $R1 \ Delete /REBOOTOK $R3 ${EndIf} ${EndIf} ${Loop}
FileClose $R0 Pop $R3 Pop $R2 Pop $R1 Pop $R0 FunctionEnd
Function un.DelFileByLog.StrLoc Exch $R0
Exch Exch $R1 Push $R2 Push $R3 Push $R4 Push $R5
StrLen $R2 $R0 StrLen $R3 $R1 StrCpy $R4 0 ${Do}
StrCpy $R5 $R1 $R2 $R4 ${If} $R5 == $R0 ${OrIf} $R4 = $R3 ${ExitDo} ${EndIf}
IntOp $R4 $R4 + 1 ${Loop}
${If} $R4 = $R3 StrCpy $R0 \ ${Else}
StrCpy $R0 $R4 ${EndIf} Pop $R5 Pop $R4 Pop $R3 Pop $R2 Pop $R1 Exch $R0 FunctionEnd