全方位掌握nsis脚本

NSIS 确实是一个不错的安装程序制作软件。新版本 2.0a7 真正实现了中文支持和支持 WinXP 的安装对话框。
不过要用它实现漂亮的安装界面和完美的安装功能就必须好好的写脚本。
而 NSIS 的脚本指令是在是太多了,有时候觉得好像又回到了学习 C 语言的年代。他丰富而起强大的功能甚至
可以编译出一些小而使用的软件(例如查找窗口句柄,然后…)
好了,不多说。我在这里着重介绍关于 NSIS 的一些使用问题以及新界面安装程序的制作过程,中间会附上一个
示例脚本。
这里只说单语言的简体中文
1. NSIS的运行问题
2.0a7 的 NSIS 安装在长文件名的目录中好像会有问题(Win2k 和 WinXP 下,Win98 下好像没问题)。你若是将
NSIS 安装在类似于“E:/System/Installer/NSIS 的目录中”(其中的“Installer”是超过了 8 个字符的长文
件名),运行 makensisw 或是直接在命令提示符中使用 makensis 可能会非法操作。
解决的办法是:在命令提示符下使用如下指令:
cd E:/System/Instal~1/NSIS
进入 NSIS 安装目录后使用命令行:
makensis /CD /X”Compressor bzip2” “f:/1.nsi”
你可以在脚本文件中使用了“SetCompressor bzip2”指令,这样就可以去掉“/X”Compressor bzip2””参数。
使用 makensisw 的朋友我就不多说了,你可以从我上面的分析中得到点启发。自己设置一下它的运行参数吧!
不过 makensisw 也有 Bug,若用 makensisw 编译时发现脚本错误,程序就立马非法操作。
2. 关于脚本的整体布局
说 NSIS 有些象高级语言的语法一点没错。NSIS 的语法非常注重先后顺序(我曾经为了一个指令的先后顺序来
回 Ctrl+C & Ctrl+V 了 N 次)。
例如象它的帮助文件中提到的“SetFont”指令必须在“AddBrandingImage”指令之前等。我在这里要说的而是
关于如何正确的对脚本进行整体布局,使其能更加合理、高效的被使用,这样才有利于日后的安装程序更新
你可以用我后面的示例脚本为模板制作自己的 NSIS 脚本。
大体布局如下:
//
预设参数(包括外部压缩器选择、编译选项、宏定义以及文件包含等)
普通安装设置
自定义函数
安装程序区域内容
安装程序回调函数及其相关函数定义
卸载程序区域内容
卸载程序回调函数及其相关函数定义
//
3. 关于安装程序 Logo 画面的说明:
先前版本的 NSIS 使用 splash.exe 制作 logo画面,但若您使用 2.0a7,
我建议您使用(好像也只能使用)magiclime.exe,它在 Win2k 和 WinXP
下显示 logo画面时会有淡入淡出的效果。超 Cool….
4. 关于标牌位图(即显示在安装程序对话框中的自定义位图)的说明:
2.0a7 提供了宏指令用于在安装程序的对话框中显示标牌位图。当然你也可以用标准的 NSIS 指令。
5. 关于使用新的 Modern UI 界面的说明:
2.0a7 同样提供了宏指令使你可以使用全新的安装界面:
首先你需要安装 NSIS v2.0a7 简体中文补丁(汉化新世纪有下载):
然后打开安装目录下的 Examples/Modern UI/ModernUI.nsh 文件,将从
!macro MUI_INTERFACE UI ICON UNICON CHECKS PROGRESSBAR
到第一个
!macroend
之间的注释符(即分号)删除(若没有这步究省了)。保存。
接下来就可以在你自己的脚本中使用形式对话框了,并且支持 WinXP 的新的视觉效果样式。
6. 以下是我的示例脚本:

