Заметки о Windows и других программных продуктах Microsoft...

Создание ZIP архива с помощью PowerShell

Создание ZIP архива с помощью PowerShell

Обычно при необходимости автоматизировать создание архивных копий я использую утилиту 7zip. Она бесплатна, удобна в использовании и имеет интерфейс командной строки, что позволяет использовать ее в скриптах. Однако установка стороннего софта на сервер не всегда возможна, поэтому при необходимости можно создавать zip архивы, используя встроенный в Windows функционал.

Для создания zip архива можно воспользоваться классом ZipFile, появившимся в .NET Framework 4.5. Этот класс не загружен по умолчанию, поэтому первое, что надо сделать — это загрузить недостающую сборку (assembly) командой:

Add-Type -Assembly ″system.io.compression.filesystem″

Загрузив сборку, можно приступать к архивации. Для этого используем статический метод CreateFromDirectory класса ZipFile. Для создания архива из директории этому методу необходимо в качестве аргументов передать исходную директорию и имя конечного zip-файла. Например:

$source = C:\Testzip\1
$destination = C:\Testzip\1.zip
[io.compression.zipfile]::CreateFromDirectory($source, $destination)

создание архива с помощью PowerShell

 

В методе  CreateFromDirectory можно задать уровень сжатия:

• Optimal — оптимизация по уровню сжатия;
• Fastest — оптимизация по затрачиваемому времени;
• NoCompression — без сжатия.

А также можно указать, включать ли в архив базовый каталог или нет. Для примера еще раз создадим архив с уровнем сжатия Optimal и укажем не включать в него базовый каталог:

$level = [System.IO.Compression.CompressionLevel]::Optimal
$Include = $false
[io.compression.zipfile]::CreateFromDirectory($source, $destination, $level, $Include)

создание архива с указанием степени сжатия

 

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

ошибка при создании архива

 

Операция, обратная архивации — разархивирование. Для этого используем метод ExtractToDirectory. Для работы ему нужно передать исходный zip-файл и директорию, в которую его надо распаковать. Для примера распакуем созданный ранее архив:

$source = ″C:\Testzip\1.zip″
$destination = ″C:\Testzip″
[io.compression.zipfile]::ExtractToDirectory($source, $destination)

распаковка архива с помощью PowerShell

 

На этом все, а более подробно о .Net классе ZipFile, его свойствах и методах можно узнать из библиотеки MSDN.

 
 
Комментарии

Отлично! А я постоянно мучился с 7zip. Ваш сайт постоянно выручает.

Алексей

Добрый день.
$source = C:\Testzip\1
$destination = C:\Testzip\1.zip[io.compression.zipfile]::CreateFromDirectory($source, $destination)

Поправьте, в тексте, что это три строчки, а не две. Кавычки не забудьте — ‘C:\Testzip\1’ . Хотя на скриншоте указано правильно. Начинающим сложно будет «вкурить» что к чему.
Можно сделать еще проще и нагляднее как мне кажется:
[System.IO.Compression.ZipFile]::CreateFromDirectory(‘c:\Mydata’, ‘c:\mydata.zip’,’Optimal’,$false)

И вопросец вдогонку — как дело с быстродействием в сравнении с тем же 7zip- ом при сжатии больших объемов?
Спасибо.

Поправил, форматирование съехало.
Насчет проще и нагляднее — я все что можно предпочитаю сохранять в переменные, но это дело вкуса.
На предмет быстродействия особо не тестировал.

А на куски делить архивный файл можно?

Если имеется ввиду создание архива из нескольких файлов, то нельзя.