У 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;
- -- -- -
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
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)