A compactação pode ser feita usando o método CreateFromDirectory
da classe .NET System.IO.Compression.ZipFile
. Eu prefiro usar o .NET sobre a instalação de extensões da comunidade e outros add-ons, a fim de manter o ambiente do servidor o mais limpo possível.
Eu acredito que você não pode usá-lo para adicionar a um arquivo zip, mas precisaria copiar temporariamente os arquivos e pastas na estrutura correta para um diretório temporário. A partir daí, você pode criar o arquivo zip e excluir o conteúdo de teste.
Para usar o .NET para compactação, primeiro é necessário carregar o assembly de classe:
[System.Reflection.Assembly]::LoadWithPartialName("System.IO.Compression.FileSystem")
Depois, você pode ligar para a turma:
[System.IO.Compression.ZipFile]::CreateFromDirectory($DirPath, $ZipFilePath, $CompressionLevel, $includeBaseDir)
Onde:
$DirPath
é o diretório que você deseja zipar.
$ZipFilePath
é o nome do arquivo zip que você deseja criar.
$Compressionlevel
pode ser definido como Optimal
, Fastest
ou NoCompression
.
$includeBaseDir
pode ser $true
ou $false
.
Eu escrevi uma função para me poupar o incômodo de ter que procurar o página de referência do .net o tempo todo. Se você olhar a página, verá que há um método para descompactar também.
O .NET 4.5 é necessário e eu recomendo strongmente que você também atualize o powershell. Todas as versões trouxeram melhorias massivas. Acontece que usar o .NET é eficiente, tendo comparado com os aplicativos zip de terceiros populares que ele sai com força.
A função é bem autoexplicativa, apenas certifique-se de executar a função antes de chamá-la. Aqui está um breve resumo da sintaxe se você precisar:
New-ZipFile {DirToZip} {ZipfilePathAndName} {fastORoptimalORnocompression} {IncludeBaseDirectoryInZip($true or $false)}
Então para compactar E:\stuff
para D:\zipfile.zip
usando compactação ideal e incluir o baseir .\stuff
no arquivo zip, você executaria:
New-ZipFile 'E:\stuff' 'D:\zipfile.zip' Optimal $true
Aqui está a função:
#region function New-ZipFile
<#
.Synopsis
Creates a zip file from a directory.
.DESCRIPTION
Creates a zip file from a directory. Options include compression level and wether or not to include the base directory. Class reference: https://msdn.microsoft.com/en-us/library/hh875104(v=vs.110).aspx
.EXAMPLE
New-ZipFile c:\dir c:\zipfile.zip Fastest $True
.EXAMPLE
New-ZipFile c:\dir c:\zipfile.zip Optimal $True
.INPUTS
Inputs to this cmdlet (if any)
.OUTPUTS
Output from this cmdlet (if any)
.NOTES
General notes
.COMPONENT
The component this cmdlet belongs to
.ROLE
The role this cmdlet belongs to
.FUNCTIONALITY
The functionality that best describes this cmdlet
#>
function New-ZipFile
{
Param
(
# The directory to zip.
[Parameter(Mandatory=$true,
Position=0)]
[ValidateNotNullOrEmpty()]
[string]$DirPath,
# The zipfile name.
[Parameter(Mandatory=$true,
Position=1)]
[ValidateNotNullOrEmpty()]
[string]$ZipFilePath,
# Specifies values that indicate whether a compression operation emphasizes speed or compression size.
[Parameter(Mandatory=$true,
Position=2)]
[ValidateNotNullOrEmpty()]
[ValidateSet("Fastest", "NoCompression", "Optimal", ignorecase=$True)]
[string]$CompressionLevel,
# $True to include the directory name from sourceDirectoryName at the root of the archive; $False to include only the contents of the directory.
[Parameter(Mandatory=$true,
Position=3)]
[ValidateNotNullOrEmpty()]
[bool]$includeBaseDir
)
#Load the .NET 4.5 zip-assembly
[System.Reflection.Assembly]::LoadWithPartialName("System.IO.Compression.FileSystem") | Out-Null
# Zip the directory.
[System.IO.Compression.ZipFile]::CreateFromDirectory($DirPath, $ZipFilePath, $CompressionLevel, $includeBaseDir)
}
#endregion
EDIT: O cara do Scripting escreveu um artigo onde ele mostra um maneira alternativa de carregar o assembly , é um pouco mais limpo.