Как создать ZIP архив с помощью PowerShell | Windows для системных администраторов

Как создать 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)

Еще записи по теме: PowerShell, Windows 10
Понравилась статья? Скажи спасибо и расскажи друзьям!
Назад:
Вперед:

Комментариев: 3

Оставить комментарий
  1. Alex Kornev | 06.04.2016

    Прикольно. Вопрос только — зачем? Никак не могу придумать, зачем это может понадобиться. Если толкьо для Core серверов.

    Ответить
    • itpro | 06.04.2016

      В скриптах всевозможных..
      Собственноручно приходилось писать сценарии логротейта со сжатием старых файлов журналов в архив, или отправки определенных файлов по расписанию на почтовый ящик с предварительным сжатием. Раньше для упаковки приходилось использовать консольные 7zip или winrar.
      Теперь все можно реализовать встроенными средствами PoSh

      Ответить
      • Jon Snow | 12.04.2016

        Это конечно очень хорошо, но пока что я уж лучше воспользуюсь 7zip. Уровень компрессии выше, возможности обширнее и куча ключей в командной строке опытных админов не пугает. При желании можно и командлет-обертку написать.

        Ответить
Полные правила комментирования на сайте winitpro.ru. Вопросы, не связанные с содержимым статьи или ее обсуждением удаляются.

Сказать Спасибо! можно на этой странице или (еще лучше) поделиться с друзями ссылкой на понравившуюся статью в любимой социальной сети(специально для этого на сайте присуствуют кнопки популярных соц. сетей).

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

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



MAXCACHE: 0.25MB/0.00103 sec