Как создать zip-архив с помощью PowerShell? - PullRequest
225 голосов
/ 20 июля 2009

Можно ли создать zip-архив с помощью PowerShell?

Ответы [ 25 ]

248 голосов
/ 09 ноября 2012

Чистая альтернатива PowerShell, которая работает с PowerShell 3 и .NET 4.5 (если вы можете ее использовать):

function ZipFiles( $zipfilename, $sourcedir )
{
   Add-Type -Assembly System.IO.Compression.FileSystem
   $compressionLevel = [System.IO.Compression.CompressionLevel]::Optimal
   [System.IO.Compression.ZipFile]::CreateFromDirectory($sourcedir,
        $zipfilename, $compressionLevel, $false)
}

Просто введите полный путь к zip-архиву, который вы хотите создать, и полный путь к каталогу, содержащему файлы, которые вы хотите сжать.

214 голосов
/ 26 марта 2015

PowerShell v5.0 добавляет Compress-Archive и Expand-Archive командлетов. На связанных страницах есть полные примеры, но суть этого:

# Create a zip file with the contents of C:\Stuff\
Compress-Archive -Path C:\Stuff -DestinationPath archive.zip

# Add more files to the zip file
# (Existing files in the zip file with the same name are replaced)
Compress-Archive -Path C:\OtherStuff\*.txt -Update -DestinationPath archive.zip

# Extract the zip file to C:\Destination\
Expand-Archive -Path archive.zip -DestinationPath C:\Destination
117 голосов
/ 20 июля 2009

Если вы зайдете в CodePlex и возьмете Расширения сообщества PowerShell , вы можете использовать их write-zip командлет.

С

CodePlex находится в режиме только для чтения при подготовке к отключению

Вы можете перейти в Галерея PowerShell .

55 голосов
/ 12 июня 2014

Родной путь с новейшей платформой .NET 4.5, но полностью лишенный функциональности:

Создание:

Add-Type -Assembly "System.IO.Compression.FileSystem" ;
[System.IO.Compression.ZipFile]::CreateFromDirectory("c:\your\directory\to\compress", "yourfile.zip") ;

Добыча:

Add-Type -Assembly "System.IO.Compression.FileSystem" ;
[System.IO.Compression.ZipFile]::ExtractToDirectory("yourfile.zip", "c:\your\destination") ;

Как уже упоминалось, полностью без функций, поэтому не ожидайте перезаписать флаг.

ОБНОВЛЕНИЕ: см. Ниже о других разработчиках, которые расширяли это за годы ...

42 голосов
/ 20 апреля 2011

Установите 7zip (или загрузите вместо него версию командной строки) и используйте этот метод PowerShell:

function create-7zip([String] $aDirectory, [String] $aZipfile){
    [string]$pathToZipExe = "$($Env:ProgramFiles)\7-Zip\7z.exe";
    [Array]$arguments = "a", "-tzip", "$aZipfile", "$aDirectory", "-r";
    & $pathToZipExe $arguments;
}

Вы можете позвонить так:

create-7zip "c:\temp\myFolder" "c:\temp\myFolder.zip"
15 голосов
/ 19 октября 2012

Редактировать два - Этот код является уродливым, уродливым клугем из древних времен. Вы этого не хотите.

Это сжимает содержимое .\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 для файлов конфигурации требуется неподдерживаемый настройка .

12 голосов
/ 15 декабря 2015

Предоставление ниже другого варианта. Это заархивирует полную папку и запишет архив по указанному пути с заданным именем.

Требуется .NET 3 или выше

Add-Type -assembly "system.io.compression.filesystem"

$source = 'Source path here'    
$destination = "c:\output\dummy.zip"

If(Test-path $destination) {Remove-item $destination}

[io.compression.zipfile]::CreateFromDirectory($Source, $destination)
7 голосов
/ 20 июля 2009

Для сжатия я бы использовал библиотеку (7-Zip хорош как Михал предлагает ).

Если вы установите 7-Zip , установленный каталог будет содержать 7z.exe, который является консольным приложением.
Вы можете вызвать его напрямую и использовать любую опцию сжатия, какую пожелаете.

Если вы хотите работать с DLL, это также возможно.
7-Zip - бесплатная программа с открытым исходным кодом.

6 голосов
/ 20 октября 2010

А как насчет System.IO.Packaging.ZipPackage?

Для этого потребуется .NET 3.0 или выше.

#Load some assemblys. (No line break!)
[System.Reflection.Assembly]::Load("WindowsBase, Version=3.0.0.0, Culture=neutral, PublicKeyToken=31bf3856ad364e35")

#Create a zip file named "MyZipFile.zip". (No line break!)
$ZipPackage=[System.IO.Packaging.ZipPackage]::Open("C:\MyZipFile.zip",
   [System.IO.FileMode]"OpenOrCreate", [System.IO.FileAccess]"ReadWrite")

#The files I want to add to my archive:
$files = @("/Penguins.jpg", "/Lighthouse.jpg")

#For each file you want to add, we must extract the bytes
#and add them to a part of the zip file.
ForEach ($file In $files)
{
   $partName=New-Object System.Uri($file, [System.UriKind]"Relative")
   #Create each part. (No line break!)
   $part=$ZipPackage.CreatePart($partName, "",
      [System.IO.Packaging.CompressionOption]"Maximum")
   $bytes=[System.IO.File]::ReadAllBytes($file)
   $stream=$part.GetStream()
   $stream.Write($bytes, 0, $bytes.Length)
   $stream.Close()
}

#Close the package when we're done.
$ZipPackage.Close()

через Андерс Хессельбом

5 голосов
/ 04 апреля 2018

Вот собственное решение для PowerShell v5, использующее командлет Compress-Archive Создание Zip-файлов с помощью PowerShell .

См. Также документы Microsoft для Компресс-архив .

Пример 1:

Compress-Archive `
    -LiteralPath C:\Reference\Draftdoc.docx, C:\Reference\Images\diagram2.vsd `
    -CompressionLevel Optimal `
    -DestinationPath C:\Archives\Draft.Zip

Пример 2:

Compress-Archive `
    -Path C:\Reference\* `
    -CompressionLevel Fastest `
    -DestinationPath C:\Archives\Draft

Пример 3:

Write-Output $files | Compress-Archive -DestinationPath $outzipfile
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...