搜索
有爱,有技术,有你^_^)y
╱人◕‿‿◕人╲订下契约(注册新用户)

合作站点账号登陆

QQ登录

只需一步,快速开始

快捷导航
查看: 2397|回复: 4
收起左侧

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

[复制链接]

该用户从未签到

25

主题

21

好友

1万

积分

第一章

积分
10837
发表于 2012-6-28 15:36:29 | 显示全部楼层 |阅读模式

╱人◕‿‿◕人╲定下契约

您需要 登录 才可以下载或查看,没有账号?╱人◕‿‿◕人╲订下契约(注册新用户)

x
本帖最后由 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命令行模式可以使用以下参数:

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.
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
D:\Source Code\NSIS

目录下。

大家可以将代码修改修改适用于自己的压缩包,编译运行。文件就会被顺利的解压缩到指定目录。

但是这个版本有这样一些问题:

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用户指南

对以上文档文献的编纂者、翻译者表示感谢。


评分

参与人数 1宅币 +30 贡献 +4 收起 理由
hcl + 30 + 4 这绝对不是水啊。T_T

查看全部评分

签名被小宅喵吞掉了~~~~(>_<)~~~~
回复

使用道具 举报

该用户从未签到

388

主题

2042

好友

10万

积分

懒人

积分
104569
发表于 2012-6-28 15:39:55 | 显示全部楼层
技术贴【水你煤

点评

大神( ̄︶ ̄)y: 5.0
大神( ̄︶ ̄)y: 5
猜不到........................  发表于 2012-6-28 19:19
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

签到天数: 1 天

连续签到: 1 天

[LV.1]初来乍到

35

主题

90

好友

2万

积分

第一章

积分
25968
发表于 2012-6-28 19:18:10 | 显示全部楼层
ぃ野花のAriosモ 发表于 2012-6-28 15:39
技术贴【水你煤

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

点评

大神( ̄︶ ̄)y: 5.0 魂淡淡o( ̄ヘ ̄o#): 5.0
大神( ̄︶ ̄)y: 5 魂淡淡o( ̄ヘ ̄o#): 5
泥猜  发表于 2012-6-28 19:18
無聊的暑假阿...
回复 支持 反对

使用道具 举报

该用户从未签到

6

主题

8

好友

4817

积分

序章

积分
4817
发表于 2012-7-10 07:53:26 | 显示全部楼层
虽然一点也不明白但是真心牛掰了这玩意
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

该用户从未签到

8

主题

14

好友

4548

积分

序章

积分
4548
发表于 2012-12-28 11:44:57 | 显示全部楼层
好高级的样子。。。。
签名被小宅喵吞掉了~~~~(>_<)~~~~
回复 支持 反对

使用道具 举报

本版积分规则

小黑屋|手机版|技术宅(Z站|基宅) ( 粤ICP备18082987号-1 )

GMT+8, 2025-7-6 16:09 , Processed in 0.165053 second(s), 27 queries , Redis On.

Copyright © 2018 技术宅社区

Powered by Discuz! X3.5

快速回复 返回顶部 返回列表