Bugsong 发表于 2012-6-28 15:36:29

[FWD]实战NSIS——7z分卷压缩自解压(水一帖~闪人~)

本帖最后由 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_SystemNullsoft 脚本安装系统(英语:Nullsoft Scriptable Install System,缩写:NSIS)为一个开放源代码脚本驱动的封装安装档用工具。可以用其脚本语言自定安装的流程,同时支援多种语系的安装接口。好吧,你可以略过这一段不读。三、准备7z,这个家伙很让人纠结。自解压程序吧,那就不能分卷,分卷就不能自解压。还好7z提供了命令行版本的7z。大家可以到7z的官方网站下载。NSIS大家就上网去找吧,有的是。NSIS属于脚本类的打包程序,大家可以下载一个VNISedit,这东西可以代码高亮和代码补完,很方便实用。四、7z咱们先来了解一下7z的问题。7z不能创建支持分卷压缩的自解压程序,压缩出来的文件名类似于X.7z.001,依此类推。并且分卷只能通过7z程序来解压缩。7z提供的命令行模式程序——7za可以帮我们完成加入打包程序/制作安装程序这一类的工作。查阅了7za的help文件,得知到7z命令行模式可以使用以下参数:
COMMANDDESCRIPTION
aAdd
bBenchmark
dDelete
eExtract
iList
tTest
uUpdate
xXtract 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.
Examples7z x archive.zipextracts all files from the archive archive.zip to the current directory.7z x archive.zip -oc:\soft *.cpp -rextracts 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放置到了
1D:\Source Code\NSIS

目录下。大家可以将代码修改修改适用于自己的压缩包,编译运行。文件就会被顺利的解压缩到指定目录。http://www.bugsong.net/wp-content/uploads/2012/06/v01.jpg但是这个版本有这样一些问题: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的帮助文件,里面有详细的函数控制以及函数参数的相关信息。一个安装脚本可以有多个过程,用于创建诸如卸载程序或者绑定首页一类的工作。大家可以看到我们不仅仅生成了安装程序,也生成了卸载程序。安装程序也有自定义安装路径的页面了。http://www.bugsong.net/wp-content/uploads/2012/06/v02.jpg总体上来看已经有点安装程序的样子了。可是这还不够。现在的这个界面太老太丑了。。而且默认还是英文界面。于是我们继续改进。七、脚本范例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

http://www.bugsong.net/wp-content/uploads/2012/06/v03.jpg
脚本范例V0.3 欢迎界面
http://www.bugsong.net/wp-content/uploads/2012/06/v03-1.jpg
脚本范例V0.3 安装目录选择界面
八、结束嗯,洋洋洒洒凑了一堆字。基本上来讲,通过NSIS自解压7z分卷的目的已经达到了。只用把代码内关于文件名的部分进行调整即可使用。权当抛砖引玉。。喜欢折腾的看官,您可以去折腾着玩儿了~九、参考
1.NSIS用户手册
2.7za用户指南对以上文档文献的编纂者、翻译者表示感谢。

ぃ野花のAriosモ 发表于 2012-6-28 15:39:55

@@32!!技术贴【水你煤

a091a 发表于 2012-6-28 19:18:10

ぃ野花のAriosモ 发表于 2012-6-28 15:39 static/image/common/back.gif
技术贴【水你煤

你到底是怎樣才能這麼快的?

rock94 发表于 2012-7-10 07:53:26

虽然一点也不明白但是真心牛掰了这玩意

小G去美帝学EMBS 发表于 2012-12-28 11:44:57

好高级的样子。。。。
页: [1]
查看完整版本: [FWD]实战NSIS——7z分卷压缩自解压(水一帖~闪人~)