В 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, если архив с указанным именем уже существует, он будет перезаписан.
Пример команды для сжатия одного файла:
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)
Прикольно. Вопрос только — зачем? Никак не могу придумать, зачем это может понадобиться. Если толкьо для Core серверов.
В скриптах всевозможных..
Собственноручно приходилось писать сценарии логротейта со сжатием старых файлов журналов в архив, или отправки определенных файлов по расписанию на почтовый ящик с предварительным сжатием. Раньше для упаковки приходилось использовать консольные 7zip или winrar.
Теперь все можно реализовать встроенными средствами PoSh
Это конечно очень хорошо, но пока что я уж лучше воспользуюсь 7zip. Уровень компрессии выше, возможности обширнее и куча ключей в командной строке опытных админов не пугает. При желании можно и командлет-обертку написать.
Ну так и пользуйся 7z дальше «не пуганный админ». Зачем флуд разводишь. Автор пишет о способе компрессии файлов, не только под твои задачи. Напиши свою статью и жди комментариев, таких как ты «опытных админов».
Не совсем понял:
можно ли сжимать с подкаталогами?
И, соответственно, можно ли разархивировать, сохраняя структуру исходных папок?
При сжатии папки с подкаталогами, например 1, в архиве структура каталогов включает папку «1». Неудобно при разархивировании.
Лучше бы если в архиве сразу были бы подкаталоги.
Как избежать?