Архивирование и распаковка ZIP архивов в PowerShell

Вы можете использовать возможности PowerShell для создания zip архивов и их распаковки. В версии PowerShell 5.0 (установлен по умолчанию в Windows 10) доступен отдельный модуль Microsoft.PowerShell.Archive . В более старых версиях Windows для архивирования можно использовать класс ZipFile из .NET Framework

В модуле Microsoft.PowerShell.Archive (C:WindowsSystem32WindowsPowerShellv1.0ModulesMicrosoft.PowerShell.Archive) есть всего два командлета:

  • Compress-Archive
  • Expand-Archive

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

CommandType Name             Version Source_x000D_----------- ----             ------- ------_x000D_Function    Compress-Archive 1.0.0.0 Microsoft.PowerShell.Archive_x000D_Function    Expand-Archive   1.0.0.0 Microsoft.PowerShell.Archive

modul powershell archive в windows 10 powershell для работы с zip архивами

Рассмотрим примеры использования этих командлетов для создания и распаковки ZIP архивов в ваших PowerShell скриптах.

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

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


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

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

Чтобы заархивировать один файл, выполните:

Compress-Archive -Path "C:LogsWindowsUpdate.log" -DestinationPath C:Archiveupdatelog.zip -CompressionLevel Optimal

powershell архивация zip файлов с помощью командлета Compress-Archive
Можно заархивировать все содержимое нескольких каталогов (все файлы и подкаталоги):

Compress-Archive -Path C:Logs,C:Logs2 -DestinationPath C:Archivelogs-all.zip -CompressionLevel Optimal

Чтобы добавить в архив несколько файлов или папок, их имена нужно разделить запятыми.

Можно добавить в ZIP архив только файлы с определенной маской. Например, следующая команда запакует только файлы с расширением *.txt.

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

С помощью Get-ChildItem можно использовать более сложные фильтры. Например, следующий скрипт позволит найти на диске топ 10 самых больших файлов с расширением *.docx или *.xlsx и добавит их в архив:

Get-ChildItem c:docs -Include *.xlsx –Recurse| sort -descending -property length | select -first 10 |Compress-Archive -DestinationPath C:tempofficefiles.zip

Чтобы добавить в существующий zip архив новые файлы, используйте ключ Update:

Compress-Archive -Path C:Logs,C:logs2 –Update -DestinationPath C:Archivelogs-txt.zip

Примечание . Т.к. модуль Microsoft.PowerShell.Archive использует вызовы класса System.IO.Compression.ZipArchive, не получится сжать файл, размером больше 2 Гб. При попытке сжать файл большего размера появится ошибка:

Ошибка создания архива 2 Гб

Exception calling "Write" with "3" argument(s): "Stream was too long."_x000D_At  C:Windowssystem32WindowsPowerShellv1.0ModulesMicrosoft.PowerShell.ArchiveMicrosoft.PowerShell.Archive.psm1:805_x000D_char:29_x000D_+ ...                     $destStream.Write($buffer, 0, $numberOfBytesRead)_x000D_+                         ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~_x000D_+ CategoryInfo          : NotSpecified: (:) [], MethodInvocationException_x000D_+ FullyQualifiedErrorId : IOException

Как распаковать ZIP архив в PowerShell с Expand-Archive?

Для разархивирования ZIP файлов можно использовать командлет Expand Archive .
Синтаксис командлета аналогичный:

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

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

Expand-Archive -Path C:Scriptstest1.zip  -DestinationPath c:scripts -Force

Expand-Archive

Из недостатков модуля архивирования PowerShell стоит отметить:

  • Нельзя просмотреть содержимое архива без его распаковки;
  • Нельзя извлечь из архива часть файлов (придется распаковать архив целиком);
  • Нельзя использовать другие форматы архивов, кроме zip;
  • Нельзя защитить zip архив с паролем.
В более сложных случаях для выполнения архивации в ваших PowerShell скриптах нужно использовать сторонние утилиты. Например, 7zip или модуль 7Zip4Powershell. Например, следующая команда позволит распаковать zip файл, защищенный паролем:

Install-Module -Name 7Zip4Powershell
Expand-7Zip -ArchiveFileName C:PSLogs.zip -Password "P@$$dr0w" -TargetPath C:TempNewLogs

Архивирование в PowerShell с помощью класса ZipFile

В версиях ОС до Windows 10/Windows Server 2016 с версией PowerShell < 5.0 (если вы не можете обновить версию PoSh ) для создания zip архивов можно использовать отдельный класс .NET Framework 4.5 — ZipFile .

Сначала загрузите класс в свою сессию PowerShell:

Add-Type -AssemblyName "System.IO.Compression.FileSystem"

Чтобы заархивировать каталог, используйте такой скрипт:

$SourceFolder = 'C:Logs'
$ZipFileName = 'C:PSlogs.zip'
[IO.Compression.ZipFile]::CreateFromDirectory($SourceFolder, $ZipFileName)

использование кдасса ZipFile в powershell

Чтобы обновить ZIP архив и указать степень сжатия, используйте такой код PowerShell:

$addfile = ‘C:tempnew.log’
$compressionLevel = [System.IO.Compression.CompressionLevel]::Fastest
$zip = [System.IO.Compression.ZipFile]::Open($zipFileName, 'update')[System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($zip, $addfile, (Split-Path $addfile -Leaf), $compressionLevel)$zip.Dispose()

Команда $zip.Dispose() используется чтобы закрыть zip файл.

Можно вывести содержимое ZIP архива:

[System.IO.Compression.ZipFile]::OpenRead($zipFileName).Entries.Name

получить содержимое zip архива в powershell

Или можно вывести содержимое zip архива в виде таблицы Out-GridView с указанием степени сжатия:

$ZipFileName = "C:PSlogs1.zip"
$Stream = New-Object IO.FileStream($ZipFileName , [IO.FileMode]::Open)
$ZipArchive = New-Object IO.Compression.ZipArchive($Stream)
$ZipArchive.Entries |
Select-Object Name,
@{Name="File Path";Expression={$_.FullName}},
@{Name="Compressed Size (KB)";Expression={"{0:N2}" -f($_.CompressedLength/1kb)}},
@{Name="UnCompressed Size (KB)";Expression={"{0:N2}" -f($_.Length/1kb)}},
@{Name="File Date";Expression={$_.LastWriteTime}} | Out-GridView
$ZipArchive.Dispose()
$Stream.Close()
$Stream.Dispose()

вывести файлы в zip архиве со степенью сжатия

Для разархивирования ZIP архива в каталог C:Logs, используйте следующие команды:

$SourceZipFile = 'C:PSlogs.zip'

$TargetFolder = 'C:Logs'

[IO.Compression.ZipFile]::ExtractToDirectory($SourceZipFile, $TargetFolder)

EnglishRussianUkrainian