; 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调用这个名字!defineNAME“NSIS”!defineNAMEFULL“全方位掌握NSIS的使用”!verbose3;包含窗口消息定义文件!include“{NAME}调用这个名字 !define NAME “NSIS” !define NAME_FULL “全方位掌握 NSIS 的使用” !verbose 3 ; 包含窗口消息定义文件 !include “{NSISDIR}/Examples/WinMessages.nsh”
; 包含新界面的宏指令文件
!include “NSISDIR/Examples/ModernUI/ModernUI.nsh”;包含标牌位图宏指令文件!include“{NSISDIR}/Examples/Modern UI/ModernUI.nsh” ; 包含标牌位图宏指令文件 !include “{NSISDIR}/Examples/branding.nsh”
!verbose 4
!define CURRENTPAGE 9!defineTEMP19 !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的视觉样式XPStyleon;设置字体SetFont宋体9;标题名称Caption/LANG=2052“全方位掌握NSIS的使用”;标牌的内容BrandingText/LANG=2052/TRIMCENTER“ShaoHao”;安装程序图标Icon“F:/12/QCDIcon.ico”;安装程序显示标题WindowIconon;添加标牌位图(放在顶部用TOP参数。后面接高度)AddBrandingImageLEFT105;设定渐变背景BGGradientoff;设置安静安装模式;SilentInstallnormal;设置安静卸载模式;SilentUnInstallnormal;执行CRC检查(最好用on打开。关闭是因为还要修改安装程序,看第10步)CRCCheckoff;加载相应的语言文件LoadLanguageFile“{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/r/n00/r/n请确认文件属性不是只读且未被使用中!”;默认的安装目录InstallDir“/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 “现在将安装 NAMEFULL到您的计算机:”“请选择安装类型”“或选择您希望安装的组件”InstType“完全安装(都在了)”InstType“典型安装”InstType/LANG=2052/CUSTOMSTRING=自定义;InstType/LANG=2052/NOCUSTOM;InstType/COMPONENTSONLYONCUSTOMCheckBitmap“{NAME_FULL}到您的计算机:” “请选择安装类型” “或选择您希望安装的组件” InstType “完全安装(都在了)” InstType “典型安装” InstType /LANG=2052 /CUSTOMSTRING=自定义 ;InstType /LANG=2052 /NOCUSTOM ;InstType /COMPONENTSONLYONCUSTOM CheckBitmap “{NSISDIR}/Contrib/Icons/modern.bmp”
; 替换显示磁盘空间信息的文字
SpaceTexts /LANG=2052 “所需空间:” “可用空间:”
; 提示用户输入目录的文本
; DirShow hide
; 替换显示选择安装目录的文字
DirText /LANG=2052 “请选择 NAME的安装路径:""选择目录用以安装{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}:” “卸载目录:” ; 卸载程序图标 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 “!主要程序(必须安装)” SecCore
SectionIn 1 2 RO
; 设置输出路径,每次使用都会改变
SetOutPath $INSTDIR
; 循环包含目录下全部内容
File /r “F:/12/1/.
; 只包含一个文件
File “F:/12/gf.gif”
; 处理动态连接库文件
IfFileExists “INSTDIR/1.dll”0NoFile1;取消组件注册UnRegDll“INSTDIR/1.dll” 0 NoFile1 ; 取消组件注册 UnRegDll “INSTDIR/1.dll”
Delete “INSTDIR/1.dll”NoFile1:File“F:/12/1.dll”;注册组件RegDLL“INSTDIR/1.dll” NoFile1: File “F:/12/1.dll” ; 注册组件 RegDLL “INSTDIR/QCDIconMgr.dll”
; 写入软件注册键值
WriteRegStr HKLM “Software/NSIS/NSIS” “” “INSTDIR”;为Windows卸载程序写入键值WriteRegStrHKLM“Software/Microsoft/Windows/CurrentVersion/Uninstall/NSIS”“DisplayName”“NSIS(只用于移除)”WriteRegStrHKLM“Software/Microsoft/Windows/CurrentVersion/Uninstall/NSIS”“UninstallString”“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“扩展(可选)”SecUpdateSectionIn1SetOutPath“INSTDIR/uninst.exe” SectionEnd Section /e “扩展(可选)” SecUpdate SectionIn 1 SetOutPath “INSTDIR/Plugins”
File “F:/12/qcdplus/Plugins/2.dll”
File /r “F:/12/qcdplus/Plugins/3”
SectionEnd
SubSection /e “选项” SecOptions
Section /e “创建桌面图标” SecDesktopShortCut
SectionIn 1 2
SetOutPath “INSTDIR/Plugins”CreateShortCut“INSTDIR/Plugins” CreateShortCut “DESKTOP/NSIS.lnk" "INSTDIR/gf.gif”WriteUninstaller“INSTDIR/gf.gif” WriteUninstaller “INSTDIR/uninst.exe”
SectionEnd
Section /e “创建快速启动栏图标” SecQuickbarShortCut
SectionIn 1 2
SetOutPath “INSTDIR/Plugins”CreateShortCut“INSTDIR/Plugins” CreateShortCut “QUICKLAUNCH/NSIS.lnk" "INSTDIR/gf.gif”WriteUninstaller“INSTDIR/gf.gif” WriteUninstaller “INSTDIR/uninst.exe”
SectionEnd
Section /e “创建 NSIS 程序组” SecShortCutGroup
SectionIn 1 2
SetOutPath “INSTDIR/Plugins”CreateDirectory“INSTDIR/Plugins” CreateDirectory “SMPROGRAMS/NSIS”
CreateShortCut “SMPROGRAMS/QCDPlayer/gf.lnk""SMPROGRAMS/QCD Player/gf.lnk" "INSTDIR/gf.gif”
WriteUninstaller “INSTDIR/uninst.exe”SectionEndSubSectionEndSection“−Run”;运行ExecWait“INSTDIR/uninst.exe” SectionEnd SubSectionEnd Section “-Run”; 运行 ExecWait “INSTDIR/2.exe” -p
WriteINIStr “INSTDIR/NSIS.ini”“2”“Language”“Chinese”Exec“INSTDIR/NSIS.ini” “2” “Language” “Chinese” Exec “INSTDIR/2.exe”
ExecShell open “$INSTDIR/汉化说明.htm”
SectionEnd
Section “”
;Invisible section to display the Finish header
!insertmacro MUI_FINISHHEADER SetHeader
SectionEnd

; 安装程序初始化设置
Function .onInit
; 发现有程序正在运行时提示退出后继续运行
loop:
FindWindow R0“NSIS”IntCmpR0 “NSIS” IntCmp R0 0 done
MessageBox MB_OKCANCEL /
“NSIS 正在运行。/n点击“确定”按钮会关闭NSIS然后继续安装,点击“取消”按钮将退出安装程序”/IDOKNoAbortAbortNoAbort:SendMessage/n点击“确定”按钮会关闭 NSIS 然后继续安装,点击“取消”按钮将退出安装程序” / IDOK NoAbort Abort NoAbort: SendMessage R0 1029 0 0
; 稍等后继续检测直至检测不到或用户选择取消
Sleep 444
Goto loop
done:
; 显示 Logo 画面
SetOutPath TEMPFile/oname=qcdlogo.bmp“F:/12/logo.bmp”File/oname=magiclime.exe“TEMP File /oname=qcd_logo.bmp “F:/12/logo.bmp” File /oname=magiclime.exe “{NSISDIR}/Bin/magiclime.exe”
ExecWait “TEMP/magiclime.exe”qcdlogo.bmpDelete“TEMP/magiclime.exe” qcd_logo.bmp Delete “TEMP/magiclime.exe”
Delete “TEMP/qcdlogo.bmp”;初始化标牌位图!insertmacroBIINITTEMP/qcd_logo.bmp” ; 初始化标牌位图 !insertmacro BI_INIT R0
FunctionEnd
; 安装程序主界面的相关文本
Function SetHeader
!insertmacro MUI_HEADER_INIT
!insertmacro MUI_HEADER_START 1
!insertmacro MUI_HEADER_TEXT 2052 “授权协议” “安装 NAME之前,请认真阅读一下授权条款.”!insertmacroMUIHEADERSTOP1!insertmacroMUIHEADERSTART2!insertmacroMUIHEADERTEXT2052“选择组件”“请选择你要安装的组件.”!insertmacroMUIHEADERSTOP2!insertmacroMUIHEADERSTART3!insertmacroMUIHEADERTEXT2052“选择安装位置”“为{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已经安装,请等待.”!insertmacroMUIHEADERSTOP4!insertmacroMUIHEADERSTART5!insertmacroMUIHEADERTEXT2052“完成”“安装顺利完成.”!insertmacroMUIHEADERSTOP5!insertmacroMUIHEADERENDFunctionEnd;初始化安装程序对话框的显示文本Function.onInitDialog!insertmacroMUIINNERDIALOGINIT!insertmacroMUIINNERDIALOGSTART1!insertmacroMUIINNERDIALOGTEXT20521040“如果你同意协议中的所有条款,选择“我同样”继续安装,如果你选择了“取消”,安装程序将终止,只有接受条款才能安装{NAME} 已经安装,请等待.” !insertmacro MUI_HEADER_STOP 4 !insertmacro MUI_HEADER_START 5 !insertmacro MUI_HEADER_TEXT 2052 “完成” “安装顺利完成.” !insertmacro MUI_HEADER_STOP 5 !insertmacro MUI_HEADER_END FunctionEnd ; 初始化安装程序对话框的显示文本 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_END
FunctionEnd
; 转到下页面时的处理
Function .onNextPage
!insertmacro MUI_NEXTPAGE_OUTER
!insertmacro MUI_NEXTPAGE SetHeader
; 标牌位图设置
!insertmacro BI_NEXT
FunctionEnd
; 转到上一页面时的处理
Function .onPrevPage
!insertmacro MUI_PREVPAGE
; 标牌位图设置
!insertmacro BI_PREV
FunctionEnd
; 鼠标移到指定组件时的显示处理
Function .&#111nMouseOverSection
; 用宏指令设置安装自己的注释文本
!insertmacro MUI_DESCRIPTION_INIT
!insertmacro MUI_DESCRIPTION_TEXT 2052 SecCore“安装主应用程序”!insertmacroMUIDESCRIPTIONTEXT2052{SecCore} “安装主应用程序” !insertmacro MUI_DESCRIPTION_TEXT 2052 {SecUpdate} “安装 NSIS 的更新或新增插件”
!insertmacro MUI_DESCRIPTION_TEXT 2052 SecOptions“选择NSIS的其他安装选项,例如:创建快捷方式和应用程序组的”!insertmacroMUIDESCRIPTIONTEXT2052{SecOptions} “选择 NSIS 的其他安装选项,例如:创建快捷方式和应用程序组的” !insertmacro MUI_DESCRIPTION_TEXT 2052 {SecDesktopShortCut} “在用户的桌面上创建 NSIS 的快捷方式”
!insertmacro MUI_DESCRIPTION_TEXT 2052 SecQuickbarShortCut“在用户的快速栏里创建NSIS快捷方式”!insertmacroMUIDESCRIPTIONTEXT2052{SecQuickbarShortCut} “在用户的快速栏里创建 NSIS 快捷方式” !insertmacro MUI_DESCRIPTION_TEXT 2052 {SecShortCutGroup} “在用户的开始菜单的程序中创建 NSIS 的快捷方式组”
!insertmacro MUI_DESCRIPTION_END
FunctionEnd
; 安装成功完成后的设置
Function .onInstSuccess
; 自己加吧:)
FunctionEnd
; 放弃安装时警告窗口的显示信息
Function .onUserAbort
!insertmacro MUI_ABORTWARNING 2052 “你确定要推出 ${NAME} 的安装吗?”
!insertmacro MUI_ABORTWARNING_END
FunctionEnd
; 安装程序标牌位图列表
!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“INSTDIR/12.exe” /un ; 循环删除文件直至删除文件夹 RMDir /r “SMPROGRAMS/NSIS”
UnRegDLL “INSTDIR/2.dll”Delete“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(若您要保留这些文件,请点击下面的“否”按钮)”/IDNONoDelete;全删光!!!RMDir/r“/n(若您要保留这些文件,请点击下面的“否”按钮)” / IDNO NoDelete ; 全删光!!! RMDir /r “INSTDIR”
NoDelete:
SectionEnd

; 定义卸载程序标牌位图
!define BI_UNINSTALL
!include “NSISDIR/Examples/branding.nsh”;初始化卸载程序对话框的设置Functionun.onInit;初始化标牌位图!insertmacroBIINIT{NSISDIR}/Examples/branding.nsh” ; 初始化卸载程序对话框的设置 Function un.onInit ; 初始化标牌位图 !insertmacro BI_INIT R0
FunctionEnd
; 卸载程序主界面的相关文本
Function un.SetHeader
!insertmacro MUI_HEADER_INIT
!insertmacro MUI_HEADER_START 1
!insertmacro MUI_HEADER_TEXT 2052 “卸载 NAME""{NAME}" "{NAME_FULL} 将从你的系统里移除.”
!insertmacro MUI_HEADER_STOP 1
!insertmacro MUI_HEADER_START 2
!insertmacro MUI_HEADER_TEXT 2052 “卸载” “NAME正在被卸载,请等待.”!insertmacroMUIHEADERSTOP2!insertmacroMUIHEADERSTART3!insertmacroMUIHEADERTEXT2052“完成”“{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_END
FunctionEnd
; 初始化卸载程序对话框时的处理
Function un.onInitDialog
; 自己加:)
FunctionEnd
; 卸载程序转到下一页时的处理
Function un.onNextPage
!insertmacro MUI_NEXTPAGE_OUTER
!insertmacro MUI_NEXTPAGE un.SetHeader
; 标牌位图设置
!insertmacro BI_NEXT
FunctionEnd
; 卸载程序完成时的处理
Function un.onUninstSuccess
; 再加^_^
FunctionEnd
; 放弃卸载程序时的处理
Function un.onUserAbort
FunctionEnd
; 卸载程序标牌位图列表
!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

; 结束
/
7.注意两个标牌位图列表宏指令必须放置到函数的后面,就像我编写的那样,安装程序的标牌位
图列表放置到到所有安装程序回调函数的后面;卸载程序的标牌位图列表放置到所有卸载程序回
调函数的后面。
关键是要注意整体布局(这样才不会看迷糊),当然若编译不能通过,就要进行合适的调整。
8. 使用指令:
makensis /CD f:/study.nsi”
进行编译(这个示例脚本我没试过-_-,若编译无法通过只好自己动手研究研究了。我放出来只是用于参考学习)
9. 还没完—— NSIS 对多语言的支持还是不够完美(注意:是完美——有点鸡蛋里挑骨头的味道)。
我们继续:
用 ExeScope (其他的资源编辑器也行,别说你没有)打开生成的 study.exe 文件,找到对话框资源的 105 项
目。你会发现有一块很明显的用以显示标牌位图的控件。因为 NSIS 在插件此控件时是使其保持于授权协议文件
控件等高的,所以当使用用 modern2.exe 对话框模板时会与对话框顶部多出 45 的距离——不罗嗦了,总之根据
需要搞得好看就行(别过火!)。
顺便提一下,NSIS 安装目中的 Contrib/UIs 子目录下提供了多种对话框模板,你可以自行选用(就是用
ChangeUI 指令或用宏指令),甚至根据需要用资源编辑器修改模板资源。
接着修改:找到 111 项,把里面的资源汉化掉(新的界面居然没有对此对话框的多语言支持!这个对话框只有在
大容量的安装程序执行时才显示)。
用 ExeScope 更新后,再用 Hex WorkShop 打开我问可怜的试验品——study.exe,查找字符串
“unpacking data: ”(没引号的,你别瞎加。找不到别怪我 __)。找到后处理一下,用“正在解压缩数据:”
替换(正好 8 个字符 Yeah!)。
10. 现在我要说为什么不启用 UPX 压缩以及关闭 CRC 检测:
用 UPX 压缩可执行文件头或启用 CRC 检测(起用的话就是打开了自校验),我们的 ExeScope 就无用武之地了。但关于CRC校验又有些特别:使用者可以在命令行提示符下使用 /NCRC 开关参数执行安装程序,例如:若安装程序得文件名为“setup.exe”,那么就在命令行提示符下键入“setup.exe /NCRC”就可跳过 CRC 校验执行安装程序(但如果你将CRCCheck指令的参数设置为force的话,就什么办法也没了),但这样对使用者而言比较麻烦。
至此全部完工。

若有任何语法难点,请参阅 NSIS 的帮助文件(有了中文版的应该方便些吧!)。内有上千字的详细说明(可能更多,我也没统计过)。还有一些指令我没有用上,因为那些不太可能用的上。
这个示例脚本已能作出较佳的安装程序界面,大家看看我为 QCD v3.40B35 做的安装界面。

编译脚本非法操作的问题我也见识过了~!我也有个偏方~!在编译时按住该运行窗口不放,直到运行结束(有时会不显示运行状态,自行判断时间吧),这个方法屡试不爽~!:)
2.0a7依然支持splash.exe 编写启动logo哦~!
指令如下:
Function .onInit
SetOutPath TEMPFile/oname=spltmp.bmp“F:/MyDocuments/hanzify1.bmp”;optional;File/oname=spltmp.wav“mysplashshit.wav”File/oname=spltmp.exe“TEMP File /oname=spltmp.bmp “F:/My Documents/hanzify1.bmp” ; optional ; File /oname=spltmp.wav “my_splashshit.wav” File /oname=spltmp.exe “{NSISDIR}/bin/splash.exe”
ExecWait “TEMP/spltmp.exe"1000TEMP/spltmp.exe" 1000 HWNDPARENT TEMP/spltmpDeleteTEMP/spltmp Delete TEMP/spltmp.exe
Delete TEMP/spltmp.bmp;DeleteTEMP/spltmp.bmp ; Delete TEMP/spltmp.wav
FunctionEnd

