本帖最后由 Bugsong 于 2012-12-26 11:44 编辑
原创发表于:实战NSIS——7z分卷压缩自解压 | 大D综合研究院
原文链接:http://www.dadclab.com/archives/1495
本文采用知识共享署名-非商业性使用-相同方式共享 2.5 中国大陆许可协议进行许可。
协议查看链接:http://creativecommons.org/licenses/by-nc-sa/2.5/cn/
略有删节
一、引
本文缘于一个帖子。。。
首先呢,文件是7z压缩的,进行了分卷,其次,大D对附件中的程序用PEID查看了一下。 于是了解到安装程序使用NSIS(Nullsoft Scriptable Install System) 来制作的,于是有了这篇文章。 二、神马是NSIS好,NSIS,这是一个神奇的东西。。很多的安装程序都是这个程序打包出来的,下面原因Wiki百科的内容,详细请点击:http://zh.wikipedia.org/wiki/Nullsoft_Scriptable_Install_System Nullsoft 脚本安装系统(英语:Nullsoft Scriptable Install System,缩写:NSIS)为一个开放源代码脚本驱动的封装安装档用工具。可以用其脚本语言自定安装的流程,同时支援多种语系的安装接口。
好吧,你可以略过这一段不读。 三、准备7z,这个家伙很让人纠结。自解压程序吧,那就不能分卷,分卷就不能自解压。 还好7z提供了命令行版本的7z。 大家可以到7z的官方网站下载。 NSIS大家就上网去找吧,有的是。 NSIS属于脚本类的打包程序,大家可以下载一个VNISedit,这东西可以代码高亮和代码补完,很方便实用。 四、7z咱们先来了解一下7z的问题。 7z不能创建支持分卷压缩的自解压程序,压缩出来的文件名类似于X.7z.001,依此类推。 并且分卷只能通过7z程序来解压缩。 7z提供的命令行模式程序——7za可以帮我们完成加入打包程序/制作安装程序这一类的工作。 查阅了7za的help文件,得知到7z命令行模式可以使用以下参数: COMMAND | DESCRIPTION | a | Add | b | Benchmark | d | Delete | e | Extract | i | List | t | Test | u | Update | x | Xtract with full paths |
我们这里用x参数就可以了。 x (Extract with full paths) command
Extracts files from an archive with their full paths in the current directory, or in an output directory if specified.
See the e (Extract) command description for more details.
Examples 7z x archive.zip extracts all files from the archive archive.zip to the current directory. 7z x archive.zip -oc:\soft *.cpp -r extracts all *.cpp files from the archive archive.zip to c:\soft folder. 五、脚本范例v0.1准备工作已经就绪,Let`s do it~
- ;Nsis 7z 分卷解压缩示例代码 v0.1
- ;http://www.bugsong.net
- ;2012-06-26
- installDir "D:\Source Code\sample" ;指定安装目录
- !define EXEDIR "D:\Source Code\NSIS" ;宏定义EXEDIR的路径
- Section "unzip" ;过程名
- File 7za.exe 1.7z.001 1.7z.002 1.7z.003 ;声明打包的文件
- nsexec::exec "${EXEDIR}\7za.exe" ;执行的程序
- nsExec::Exec '"${EXEDIR}\7za.exe" x "${EXEDIR}\1.7z.001" -o"$INSTDIR"'
- Delete "${EXEDIR}\7za.exe" ;删除文件
- Delete "${EXEDIR}\1.7z.001"
- Delete "${EXEDIR}\1.7z.002"
- Delete "${EXEDIR}\1.7z.003"
- SectionEnd
- OutFile simple.exe ;输出
复制代码
下面来说明一下代码。 首先,在NSIS中,以;和#开头的,为注释,相当于//和/**/。 第二,NSIS支持宏定义。 第三,每一个脚本中必须包含一个Section和SectionEnd。Section表示开始起点,SectionEnd表示过程运行结束。 第四,每一个脚本中必须包含一个OutFile。OutFile用于输出打包好的安装程序。 第五,要把所有需要打包的文件放到一个目录里面,在本例中,大D放置到了
目录下。 大家可以将代码修改修改适用于自己的压缩包,编译运行。文件就会被顺利的解压缩到指定目录。 但是这个版本有这样一些问题: 1.不能在安装过程中控制安装路径。 2.没有卸载功能。 于是,我们进行修改,便有了v0.2 六、脚本范例v0.2
- ;Nsis 7z 分卷解压缩示例代码 v0.2
- ;http://www.bugsong.net
- ;2012-06-26
- installDir "D:\Source Code\sample"
- !define EXEDIR "D:\Source Code\NSIS"
- Page directory ;添加目录选择页
- Page instfiles ;添加安装状态页
- Section "unzip" ;过程"unzip"开始
- writeUninstaller $INSTDIR/uninstaller.exe ;生成卸载程序
- File 7za.exe 1.7z.001 1.7z.002 1.7z.003
- nsexec::exec "${EXEDIR}\7za.exe"
- nsExec::Exec '"${EXEDIR}\7za.exe" x "${EXEDIR}\1.7z.001" -o"$INSTDIR"'
- Delete "${EXEDIR}\7za.exe"
- Delete "${EXEDIR}\1.7z.001"
- Delete "${EXEDIR}\1.7z.002"
- Delete "${EXEDIR}\1.7z.003"
- SectionEnd ;过程"unzip"结束
- OutFile simple.exe ;生成文件
- section "Uninstall" ;过程"Uninstall"开始
- rmDir /r "$INSTDIR" ;删除安装目录
- sectionEnd ;过程"Uninstall"结束
复制代码
page为增加页,具体可以参考NSIS的帮助文件,里面有详细的函数控制以及函数参数的相关信息。 一个安装脚本可以有多个过程,用于创建诸如卸载程序或者绑定首页一类的工作。 大家可以看到我们不仅仅生成了安装程序,也生成了卸载程序。 安装程序也有自定义安装路径的页面了。 总体上来看已经有点安装程序的样子了。 可是这还不够。现在的这个界面太老太丑了。。而且默认还是英文界面。 于是我们继续改进。 七、脚本范例v0.3在这一版本中,我们将使用新版的NSIS界面——Modern UI 2.0 首先, 在脚本的开头添加此行来引入 Modern UI: !include MUI2.nsh
代码如下: ;Nsis 7z 分卷解压缩示例代码 v0.3
;http://www.bugsong.net
;2012-06-26
;使用新版安装界面
installDir "D:\Source Code\sample"
!define EXEDIR "D:\Source Code\NSIS"
!include "MUI2.nsh" ;加载MUI2头文件
!define MUI_HEADERIMAGE ;宏定义头部图像
!define MUI_HEADERIMAGE_BITMAP "1.BMP" ;宏定义头像文件名及路径
!insertmacro MUI_PAGE_WELCOME ;增加欢迎界面
BrandingText "Bugsong.net" ;横线版权区域显示内容
Name "7z分卷自解压打包测试 v0.3" ;定义程序名字
!define MUI_WELCOMEPAGE_TITLE '7z分卷自解压测试 v0.3' ;定义欢迎界面标题
!insertmacro MUI_PAGE_DIRECTORY ;增加目录页
!insertmacro MUI_PAGE_INSTFILES ;增加安装状态页
!insertmacro MUI_PAGE_FINISH ;安装完毕页面
!insertmacro MUI_LANGUAGE "SimpChinese" ;多国语言支持
Section "unzip"
File 7za.exe 1.7z.001 1.7z.002 1.7z.003
nsexec::exec "${EXEDIR}\7za.exe"
nsExec::Exec '"${EXEDIR}\7za.exe" x "${EXEDIR}\1.7z.001" -o"$INSTDIR"'
Delete "${EXEDIR}\7za.exe"
Delete "${EXEDIR}\1.7z.001"
Delete "${EXEDIR}\1.7z.002"
Delete "${EXEDIR}\1.7z.003"
SectionEnd
OutFile simple.exe
脚本范例V0.3 欢迎界面
脚本范例V0.3 安装目录选择界面
八、结束嗯,洋洋洒洒凑了一堆字。基本上来讲,通过NSIS自解压7z分卷的目的已经达到了。 只用把代码内关于文件名的部分进行调整即可使用。 权当抛砖引玉。。 喜欢折腾的看官,您可以去折腾着玩儿了~ 九、参考
1.NSIS用户手册
2.7za用户指南对以上文档文献的编纂者、翻译者表示感谢。
|