Compress-Archive 是干什么的
Compress-Archive 把文件或目录打包成 zip,Expand-Archive 解压,两者是 PowerShell 内置的归档组合,不用装第三方工具就能完成日志归档、备份打包与交付件整理。它们基于 .NET 的压缩实现,兼容标准 zip 格式,因此 Windows、Linux、macOS 都能打开;代价是压缩算法与参数都比较基础,追求压缩率或分卷时需要换 7-Zip 或 tar。
基本信息
| 适用平台 | Windows PowerShell 5.1 与 PowerShell 7+ |
|---|---|
| 打包 | Compress-Archive -Path <源> -DestinationPath <目标.zip> [-Force] |
| 解压 | Expand-Archive -Path <zip> -DestinationPath <目录> [-Force] |
| 可选参数 | -CompressionLevel Optimal/Fastest/NoCompression;-Update 追加条目 |
典型使用场景
- 日志归档:把按天切割的日志目录打包成 zip 后删除原文件释放空间
- 交付物整理:把打包好的程序目录压缩成一个文件发给对方
- 备份前预处理:把大量小文件压缩后再走传输,减少传输开销
- 计划任务自动化:夜间定时压缩并保留最近 N 份
- 临时收集证据:把故障现场的相关文件打包留档
常用示例
常用示例
# 把目录内容打包(-Force 覆盖已有包)
Compress-Archive -Path D:\Logs\* -DestinationPath D:\Bak\logs.zip -Force
# 只打包指定类型,减少体积
Get-ChildItem D:\Logs -Filter *.log | Compress-Archive -DestinationPath D:\Bak\logs.zip -Force
# 解压到目标目录
Expand-Archive D:\Bak\logs.zip -DestinationPath D:\Restore -Force
# 追加新文件到现有包(同名条目会被替换)
Compress-Archive -Path D:\Logs\new.log -DestinationPath D:\Bak\logs.zip -Update
# 校验解压结果
(Get-ChildItem D:\Restore -Recurse -File).Count常见限制对照
| 限制 | 数值/条件 | 应对方式 |
|---|---|---|
| 单包大小 | zip 格式约 4GB 级别限制 | 分卷或改用 7z/tar |
| 条目数量 | 极多小文件时性能下降明显 | 先按目录分批打包 |
| 文件被占用 | 正在写入的文件会失败 | 先停写入或跳过该文件 |
| 路径长度 | 超长路径在旧系统可能失败 | 缩短目标路径或启用长路径支持 |
-Path 用 D:\Logs\* 是把目录内容装进包,用 D:\Logs 则会把目录本身作为顶层条目放进去。两者解压后的结构完全不同,交付前先解压一份核对目录层级。
对已存在的包使用 -Force 会整体重建,不是增量覆盖;要往包里加文件用 -Update。压缩过程会占 CPU 与磁盘 IO,大批量打包建议放在维护窗口或错峰执行。
zip 本身的加密支持很弱,Compress-Archive 不提供密码保护。含敏感数据的归档不要指望 zip 口令,改用受控目录、加密磁盘或专业工具。