Вы можете использовать возможности PowerShell для создания zip архивов и их распаковки. В версии PowerShell 5.0 (установлен по умолчанию в Windows 10) доступен отдельный модуль Microsoft.PowerShell.Archive. В более старых версиях Windows для архивирования можно использовать класс ZipFile из .NET Framework
В модуле Microsoft.PowerShell.Archive (C:\Windows\System32\WindowsPowerShell\v1.0\Modules\Microsoft.PowerShell.Archive) есть всего два командлета:
- Compress-Archive
- Expand-Archive
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
Рассмотрим примеры использования этих командлетов для создания и распаковки 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 — если архив с указанным именем уже существует, он будет перезаписан.
Чтобы заархивировать один файл, выполните:
Compress-Archive -Path "C:\Logs\WindowsUpdate.log" -DestinationPath C:\Archive\updatelog.zip -CompressionLevel Optimal
Можно заархивировать все содержимое нескольких каталогов (все файлы и подкаталоги):
Compress-Archive -Path C:\Logs\,C:\Logs2\ -DestinationPath C:\Archive\logs-all.zip -CompressionLevel Optimal
Можно добавить в ZIP архив только файлы с определенной маской. Например, следующая команда запакует только файлы с расширением *.txt.
Compress-Archive -Path C:\Logs\*.txt -DestinationPath C:\Archive\logs-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:\temp\officefiles.zip
Чтобы добавить в существующий zip архив новые файлы, используйте ключ Update:
Compress-Archive -Path C:\Logs\,C:\logs2\ –Update -DestinationPath C:\Archive\logs-txt.zip
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 архив в PowerShell с Expand-Archive?
Для разархивирования ZIP файлов можно использовать командлет Expand—Archive.
Синтаксис командлета аналогичный:
Expand-Archive [-Path] String [-DestinationPath] String [-Force] [-Confirm]
Например, чтобы распаковать созданный нами ранее ZIP-архив в указанный каталог с перезаписью файлов, выполните:
Expand-Archive -Path C:\Scripts\test1.zip -DestinationPath c:\scripts -Force
Из недостатков модуля архивирования PowerShell стоит отметить:
- Нельзя просмотреть содержимое архива без его распаковки;
- Нельзя извлечь из архива часть файлов (придется распаковать архив целиком);
- Нельзя использовать другие форматы архивов, кроме zip;
- Нельзя защитить zip архив с паролем.
Install-Module -Name 7Zip4Powershell
Expand-7Zip -ArchiveFileName C:\PS\Logs.zip -Password "P@$$dr0w" -TargetPath C:\Temp\NewLogs
Архивирование в 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:\PS\logs.zip'
[IO.Compression.ZipFile]::CreateFromDirectory($SourceFolder, $ZipFileName)
Чтобы обновить ZIP архив и указать степень сжатия, используйте такой код PowerShell:
$addfile = ‘C:\temp\new.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 архива в виде таблицы Out-GridView с указанием степени сжатия:
$ZipFileName = "C:\PS\logs1.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 архива в каталог C:\Logs, используйте следующие команды:
$SourceZipFile = 'C:\PS\logs.zip'
$TargetFolder = 'C:\Logs'
[IO.Compression.ZipFile]::ExtractToDirectory($SourceZipFile, $TargetFolder)