La compression peut être effectuée en utilisant la méthode CreateFromDirectory
de la classe .NET System.IO.Compression.ZipFile
. Je préfère utiliser .NET plutôt que d'installer des extensions communautaires et d'autres modules complémentaires, afin de maintenir l'environnement du serveur aussi propre que possible.
Je crois que vous ne pouvez pas l'utiliser pour ajouter à une archive zip, mais vous devrez temporairement copier les fichiers et dossiers dans la structure correcte vers un répertoire de staging. Ensuite, vous pouvez créer le fichier zip et supprimer le contenu de staging.
Pour utiliser .NET pour la compression, vous devez d'abord charger l'assembly de classe :
[System.Reflection.Assembly]::LoadWithPartialName("System.IO.Compression.FileSystem")
Ensuite, vous pouvez appeler la classe :
[System.IO.Compression.ZipFile]::CreateFromDirectory($DirPath, $ZipFilePath, $CompressionLevel, $includeBaseDir)
Où :
$DirPath
est le répertoire que vous voulez zipper.
$ZipFilePath
est le nom de l'archive zip que vous voulez créer.
$Compressionlevel
peut être défini sur Optimal
, Fastest
ou NoCompression
.
$includeBaseDir
peut être $true
ou $false
.
J'ai écrit une fonction à partir de cela pour m'éviter d'avoir à consulter la page de référence .NET tout le temps. Si vous regardez la page, vous verrez qu'il y a aussi une méthode pour décompresser.
.NET 4.5 est requis et je vous encouragerais vivement à mettre à jour PowerShell également. Chaque version a apporté d'importantes améliorations. Il s'avère également que l'utilisation de .NET est efficace, ayant comparé ses performances à celles d'applications zip tierces populaires, il s'en sort bien.
La fonction est assez explicite, assurez-vous simplement de l'exécuter avant de l'appeler. Voici une brève explication syntaxique si vous en avez besoin :
New-ZipFile {DirToZip} {ZipfilePathAndName} {fastORoptimalORnocompression} {IncludeBaseDirectoryInZip($true or $false)}
Donc pour zipper E:\stuff
vers D:\zipfile.zip
en utilisant une compression optimale et inclure le basedir .\stuff
dans le fichier zip, vous exécuteriez :
New-ZipFile 'E:\stuff' 'D:\zipfile.zip' Optimal $true
Voici la fonction:
#region function New-ZipFile
<#
.Synopsis
Crée un fichier zip à partir d'un répertoire.
.DESCRIPTION
Crée un fichier zip à partir d'un répertoire. Les options incluent le niveau de compression et s'il faut inclure ou non le répertoire de base. Référence de la classe : 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
Entrées pour cette cmdlet (si applicable)
.OUTPUTS
Sortie de ce cmdlet (si applicable)
.NOTES
Notes générales
.COMPONENT
Composant auquel appartient ce cmdlet
.ROLE
Rôle auquel appartient ce cmdlet
.FUNCTIONALITY
La fonctionnalité qui décrit le mieux ce cmdlet
#>
function New-ZipFile
{
Param
(
# Le répertoire à zipper.
[Parameter(Mandatory=$true,
Position=0)]
[ValidateNotNullOrEmpty()]
[string]$DirPath,
# Le nom du fichier zip.
[Parameter(Mandatory=$true,
Position=1)]
[ValidateNotNullOrEmpty()]
[string]$ZipFilePath,
# Spécifie des valeurs qui indiquent si une opération de compression met l'accent sur la vitesse ou sur la taille de la compression.
[Parameter(Mandatory=$true,
Position=2)]
[ValidateNotNullOrEmpty()]
[ValidateSet("Fastest", "NoCompression", "Optimal", ignorecase=$True)]
[string]$CompressionLevel,
# $True pour inclure le nom du répertoire de sourceDirectoryName à la racine de l'archive ; $False pour inclure uniquement le contenu du répertoire.
[Parameter(Mandatory=$true,
Position=3)]
[ValidateNotNullOrEmpty()]
[bool]$includeBaseDir
)
#Charger l'assembly zip .NET 4.5
[System.Reflection.Assembly]::LoadWithPartialName("System.IO.Compression.FileSystem") | Out-Null
# Zipper le répertoire.
[System.IO.Compression.ZipFile]::CreateFromDirectory($DirPath, $ZipFilePath, $CompressionLevel, $includeBaseDir)
}
#endregion
MODIFIER : Le Scripting guy a écrit un article où il montre une alternative pour charger l'assembly, c'est un peu plus propre.