powershell - 压缩存档并保留相对路径
问题描述
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
解决方案
看来Compress-Archive
(从 Windows PowerShell v5.1 开始)不支持您想要的:
以文件夹为目标递归地将该文件夹的子树添加到存档中,但仅通过目标文件夹的名称(它成为存档中的子文件夹),而不是其路径。
具体来说,
Compress-Archive -Path scripts\module2 -DestinationPath tmp.zip
将(递归地)存储scripts\module2
in的内容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等外部程序,
推荐阅读
- uikit - SwifUI 通过实现 UIViewRepresentable 使用 UIKit 组件
- umbraco - Umbraco 8.0 登录问题
- github - github页面构建失败:超时
- javascript - Javascript 事件计时 + 3rd 方事件,寻找比 setTimeOut() 更好的选择
- javascript - 对象中数组的Ajax图像显示
- datatables - 想要折叠数据表中的所有行组,但只折叠第一行
- php - 当我尝试在 laravel 中上传图片时,我不断收到 419 错误页面已过期
- artifactory - 无法配置 SSO,错误:“输入 AssertionConsumerService 的有效 url”
- amazon-web-services - How to get arn of EC2 instance in AWS
- c# - C#试图覆盖呈现文本的iText7的一部分