NSIS 简易教程

来源:互联网 发布:江苏城市频道网络直播 编辑:程序博客网 时间:2024/05/18 00:31

NSIS 大体布局如下:
  • 预设参数(包括外部压缩器选择、编译选项、宏定义以及文件包含等)
  • 普通安装设置
  • 自定义函数
  • 安装程序区域内容
  • 安装程序回调函数及其相关函数定义
  • 卸载程序区域内容
  • 卸载程序回调函数及其相关函数定义
一个示例脚本
; study.nsi;; 以下脚本用以生成 study.exe 文件; 它包含有授权协议;; 安装时若发现应用程序正在运行,安装程序会提示并替用户关闭应用程序; 安装成功后会自动运行应用程序;; 启用新的 Modern UI 的宏指令语法,原先的部分指令将被禁止以防止重复; 我会尽量展示如何基本指令的用法。当然宏指令也会与一些基本指令发生重; 复定义的情况,不过 NSIS 照样能编译成功.; 其中的一些路径、文件你可以根据需要更改; 启用外部压缩工具(这里我们不用,原因看第 10 步);!define HAVE_UPX; 若启用了外部压缩工具,这进行可执行文件头的压缩!ifdef HAVE_UPX; 用 UPX 压缩可执行文件头(用其他的相关工具也行)!packhdr tmp.dat "E:UPX\upx --best tmp.dat"!endif; 编译选项; 设置覆盖标记SetOverwrite on; 设置压缩选项SetCompress auto; 选择压缩方式SetCompressor bzip2; 设置数据块优化SetDatablockOptimize on; 设置数据写入时间SetDateSave on; 相关数据预设; 软件的名字,后面的${NAME}调用这个名字!define NAME "NSIS"!define NAME_FULL "全方位掌握 NSIS 的使用"!verbose 3; 包含窗口消息定义文件!include "${NSISDIR}\Examples\WinMessages.nsh"; 包含新界面的宏指令文件!include "${NSISDIR}\Examples\Modern UI\ModernUI.nsh"; 包含标牌位图宏指令文件!include "${NSISDIR}\Examples\branding.nsh"!verbose 4!define CURRENTPAGE $9!define TEMP1 $R0!define TEMP2 $R1; 插入安装界面宏定义(这里我禁用了,启用也没问题。编译照样通过。后面我都定义过了);!insertmacro MUI_INTERFACE "modern2.exe" "adni18-installer-C-no48xp.ico" "adni18-uninstall-C-no48xp.ico" "modern.bmp" "smooth"; 安装程序设置; 输出文件OutFile "F:\study.exe"; 安装程序名称Name /LANG=2052 "NSIS"; 替换对话框样式ChangeUI all "${NSISDIR}\Contrib\UIs\modern2.exe"; 启用 WindowsXP 的视觉样式XPstyle on;设置字体SetFont 宋体 9; 标题名称Caption /LANG=2052 "全方位掌握 NSIS 的使用"; 标牌的内容BrandingText /LANG=2052 /TRIMCENTER "Shao Hao"; 安装程序图标Icon "F:\12\QCDIcon.ico"; 安装程序显示标题WindowIcon on; 添加标牌位图(放在顶部用 TOP 参数。后面接高度)AddBrandingImage LEFT 105; 设定渐变背景BGGradient off; 设置安静安装模式;SilentInstall normal; 设置安静卸载模式;SilentUnInstall normal; 执行 CRC 检查(最好用 on 打开。关闭是因为还要修改安装程序,看第 10 步)CRCCheck off; 加载相应的语言文件LoadLanguageFile "${NSISDIR}\Contrib\Language files\SimpChinese.nlf"; 替换各个对话框标题的文字SubCaption /LANG=2052 0 "授权协议"SubCaption /LANG=2052 1 "安装选项"SubCaption /LANG=2052 2 "安装目录"SubCaption /LANG=2052 3 "正在安装"SubCaption /LANG=2052 4 "完成安装"; 替换默认按钮的文字MiscButtonText /LANG=2052 "< 上一步" "下一步 >" "取消" "关闭"; 替换“安装”按钮的文字;InstallButtonText /LANG=2052 "安装"; 替换当文件无法被写入时的警告窗的文字FileErrorText /LANG=2052 "无法写入文件$\r$\n$0$\r$\n请确认文件属性不是只读且未被使用中!"; 默认的安装目录InstallDir "$PROGRAMFILES\QCD 3"; 如果可能的化从注册表中监测安装路径InstallDirRegKey HKLM \"Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS" \"UninstallString"; 授权协议页面LicenseText /LANG=2052 "NSIS 是免费软件。安装前请先阅读以下协议条款" "我同意"; 使用授权协议文本LicenseData /LANG=2052 "F:\12\License.txt"; 设置授权协议页面的背景色;LicenseBkColor 000000; 选择要按安装的组件ComponentText /LANG=2052 "现在将安装 ${NAME_FULL}到您的计算机:" "请选择安装类型" "或选择您希望安装的组件"InstType "完全安装(都在了)"InstType "典型安装"InstType /LANG=2052 /CUSTOMSTRING=自定义?;InstType /LANG=2052 /NOCUSTOM;InstType /COMPONENTSONLYONCUSTOMCheckBitmap "${NSISDIR}\Contrib\Icons\modern.bmp"; 替换显示磁盘空间信息的文字SpaceTexts /LANG=2052 "所需空间:" "可用空间:"; 提示用户输入目录的文本; DirShow hide; 替换显示选择安装目录的文字DirText /LANG=2052 "请选择 ${NAME} 的安装路径:" "选择目录用以安装 ${NAME}:" "浏览..."; 是否允许安装在根目录下AllowRootDirInstall false; 安装信息的颜色;InstallColors 000000 FFFFFF; 安装进度条显示方式InstProgressFlags smooth colored; 完成后自动关闭安装程序AutoCloseWindow true; 显示“显示详细细节”对话框ShowInstDetails hide; 替换“显示细节”按钮的文字DetailsButtonText /LANG=2052 "显示细节"; 替换“完成”按钮的文字CompletedText /LANG=2052 "已完成"; 卸载程序设置; 替换卸载程序的文字UninstallText /LANG=2052 "现在将从你的系统中卸载 ${NAME}:" "卸载目录:"; 卸载程序图标UninstallIcon "F:\12\UnQCDIcon.ico"; 替换卸载程序标题的文字UninstallCaption /LANG=2052 "卸载 ${NAME}"; 替换卸载程序每页按钮的文字UninstallSubCaption /LANG=2052 0 ":确认"UninstallSubCaption /LANG=2052 1 ":正在删除文件"UninstallSubCaption /LANG=2052 2 ":完成"; 卸载程序显示方式ShowUninstDetails hide; 替换“卸载”按钮的文字UninstallButtonText /LANG=2052 "卸载"; 安装程序内容及其相关的回调函数; 安装程序内容Section /e "!主要程序(必须安装)" SecCoreSectionIn 1 2 RO; 设置输出路径,每次使用都会改变SetOutPath $INSTDIR; 循环包含目录下全部内容File /r "F:\12\1\*.*"; 只包含一个文件File "F:\12\gf.gif"; 处理动态连接库文件IfFileExists "$INSTDIR\1.dll" 0 NoFile1; 取消组件注册UnRegDll "$INSTDIR\1.dll"Delete "$INSTDIR\1.dll"NoFile1:File "F:\12\1.dll"; 注册组件RegDLL "$INSTDIR\QCDIconMgr.dll"; 写入软件注册键值WriteRegStr HKLM "Software\NSIS\NSIS" "" "$INSTDIR"; 为 Windows 卸载程序写入键值WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS" "DisplayName" "NSIS(只用于移除)"WriteRegStr HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS" "UninstallString" '"$INSTDIR\uninst.exe"'; 写入生成卸载程序(可多次使用)WriteUninstaller "$INSTDIR\uninst.exe"SectionEndSection /e "扩展(可选)" SecUpdateSectionIn 1SetOutPath "$INSTDIR\Plugins"File "F:\12\qcdplus\Plugins\2.dll"File /r "F:\12\qcdplus\Plugins\3"SectionEndSubSection /e "选项" SecOptionsSection /e "创建桌面图标" SecDesktopShortCutSectionIn 1 2SetOutPath "$INSTDIR\Plugins"CreateShortCut "$DESKTOP\NSIS.lnk" "$INSTDIR\gf.gif"WriteUninstaller "$INSTDIR\uninst.exe"SectionEndSection /e "创建快速启动栏图标" SecQuickbarShortCutSectionIn 1 2SetOutPath "$INSTDIR\Plugins"CreateShortCut "$QUICKLAUNCH\NSIS.lnk" "$INSTDIR\gf.gif"WriteUninstaller "$INSTDIR\uninst.exe"SectionEndSection /e "创建 NSIS 程序组" SecShortCutGroupSectionIn 1 2SetOutPath "$INSTDIR\Plugins"CreateDirectory "$SMPROGRAMS\NSIS"CreateShortCut "$SMPROGRAMS\QCD Player\gf.lnk" "$INSTDIR\gf.gif"WriteUninstaller "$INSTDIR\uninst.exe"SectionEndSubSectionEndSection "-Run"; 运行?ExecWait '"$INSTDIR\2.exe" -p'WriteINIStr "$INSTDIR\NSIS.ini" "2" "Language" "Chinese"Exec "$INSTDIR\2.exe"ExecShell open "$INSTDIR\汉化说明.htm"SectionEndSection "";Invisible section to display the Finish header!insertmacro MUI_FINISHHEADER SetHeaderSectionEnd; 安装程序初始化设置Function .onInit; 发现有程序正在运行时提示退出后继续运行loop:FindWindow $R0 "NSIS"IntCmp $R0 0 doneMessageBox MB_OKCANCEL \"NSIS 正在运行。$\n点击“确定”按钮会关闭 NSIS 然后继续安装,点击“取消”按钮将退出安装程序" \IDOK NoAbortAbortNoAbort:SendMessage $R0 1029 0 0; 稍等后继续检测直至检测不到或用户选择取消Sleep 444Goto loopdone:; 显示 Logo 画面SetOutPath $TEMPFile /oname=qcd_logo.bmp "F:\12\logo.bmp"File /oname=magiclime.exe "${NSISDIR}\Bin\magiclime.exe"ExecWait '"$TEMP\magiclime.exe" qcd_logo.bmp'Delete "$TEMP\magiclime.exe"Delete "$TEMP\qcd_logo.bmp"; 初始化标牌位图!insertmacro BI_INIT $R0FunctionEnd; 安装程序主界面的相关文本Function SetHeader!insertmacro MUI_HEADER_INIT!insertmacro MUI_HEADER_START 1!insertmacro MUI_HEADER_TEXT 2052 "授权协议" "安装 ${NAME} 之前,请认真阅读一下授权条款."!insertmacro MUI_HEADER_STOP 1!insertmacro MUI_HEADER_START 2!insertmacro MUI_HEADER_TEXT 2052 "选择组件" "请选择你要安装的组件."!insertmacro MUI_HEADER_STOP 2!insertmacro MUI_HEADER_START 3!insertmacro MUI_HEADER_TEXT 2052 "选择安装位置" "为 ${NAME} 选择一个安装目录."!insertmacro MUI_HEADER_STOP 3!insertmacro MUI_HEADER_START 4!insertmacro MUI_HEADER_TEXT 2052 "安装" "${NAME} 已经安装,请等待."!insertmacro MUI_HEADER_STOP 4!insertmacro MUI_HEADER_START 5!insertmacro MUI_HEADER_TEXT 2052 "完成" "安装顺利完成."!insertmacro MUI_HEADER_STOP 5!insertmacro MUI_HEADER_ENDFunctionEnd; 初始化安装程序对话框的显示文本Function .onInitDialog!insertmacro MUI_INNERDIALOG_INIT!insertmacro MUI_INNERDIALOG_START 1!insertmacro MUI_INNERDIALOG_TEXT 2052 1040 "如果你同意协议中的所有条款,选择“我同样”继续安装,如果你选择了“取消”,安装程序将终止,只有接受条款才能安装 ${NAME}."!insertmacro MUI_INNERDIALOG_STOP 1!insertmacro MUI_INNERDIALOG_START 2!insertmacro MUI_INNERDIALOG_TEXT 2052 1042 "描述"!insertmacro MUI_INNERDIALOG_TEXT 2052 1043 "移动你的鼠标到组件上,便可以见到相关的描述."!insertmacro MUI_INNERDIALOG_STOP 2!insertmacro MUI_INNERDIALOG_START 3!insertmacro MUI_INNERDIALOG_TEXT 2052 1041 "目标文件夹"!insertmacro MUI_INNERDIALOG_STOP 3!insertmacro MUI_INNERDIALOG_ENDFunctionEnd; 转到下页面时的处理Function .onNextPage!insertmacro MUI_NEXTPAGE_OUTER!insertmacro MUI_NEXTPAGE SetHeader; 标牌位图设置!insertmacro BI_NEXTFunctionEnd; 转到上一页面时的处理Function .onPrevPage!insertmacro MUI_PREVPAGE; 标牌位图设置!insertmacro BI_PREVFunctionEnd; 鼠标移到指定组件时的显示处理Function .onMouseOverSection; 用宏指令设置安装自己的注释文本!insertmacro MUI_DESCRIPTION_INIT!insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecCore} "安装主应用程序"!insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecUpdate} "安装 NSIS 的更新或新增插件"!insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecOptions} "选择 NSIS 的其他安装选项,例如:创建快捷方式和应用程序组的"!insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecDesktopShortCut} "在用户的桌面上创建 NSIS 的快捷方式"!insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecQuickbarShortCut} "在用户的快速栏里创建 NSIS 快捷方式"!insertmacro MUI_DESCRIPTION_TEXT 2052 ${SecShortCutGroup} "在用户的开始菜单的程序中创建 NSIS 的快捷方式组"!insertmacro MUI_DESCRIPTION_ENDFunctionEnd; 安装成功完成后的设置Function .onInstSuccess; 自己加吧:)FunctionEnd; 放弃安装时警告窗口的显示信息Function .onUserAbort!insertmacro MUI_ABORTWARNING 2052 "你确定要推出 ${NAME} 的安装吗?"!insertmacro MUI_ABORTWARNING_ENDFunctionEnd; 安装程序标牌位图列表!insertmacro BI_LIST!insertmacro BI_LIST_ADD "F:\12\Brand1.bmp" /RESIZETOFIT!insertmacro BI_LIST_ADD "F:\12\Brand2.bmp" /RESIZETOFIT!insertmacro BI_LIST_ADD "F:\12\Brand3.bmp" /RESIZETOFIT!insertmacro BI_LIST_END; 卸载程序及其相关回调函数; 卸载程序内容Section "Uninstall"ExecWait '"$INSTDIR\12.exe" /un'; 循环删除文件直至删除文件夹RMDir /r "$SMPROGRAMS\NSIS"UnRegDLL "$INSTDIR\2.dll"Delete "$INSTDIR\QCDIconMgr.dll"Delete "$INSTDIR\*.*"DeleteRegKey HKLM "Software\NSIS"DeleteRegKey HKLM "Software\Microsoft\Windows\CurrentVersion\Uninstall\NSIS"MessageBox MB_YESNO|MB_ICONQUESTION \"是否连插件目录也要删除?$\n(若您要保留这些文件,请点击下面的“否”按钮)" \IDNO NoDelete; 全删光!!!RMDir /r "$INSTDIR"NoDelete:SectionEnd; 定义卸载程序标牌位图!define BI_UNINSTALL!include "${NSISDIR}\Examples\branding.nsh"; 初始化卸载程序对话框的设置Function un.onInit; 初始化标牌位图!insertmacro BI_INIT $R0FunctionEnd; 卸载程序主界面的相关文本Function un.SetHeader!insertmacro MUI_HEADER_INIT!insertmacro MUI_HEADER_START 1!insertmacro MUI_HEADER_TEXT 2052 "卸载 ${NAME}" "${NAME_FULL} 将从你的系统里移除."!insertmacro MUI_HEADER_STOP 1!insertmacro MUI_HEADER_START 2!insertmacro MUI_HEADER_TEXT 2052 "卸载" "${NAME} 正在被卸载,请等待."!insertmacro MUI_HEADER_STOP 2!insertmacro MUI_HEADER_START 3!insertmacro MUI_HEADER_TEXT 2052 "完成" "${NAME_FULL} 已从你的系统中移除."!insertmacro MUI_HEADER_STOP 3!insertmacro MUI_HEADER_ENDFunctionEnd; 初始化卸载程序对话框时的处理Function un.onInitDialog; 自己加:)FunctionEnd; 卸载程序转到下一页时的处理Function un.onNextPage!insertmacro MUI_NEXTPAGE_OUTER!insertmacro MUI_NEXTPAGE un.SetHeader; 标牌位图设置!insertmacro BI_NEXTFunctionEnd; 卸载程序完成时的处理Function un.onUninstSuccess; 再加^_^FunctionEnd; 放弃卸载程序时的处理Function un.onUserAbortFunctionEnd; 卸载程序标牌位图列表!insertmacro BI_LIST!insertmacro BI_LIST_ADD "F:\12\UnBrand1.bmp" /RESIZETOFIT!insertmacro BI_LIST_ADD "F:\12\UnBrand2.bmp" /RESIZETOFIT!insertmacro BI_LIST_END; 结束
0 0
原创粉丝点击