实战NSIS——7z分卷压缩自解压
零、引
为啥么写这个捏?
缘于某天在CFan上看到的一个帖子。
当然是大D做版主的区啦。哈哈。。
首先呢,文件是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 |
l | List |
t | Test |
u | Update |
x | eXtract 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~
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
;Nsis 7z 分卷解压缩示例代码 v0.1 ;http://www.dadclab.com ;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 |
D:\Source Code\NSIS |
目录下。
大家可以将代码修改修改适用于自己的压缩包,编译运行。文件就会被顺利的解压缩到指定目录。
但是这个版本有这样一些问题:
1.不能在安装过程中控制安装路径。
2.没有卸载功能。
于是,我们进行修改,便有了v0.2
五、脚本范例v0.2
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 |
;Nsis 7z 分卷解压缩示例代码 v0.2 ;http://www.dadclab.com ;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:
1 |
!include MUI2.nsh |
代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
;Nsis 7z 分卷解压缩示例代码 v0.3 ;http://www.dadclab.com ;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 "dadclab.com" ;横线版权区域显示内容 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 |
七、结束
嗯,洋洋洒洒凑了一堆字。基本上来讲,通过NSIS自解压7z分卷的目的已经达到了。
只用把代码内关于文件名的部分进行调整即可使用。
权当抛砖引玉。。
喜欢折腾的看官,您可以去折腾着玩儿了~
八、参考
1.NSIS用户手册
2.7za用户指南
对以上文档文献的编纂者、翻译者表示感谢。
已有 8 条评论
发表评论
电子邮件地址不会被公开。 必填项已标注。
哇哇哇好大一只技术宅,话说7z我都很少用到,一直是rar(滚地
@节操掉光的的千寻 我也经常用rar,但是需要大压缩率的时候,会选择7z~~诶嘿嘿
收藏此帖! 可以在里面用7z乐
nsis还是很给力的,
大D你好 我用你这个方法 向压缩一个2.7G的文件到安装包中, 可是依然会报
Note: you may have one or two (large) stale temporary file(s)
left in your temporary directory (Generally this only happens on Windows 9x).
这个错误 我应该怎么做呢?
@Veary 从这个错误来看,好像是因为文件超2G的问题,你试一下把这个2.7G的文件分卷压缩成几个1G大小的文件试一下。
如果出现这个错误的时候文件可以正常生成,那么可以忽略它,文件超2G的问题在Win9X上才会有,比如Win95/98,对于新的操作系统应该没啥影响。
大D您好,要打包大文件超过2GB的方法,除了分卷还有其他方法么。。。
@bubble 没啥太好的办法