Как создать ZIP архив с помощью PowerShell

В PowerShell 5.0 (входит в состав  Windows Management Framework 5.0, который по умолчанию включен в Windows 10) появился отдельный модуль Microsoft.PowerShell.Archive, который позволяет создавать и распаковывать ZIP архивы  из командной строки или внутри скриптов PowerShell. Список доступных комадлетов в модуле Microsoft.PowerShell.Archive (C:\Windows\System32\WindowsPowerShell\v1.0\Modules\Microsoft.PowerShell.Archive) можно получить с помощью Get-Command.

Get-Command -Module Microsoft.PowerShell.Archive | Format-Table -AutoSize;

CommandType Name             Version Source
———— —-             ——- ——
Function    Compress-Archive 1.0.0.0 Microsoft.PowerShell.Archive
Function    Expand-Archive   1.0.0.0 Microsoft.PowerShell.Archive

Модуль Microsoft.PowerShell.Archive для работы с ZIP файлами

Как мы видим, доступно два командлета, названия которых говорят сами за себя:

  • Compress-Archive
  • Expand-Archive

Рассмотрим примеры использования данных командлетов для создания/распаковки ZIP архивов из указанных файлов или каталогов.

Формат команды Compress-Archive следующий:

Compress-Archive [-Path] String[] [-DestinationPath] String  [-CompressionLevel String ] [-Update]

В параметре Path задаются исходные файлы, которые нужно запаковать, —DestinationPath –местоположение создаваемого файла с архивом, CompressionLevel – уровень сжатия (NoCompression, Optimal или Fastest). Параметр –Update позволяет добавить/обновить файлы в уже существующем ZIP архиве. С ключом –Force, если архив с указанным именем уже существует, он будет перезаписан.

Совет. Уровень сжатия NoCompression, как правило стоит использовать для объединения в единый файл архива уже сжатых файлов ( jpg, msi, mp3 и пр.), чтобы система не тратила время на попытки сжать их.

Пример команды для сжатия одного файла:

Compress-Archive -Path C:\Logs\Update.log -DestinationPath C:\Archive\logs.zip -CompressionLevel Optimal

Compress-Archive PowerShell
Сожмем все содержимое каталога:

Compress-Archive -Path C:\Logs\ -DestinationPath C:\Archive\logs-all.zip -CompressionLevel Optimal

Можно выполнить сжатие файлов с определенной маской. К примеру, нужно запаковать только файлы с расширением *.txt.

Compress-Archive -Path C:\Logs\*.txt -DestinationPath C:\Archive\logs-txt.zip –CompressionLevel Fastest

Примечание. Т.к. модуль Microsoft.PowerShell.Archive использует вызовы класса System.IO.Compression.ZipArchive, не получится сжать файл, размером больше 2 Гб. При попытке сжать файл большего размера появится ошибкаОшибка создания архива 2 Гб
Exception calling "Write" with "3" argument(s): "Stream was too long."
At  C:\Windows\system32\WindowsPowerShell\v1.0\Modules\Microsoft.PowerShell.Archive\Microsoft.PowerShell.Archive.psm1:805
char:29
+ ...                     $destStream.Write($buffer, 0, $numberOfBytesRead)
+                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo          : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : IOException

Чтобы распаковать ZIP архив, воспользуемся командлетом Expand-Archive.
Формат команды:

Expand-Archive [-Path] String [-DestinationPath] String [-Force]  [-Confirm]

Например, чтобы распаковать созданный нами ранее zip-архив, перезаписав файлы в целевом каталоге:

Expand-Archive -Path C:\Scripts\test1.zip  -DestinationPath c:\scripts -Force

Expand-ArchiveИз недостатков модуля архивирования этой версии стоит отметить:

  • Не получится просмотреть содержимое архива без его распаковки
  • Нельзя извлечь из архива часть файлов (только полная распаковка)
  • Нельзя использовать другие форматы архивов, кроме zip

В предыдущих версиях Poweshell для сжатия/распаковки zip-файлов можно использовать класс NET Framework 4.5 ZipFile. Формат использования класса следующий.

Упаковываем файлы в архив:

Add-Type -Assembly “system.io.compression.filesystem”
$src = “C:\Logs”
$dst= “C:\Archive\test.zip”
[io.compression.zipfile]::CreateFromDirectory($src, $dst)

Распаковать ZIP архив можно так:

Add-Type -Assembly “system.io.compression.filesystem”
$src = ″C:\Archive\test.zip″
$dst = ″C:\Logs\Archve″
[io.compression.zipfile]::ExtractToDirectory($src, $dst)


Предыдущая статья Следующая статья

Комментариев: 4 Оставить комментарий

Оставить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Я не робот( Обязательно отметьте)