makecab 是 Windows 操作系统自带的一个命令行工具,其主要功能是创建 CAB 压缩文件,CAB (Cabinet) 文件是一种常见的压缩档案格式,类似于 ZIP 或 RAR,由微软开发,广泛用于 Windows 系统的软件分发、驱动程序安装包(如 .inf 文件引导的安装)和系统文件补丁中。

命令简介
makecab 的核心作用是将一个或多个文件和文件夹压缩成一个 .cab 文件,它不仅支持压缩,还支持对文件进行数字签名,这对于确保软件包的完整性和安全性非常重要。
语法格式
makecab 命令的基本语法如下:
makecab [/L <源文件夹>] [/D <定义名>=<值>] <源文件> [<目标文件.cab>]
或者,当你需要压缩整个目录时,更常见的用法是:
makecab /f <列表文件> [/L <源文件夹>] [/D <定义名>=<值>] <目标文件.cab>
主要参数详解
为了更好地理解,我们将参数分为几类:

核心参数 (必须或常用)
<源文件>: 指定要压缩的一个或多个文件,可以使用通配符 和 。- 示例:
makecab C:\Temp\myapp.txt C:\Output\myapp.cab - 示例:
makecab C:\Temp\*.dll C:\Output\libs.cab
- 示例:
<目标文件.cab>: 指定生成的 CAB 文件名和路径,如果省略,默认会在当前目录下生成一个名为setup.inf的 CAB 文件(不推荐省略)。/f <列表文件>: 这是最强大的参数之一,它让你通过一个文本文件来精确控制要压缩哪些文件,以及它们的路径、属性等。- 列表文件格式:每行一个文件,格式为
目标路径=源路径。 - 示例列表文件
list.txt:MyApp.exe=C:\Source\bin\Release\MyApp.exe config.ini=C:\Source\config\default.ini \bin\helper.dll=C:\Source\lib\helper.dll - 使用列表文件:
makecab /f list.txt C:\Output\MyApp.cab
- 列表文件格式:每行一个文件,格式为
选项参数
/L <源文件夹>: 当你使用通配符或列表文件时,此参数可以指定一个基础源文件夹,所有文件路径都将被视为相对于此文件夹的相对路径。- 示例: 假设文件结构为
C:\Project\files\file1.txt和C:\Project\files\sub\file2.txt,执行makecab /L C:\Project\files\ *.txt myfiles.cab会将file1.txt和sub\file2.txt压缩进myfiles.cab。
- 示例: 假设文件结构为
/D <定义名>=<值>: 用于向 CAB 文件中嵌入元数据(也称为“文件夹定义”),这些信息可以在解压时被读取。- 常用的定义名:
Name: CAB 文件或软件的名称。Title: 软件的标题。Provider: 提供者名称。Version: 版本号。Description: 描述信息。
- 示例:
makecab /D "Name=MyCoolApp" /D "Version=1.0.0" myapp.exe myapp.cab
- 常用的定义名:
/C: 如果源文件是另一个 CAB 文件,此参数会将其内容提取出来再重新压缩(很少使用)。/V <数字>: 设置详细输出级别(Verbosity Level)。/V0或/V1: 最少输出(默认)。/V2: 显示中等信息。/V3或/V4: 显示最详细的输出,包括文件名、压缩率等,对调试非常有用。
高级/签名参数
- `/!: 在源文件路径前使用此符号,可以防止文件被压缩,而是作为“未压缩的存储”文件放入 CAB 中,对于某些已经高度压缩或需要直接读取的文件(如某些视频、音频格式)很有用。
/A: 强制替换目标文件(如果已存在)。/J: 将一个已有的 CAB 文件追加到另一个 CAB 文件中(不常用)。/P: 指定解压时需要显示的许可协议文件(.rtf或.txt)。/S: 在签名模式下使用,会调用SignTool.exe对生成的 CAB 文件进行签名。
实用示例
示例 1:压缩单个文件
将 C:\Temp\report.docx 压缩成 C:\Backups\report.cab。
makecab C:\Temp\report.docx C:\Backups\report.cab
示例 2:压缩一个文件夹下的所有文件
将 C:\MyProject\src 文件夹下的所有 .log 文件压缩成 C:\MyProject\logs.cab。
makecab C:\MyProject\src\*.log C:\MyProject\logs.cab
示例 3:使用列表文件精确控制压缩内容
假设你的项目文件分布在不同的目录,但你希望解压后它们都在一个特定的文件夹结构下。
-
创建列表文件
compress.txt:
(图片来源网络,侵删)MyApp.exe=C:\Project\bin\MyApp.exe \data\config.json=C:\Project\config\settings.json \lib\net48\Newtonsoft.Json.dll=C:\Project\packages\Newtonsoft.Json.13.0.1\lib\net48\Newtonsoft.Json.dll -
执行压缩命令:
makecab /f compress.txt C:\Deployment\MyApp_v1.0.cab
解压
MyApp_v1.0.cab后,会得到一个包含MyApp.exe、data\config.json和lib\net48\Newtonsoft.Json.dll的目录结构。
示例 4:添加元数据信息
在压缩文件时,添加软件名称和版本号。
makecab /D "Name=DataAnalyzer" /D "Version=2.1.5" /D "Provider=MyCompany" C:\DataAnalyzer\*.exe C:\Releases\DataAnalyzer.cab
示例 5:使用详细输出模式进行调试
如果你想知道哪些文件被压缩了,压缩率如何,可以开启详细模式。
makecab /V3 C:\Temp\*.txt C:\Output\textfiles.cab
输出会类似这样:
2005-03-15 14:00:00 12345 <JU> 12345 mynote1.txt
2005-03-15 14:00:01 23456 <JU> 23456 mynote2.txt
...
<JU> 表示使用了 JCab 压缩算法(LZX),数字表示压缩前后的字节数。
与 expand 命令的配合使用
makecab 的“兄弟”命令是 expand,用于解压 CAB 文件。
解压语法:
expand [-r] <源文件.cab> -F:<目标文件> <目标路径>
-r: 递归解压,CAB 中包含目录结构,会一并创建。-F:<目标文件>: 只解压 CAB 中的指定文件。
示例:
- 解压
C:\Backups\report.cab到当前目录:expand C:\Backups\report.cab
- 解压
MyApp.cab到C:\ExtractedApp目录,并保持其内部结构:expand -r MyApp.cab -F:* C:\ExtractedApp
- 只解压
MyApp.cab中的MyApp.exe文件:expand MyApp.cab -F:MyApp.exe C:\ExtractedApp
注意事项
- Windows 内置工具:
makecab是 Windows 安装的一部分,无需额外安装,在命令提示符或 PowerShell 中直接使用即可。 - 现代替代品: 对于日常的文件压缩和解压,.zip 格式更为通用,Windows 10/11 自带了强大的
tar和zip支持(通过 PowerShell 或命令行),用户界面也更友好。makecab主要用于特定的开发场景,如创建 Windows 安装包、驱动程序或需要 CAB 格式的旧系统维护。 - 路径限制: 和许多命令行工具一样,路径中如果包含空格,最好用双引号括起来,
"C:\My Documents\file.txt"。
makecab 是一个功能强大但相对专业的命令行工具,掌握它对于 Windows 系统管理员和开发者来说非常有用,尤其是在处理软件打包和分发任务时。
