It appears that Compress-Archive
(as of Windows PowerShell v5.1) doesn't support what you want:
Targeting a folder recursively adds that folder's subtree to the archive, but only by the target folder's name (which becomes a child folder inside the archive), not its path.
Specifically,
Compress-Archive -Path scriptsmodule2 -DestinationPath tmp.zip
will (recursively) store the contents of scriptsmodule2
in tmp.zip
, but not with archive-internal path .scriptsmodule2
, just with .module2
- the target folder's name (the last input path component).
The implication is that you'd have to pass folder scripts
instead to get the desired archive-internal path, but that would invariably include the entire subtree of scripts
, given that Compress-Archive
offers no inclusion/exclusion mechanism.
One - cumbersome - option is to recreate the desired hierarchy in, say, the $env:TEMP
folder, copy the target folder there, run Compress-Archive
against the root of the recreated hierarchy, and then clean up:
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
Otherwise, you may be able to find a solution:
by using the .NET v4.5+ [System.IO.Compression.ZipFile]
class directly; you can load it into your session with Add-Type -Assembly System.IO.Compression.FileSystem
(not necessary in PowerShell Core).
by using external programs such as 7-Zip,
与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…