我很难获得 compress-archive
做我想做的事……
我有一个根项目文件夹,我想压缩子目录中的一些文件并保留相对路径。例如:
/
├── _scripts
├── ├─_module1
| | └── filex.js
| └─_module2
| ├── file1.js
| └── file2.txt
所以从我的根目录,我想创建一个包含 module2/*
的 zip 文件。 ,我想保留文件夹结构。我希望我的 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
的内容在 tmp.zip
,但不包含存档内部路径 .\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
否则,您也许可以找到解决方案:
[System.IO.Compression.ZipFile]
class直接地;您可以使用 Add-Type -Assembly System.IO.Compression.FileSystem
将其加载到您的 session 中(在 PowerShell Core 中不需要)。 关于powershell - 压缩归档并保留相对路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51392050/