PowerShell CompressArchive -更新到zip文件内的目录

5w9g7ksd  于 2022-12-13  发布在  Shell
关注(0)|答案(2)|浏览(219)

我正在尝试编写PowerShell脚本来更新zip文件中的文件,因为我需要为多个zip文件自动执行此操作。我的问题是,我需要更新的文件位于zip文件中的几个目录中,例如:
myZip.zip /目录2/文件
我尝试使用命令,例如

Compress-Archive -Path .\file.txt -Update -DestinationPath .\myZip.zip

但是,当我运行该命令时,文件被添加到zip文件的根目录中,而不是我需要的dir 1/dir 2/目录中。
这可能吗?

umuewwlo

umuewwlo1#

确定-Path必须引用与zip文件中相同的目录结构。
我的测试zip具有以下目录结构:

myZip.zip
-> dir1
-> -> dir2
-> -> -> dir3
-> -> -> -> myFile.txt

我的参考目录定义为:

dir1
-> dir2
-> -> dir3
-> -> -> myFile.txt

我就可以跑了
Compress-Archive -Path .\dir1 -DestinationPath .\myZip.zip -Update
这会将文件放到正确的目录中。
感谢@SantiagoSquarzon和@metablaster提供的相关服务

yjghlzjz

yjghlzjz2#

这就是如何直接使用.NET API更新ZipArchiveEntry的方法,此方法不需要外部应用程序或Compress-Archive。它也不需要模拟Zip结构来定位正确的文件,相反,它需要您通过传递正确的相对路径(dir1/dir2/dir3/myFile.txt)作为.GetEntry(..)的参数来定位正确的Zip条目。

using namespace System.IO
using namespace System.IO.Compression

Add-Type -AssemblyName System.IO.Compression

$filestream = (Get-Item .\myZip.zip).Open([FileMode]::Open)
$ziparchive = [ZipArchive]::new($filestream, [ZipArchiveMode]::Update)
# relative path of the ZipEntry must be precise here
# ZipEntry path is relative, note the forward slashes are important
$zipentry   = $ziparchive.GetEntry('dir1/dir2/dir3/myFile.txt')
$wrappedstream = $zipentry.Open()
# this is the source file, used to replace the ZipEntry
$copyStream    = (Get-Item .\file.txt).OpenRead()
$copyStream.CopyTo($wrappedstream)
$wrappedstream, $copyStream, $ziparchive, $filestream | ForEach-Object Dispose

相关问题