Як створити 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

Як ми бачимо, є два командлет, назви яких говорять самі за себе:

  • 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 -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 Гб. При спробі стиснути файл більшого розміру з'явиться помилка
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

З недоліків модуля архівації цієї версії варто відзначити:

  • Чи не вийде переглянути вміст архіву без його розпакування
  • Не можна витягти з архіву частина файлів (тільки повна розпакування)
  • Не можна використовувати інші формати архівів, крім 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)