首页 > 解决方案 > 压缩存档并保留相对路径

问题描述

compress-archive我在做我想做的事时遇到了挑战……

我有一个根项目文件夹,我想压缩子目录中的一些文件并保留相对路径。例如: / ├── _scripts ├── ├─_module1 | | └── filex.js | └─_module2 | ├── file1.js | └── file2.txt

因此,我想从我的根目录创建一个包含 的 zip 文件module2/*,并且我想保留文件夹结构。我希望我的 zip 包含: scripts/module2/file1.js scripts/module2/file2.txt

但是当我从根文件夹运行它时: Compress-Archive -Path "scripts\module2\*" -DestinationPath tmp.zip

zip 文件的内容仅包含: /file1.js /file2.txt

标签: powershellzip

解决方案


看来Compress-Archive(从 Windows PowerShell v5.1 开始)不支持您想要的:

以文件夹为目标递归地将该文件夹的子树添加到存档中,但仅通过目标文件夹的名称(它成为存档中的子文件夹),而不是其路径

具体来说,

Compress-Archive -Path scripts\module2 -DestinationPath tmp.zip

将(递归地)存储scripts\module2in的内容tmp.zip,但不使用 archive-internal path .\scripts\module2,仅使用.\module2- 目标文件夹的名称最后一个输入路径组件)。

这意味着您必须传递文件夹scripts来获取所需的存档内部路径,但这将始终包括 的整个子树scripts因为它Compress-Archive不提供包含/排除机制。


一个 - 麻烦 - 选项是在文件夹中重新创建所需的层次结构,$env:TEMP将目标文件夹复制到那里,Compress-Archive针对重新创建的层次结构的根运行,然后清理:

New-Item -Force -ItemType Directory $env:TEMP/scripts
Copy-Item -Recurse -Force scripts/module2 $env:TEMP/scripts
Compress-Archive -LiteralPath $env:TEMP/scripts -DestinationPath tmp.zip
Remove-Item $env:TEMP/Scripts -Recurse -Whatif

否则,您可能会找到解决方案:

  • 直接使用 .NET v4.5+[System.IO.Compression.ZipFile]您可以使用(在 PowerShell CoreAdd-Type -Assembly System.IO.Compression.FileSystem中不需要)将其加载到您的会话中。

  • 通过使用7-Zip等外部程序,


推荐阅读