expand.exe
定义
expand.exe是微软Windows系统内置的一个命令行实用程序,其正式名称为微软文件展开实用程序(Microsoft File Expansion Utility),功能是把一个或多个压缩文件解压还原[1]。它处理的对象主要是CAB格式的压缩包,也能识别安装介质中扩展名末位被替换为下划线的压缩文件,例如以 ex_、co_、sy_ 结尾的文件[3][4]。
该工具不是图形界面压缩软件的替代品,而是一个可以写进批处理与安装脚本的小型解压器,常被用来从发行磁盘中取回个别文件[5]。它的可执行文件位于系统目录下,在32位与64位Windows中分别出现在 system32 和 sysWOW64 目录[6]。
原理
CAB压缩包以固定的4字节标记MSCF开头,内部按「文件夹」(folder)组织,每个folder是一个独立的压缩块,同一块内的多个文件被一并压缩,因此压缩效率高于逐个文件单独压缩[7]。expand.exe读取这些结构,按块解压后再把数据写回目标位置。
该工具支持的压缩算法随版本扩展。按实测资料,Windows 2000及之后随系统提供的版本可以处理MSZIP、LZX、Quantum与不压缩(NULL)4种方式,而Windows NT时代的2.5版只能处理MSZIP、Quantum与不压缩,不能解开LZX压缩包[3]。其中MSZIP属于DEFLATE的一种封装,LZX由Jonathan Forbes与Tomi Poutanen发明,Quantum则授权自Quantum压缩工具的作者David Stafford[7]。
基本调用形式为 expand 源文件 [目标位置],配合开关改变行为:-r 在展开时重命名文件,-d 只列出包内清单而不解压,-f:文件 指定需要展开的成员(可用通配符 * 与 ?),-i 则忽略包内目录结构、把所有内容平铺到同一个目录。源参数可以包含盘符、目录与文件名,并可使用通配符[8]。
当源参数指向多个文件且未指定 -r 时,目标必须是一个已存在的目录;若目标写成具体文件名,则只能对应单个源文件[8]。展开过程中,工具会保留包内记录的修改日期与时间,这一点被一些构建系统用于判断输出文件是否过期[9]。
发展历程
微软文件展开实用程序可追溯到1990年的MS-DOS 5,当时随软盘发行,用于把安装盘上被压缩的系统文件还原到硬盘[1][10]。微软知识库文档记载,MS-DOS 5.0a起该命令增加了两条状态提示、允许一次指定多个源文件、支持交互式输入,并引入了「扩展名末位换成下划线」的有限通配匹配[2]。
进入Windows时代后,工具的功能随CAB格式的用法一起扩展。Windows NT时期的2.5版只提供 -r 开关;Windows 2000与Windows XP附带的5.00版增加了 -d 与 -f:,并开始支持LZX压缩;Windows 7与Windows 8所带的6.x版又加入 -i,能按包内记录的路径创建目录后展开文件[11][1]。
针对Windows Vista及其后续更新的更新包,微软引入了IPD(Intra-Package Delta)压缩以减少包体积,要完整查看包内容必须使用随Windows ADK或随Vista、Windows 7、Windows 8发布的expand.exe,更早的版本无法解开这类数据[12][13]。微软现行文档列出的适用范围已包括Windows Server 2012至2022以及Windows 10、Windows 11等版本。
应用
最常见的用途是从发行介质中提取单个文件。微软软件安装盘上不少文件以「_」结尾压缩存放,当系统中少数文件缺失或损坏时,可以用该命令只把需要的文件解出来,例如把安装盘中的某个驱动程序还原为正常扩展名后覆盖到系统目录[4]。文档给出的典型示例包括 expand -r C:\package.cab C:\Files 与 expand C:\package.cab -f:compressed.inf C:\Files[12]。
在系统修复场景中,该命令也可在恢复控制台或Windows恢复环境(Windows Recovery Environment)中以另一组参数运行,用于在没有完整图形界面的情况下取回文件[5]。此外,Windows Embedded Standard 等嵌入式系统工具包也会附带该程序,供部署镜像时解包更新[14]。
软件开发中也把它当作系统自带的CAB解包器调用。Chromium项目的构建脚本就通过子进程调用 expand 并配合 -F: 参数,从CAB包中取出指定文件,再移动到输出目录[9][15]。由于其解包能力可被脚本复用,攻击者也曾借助它把CAB内容还原成可执行文件,或把文件写入NTFS备用数据流[16]。
局限
该工具只做解压,不能创建CAB包;生成压缩包需要 makecab.exe 等另一侧的工具[7]。它也不支持CAB以外的常见归档格式,处理的压缩方式限于CAB格式定义的那几种[3]。
路径处理是早期版本的明显短板。6.0之前的版本(即Windows Vista以前随系统提供的版本)在解包含子目录的CAB时,会把所有文件还原到同一个目录,可能造成同名文件互相覆盖;只有6.x版起才按包内路径建立目录[1][7]。论坛实测还指出,旧版本在 -d 输出清单中同样会丢掉路径信息[11]。
版本配套也构成限制。面对使用IPD压缩的更新包,只有随Windows ADK或随Vista及之后系统发布的版本才能完整展开,其他版本或第三方解压工具只能看到清单类文件而无法取得全部更新内容[12][14]。并发调用同样存在制约:该程序会在目标目录下创建固定名称的临时目录,多个进程同时解包同一输出位置会相互干扰,调用方需自行规避[9]。
参见
-
CAB —— 该工具主要处理的微软压缩归档格式。
-
makecab.exe —— 用于生成CAB压缩包的命令行工具,与 expand.exe 功能相对。
-
LZX —— CAB格式可采用的一种压缩算法。
-
MS-DOS —— 该命令最早随其5.0版发行。
-
Windows ADK —— 其附带版本可展开使用IPD压缩的更新包。
参考资料
- EXPAND.exe [引用日期2026-10-29]
- Q80751: MS-DOS EXPAND.EXE Functionality [引用日期2026-10-29]
- [Undocumented] Expand.exe [引用日期2026-10-29]
- Expand、Fasthelp、Fc命令使用说明 [引用日期2026-10-29]
- hh875569(v=ws [引用日期2026-10-29]
- Expand.exe [引用日期2026-10-29]
- Cabinet (file format): Difference between revisions [引用日期2026-10-29]
- --- [引用日期2026-10-29]
- extract_from_cab.py - chromium/src/build [引用日期2026-10-29]
- List of DOS commands [引用日期2026-10-29]
- SS64 Forum [引用日期2026-10-29]
- dn898569(v=vs [引用日期2026-10-29]
- cc722332(v=ws [引用日期2026-10-29]
- ff794023(v=winembedded [引用日期2026-10-29]
- build/extract_from_cab.py - platform/external/cronet [引用日期2026-10-29]
- Expand [引用日期2026-10-29]