Редактировать два - Этот код является уродливым, уродливым клугем из древних времен. Вы этого не хотите.
Это сжимает содержимое .\in
до .\out.zip
с System.IO.Packaging.ZipPackage, следуя примеру здесь
$zipArchive = $pwd.path + "\out.zip"
[System.Reflection.Assembly]::Load("WindowsBase,Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")
$ZipPackage=[System.IO.Packaging.ZipPackage]::Open($zipArchive,
[System.IO.FileMode]"OpenOrCreate", [System.IO.FileAccess]"ReadWrite")
$in = gci .\in | select -expand fullName
[array]$files = $in -replace "C:","" -replace "\\","/"
ForEach ($file In $files)
{
$partName=New-Object System.Uri($file, [System.UriKind]"Relative")
$part=$ZipPackage.CreatePart($partName, "application/zip",
[System.IO.Packaging.CompressionOption]"Maximum")
$bytes=[System.IO.File]::ReadAllBytes($file)
$stream=$part.GetStream()
$stream.Write($bytes, 0, $bytes.Length)
$stream.Close()
}
$ZipPackage.Close()
Редактировать: Ненадежно для больших файлов, может быть> 10 МБ, YMMV. Что-то , чтобы сделать с доказательствами домена приложения и изолированным хранилищем. Более дружелюбный .NET 4.5 подход прекрасно работает с PS v3, но в моем случае требовалось больше памяти. Для использования .NET 4 из PS v2 для файлов конфигурации требуется неподдерживаемый настройка .