另外,我建议把简体中文语言包和一些常用宏指令文件里的语言设置改为2052,就可以在编脚本时偷懒一点啦~!同时显示效果也要好一些

全方位掌握nsis脚本相关推荐

  1. 全方位掌握 NSIS 的操作

    NSIS 确实是一个不错的安装程序制作软件.新版本2.0a7真正实现了中文支持和支持 WinXP 的安装对话框.不过要用它实现漂亮的安装界面和完美的安装功能就必须好好的写脚本.而 NSIS 的脚本指令 ...

  2. NSIS脚本语言安装与编译

    NSIS是什么 当项目中需要把安装包发给客户时,不能直接发送release文件,需要把release文件压缩打包,这时就可以用到NSIS工具,NSIS工具可以进行包装,使用时需要下载: 编译环境:nu ...

  3. 关于NSIS脚本的Demo

    这个NSIS脚本是打包公司的整个Release项目工程. 用NSIS编译器编译下就可以了. ; Script generated by the HM NIS Edit Script Wizard.!i ...

  4. NSIS脚本学习:使用 LogicLib.nsh 实现基本流程控制结构

    LogicLib.nsh 程序的三种基本结构包括:顺序结构.分支结构.循环结构.顺序结构是最基本的结构,本文主要说明了如何在NSIS脚本中写出分支结构和循环结构. 最基本的分支结构和循环结构可以用St ...

  5. NSIS脚本学习:创建 MUI 界面使用的自定义语言包文件(nlf nsh)

    NSIS脚本的语言包文件,存放在以下目录: NSIS安装目录\Contrib\Language files 在这个目录下有很多语言包,一般简体中文使用的语言包是 SimpChinese.nlf 和 S ...

  6. 使用NSIS脚本制作一个安装包

    大部分人第一次看到NSIS脚本都是一脸懵逼的.因为它这个脚本的结构乍一看上去就非常奇怪,不作说明的话是看不懂的. 编写脚本命令的时候要非常注意,命令要按照规定写在脚本中不同的段落里,也就是说,命令的先 ...

  7. NSIS脚本文件格式

    4.1 脚本文件格式 一个 NSIS 脚本文件 (.nsi) 就是一个包含了脚本代码的文本文件. 命令 命令行的格式为: '命令 [参数]' File "myfile" 注释 以 ...

  8. NSIS学习记录(三)————NSIS脚本简介

    文章目录 一.介绍 二.脚本结构 Installer Attributes Page Sections Functions 一.介绍 标题NSIS脚本是有特定语法规则的规范语言. 可以用任何文本编辑器 ...

  9. NSIS 脚本知识汇总

    转载来源:NSIS 打包脚本基础 - 走看看 简介 NSIS(Nullsoft Scriptable Install System)是一个开源的 Windows 系统下安装程序制作程序.它提供了安装. ...

最新文章

  1. 牛客华为机试第8题python
  2. mysql遵循acid_mysql关系型数据库遵循ACID规则
  3. dataframe两个表合并_R语言读取多个excel文件后合并:rbind/merge/cmd合并
  4. 【网络流24题】餐巾计划问题(最小费用最大流)
  5. jQuery使用ajax跨域请求获取数据
  6. mysql 数据检查_mysql数据一致性检查及修复
  7. Unity3D-光照系统
  8. clickhouse的常见问题以及和mysql相关特性对比
  9. JAVA核心技术卷1 corejava.zip 下载地址
  10. android 用gridview,Android GridView的使用
  11. spring boot学生课程考试系统的设计与实现毕业设计源码171548
  12. 计算机考研408复试题汇总
  13. [python库]psd文件操作库--psd_tools
  14. 五大云存储服务对比:iCloud、Google...
  15. 基于IAAS和SAAS的运维自动化-张克琛
  16. 基于网易云信WebRTC的Web音视频实现
  17. 素数回文(打表到文件里面)
  18. 百度经纬度和google经纬度转换测试
  19. 海康威视主码流和子码流的区别
  20. 第三部分 :简单句的补充(限定词/形容词/介词短语)

热门文章

  1. Maven命令行查看依赖树
  2. 联合索引,组合索引,详细应用实例
  3. flash iphone效果
  4. 全网唯一OpenCyphal/UAVCAN教程(10)canfd协议详解
  5. asterisk拨号计划中Hangup() App执行规则
  6. 3D立体相册不过是冷锋蓝plus版 html+css
  7. 少儿编程Scratch学习教程4--基本操作(一)特效例子
  8. 程序员坐牢会被安排写代码吗?
  9. python编程题12-计算并联电阻
  10. 智能型炉温测试仪kic x5软件,KIC X5 炉温测试仪产品说明ppt课件