04/11/2024

PowerShell

PowerShell : compresser et décompresser une archive ZIP

I. Présentation

Dans ce nouvel article, nous allons apprendre à compresser des données dans une archive ZIP et nous verrons comment décompresser une archive ZIP. Le format ZIP est très intéressant puisqu'il permet, dans la majorité des cas, de réduire considérablement la taille des fichiers, ce qui va permettre d'optimiser les transferts de données.

Les commandes utilisées dans ce tutoriel sont intégrées au module Microsoft.PowerShell.Archive disponible nativement sous Windows 10 puisqu'il bénéficie de PowerShell v5 en natif.

Ce tutoriel est disponible au format vidéo :

II. Compresser des fichiers avec PowerShell

A. Créer le ZIP d'un dossier

Commençons par compresser des fichiers au sein d'une archive ZIP à l'aide du cmdlet Compress-Archive. Pour ma part, je me trouve sur Windows 10.

Pour créer simplement l'archive ZIP d'un dossier complet, on va spécifier le dossier à compresser et le chemin vers le fichier ZIP à créer.

Compress-Archive -Path <chemin-vers-dossier-a-compresser> -DestinationPath <chemin-vers-ZIP>

Par exemple pour compresser le dossier "C:\TEMP\ZIP" :

Compress-Archive -Path C:\TEMP\ZIP -DestinationPath C:\TEMP\ZIP\powershell.zip

Le ZIP se crée en quelques secondes, mais cela dépend de la quantité de données à zipper.

B. Comment créer une archive ZIP avec une liste de fichiers et non un dossier complet ?

Il faudra remplacer le paramètre -Path par -LiteralPath et indiquer la liste des fichiers, séparés par une virgule. Par exemple, voici une commande qui va créer une archive ZIP avec deux fichiers : "C:\TEMP\ZIP\rollback.mkv" et "C:\TEMP\ZIP\intro.mkv"

Compress-Archive -LiteralPath "C:\TEMP\ZIP\rollback.mkv", "C:\TEMP\ZIP\intro.mkv" -DestinationPath C:\TEMP\ZIP\2.zip

? Si l'on ajoute le paramètre -Force à la fin de la commande, cela permettrait d'écraser l'archive ZIP si elle existait déjà.

C. Créer un ZIP avec le contenu d'un dossier

Lorsque l'on ZIP un dossier complet, cela crée un dossier dans le ZIP et au sein du dossier on retrouve toutes les données contenues dans le dossier. Si l'on veut éviter d'avoir ce dossier racine dans le ZIP et obtenir seulement son contenu, il faut utiliser le wildcard "*".

Si je reprends le premier exemple, cela donne :

Compress-Archive -Path C:\TEMP\ZIP\* -DestinationPath C:\TEMP\ZIP\powershell-files.zip

Cette petite astuce est à connaître et je tiens à préciser que cela prendre toutes les données de façon récursive. Si vous souhaitez prendre seulement les fichiers du dossier racine, sans aller rechercher les données des éventuels sous-dossiers, il faudra utiliser ce filtre :

Compress-Archive -Path C:\TEMP\ZIP\*.* -DestinationPath C:\TEMP\ZIP\powershell-root.zip

De la même façon on peut utiliser le wildcard pour ajouter au ZIP seulement les fichiers "*.mkv" par exemple :

Compress-Archive -Path C:\TEMP\ZIP\*.mkv -DestinationPath C:\TEMP\ZIP\powershell-mkv.zip

D. Comment ajouter des fichiers à une archive ZIP existante ?

Le cmdlet Compress-Archive intègre un paramètre nommé -Update qui permet d'ajouter des données à une archive ZIP existante. Pour ajouter le fichier "C:\TEMP\ZIP\video.mkv" à l'archive "C:\TEMP\ZIP\powershell.zip", il suffit d'exécuter cette commande :

Compress-Archive -LiteralPath "C:\TEMP\ZIP\video.mkv" -DestinationPath "C:\TEMP\ZIP\powershell.zip" -Update

Le paramètre -Update est indispensable, sinon, une erreur va s'afficher pour vous informer que le fichier ZIP existe déjà sauf si vous indiquez -Force où le ZIP sera écrasé. Vous l'aurez compris -Update et -Force ne sont pas compatibles.

E. Ajuster le niveau de compression

Lorsque l'on crée une archive ZIP, on peut jouer sur le niveau de compression : le cmdlet Compress-Archive intègre cette possibilité avec le paramètre -CompressionLevel. Il dispose de trois valeurs :

  • Optimal (mode par défaut)
  • NoCompression (sans compression)
  • Fastest (le plus rapide)

Il suffira de l'utiliser comme ceci :

Compress-Archive -Path C:\TEMP\ZIP\*.* -DestinationPath C:\TEMP\ZIP\powershell-files.zip -CompressionLevel Fastest

III. Décompresser un ZIP avec PowerShell

Le cmdlet pour décompresser une archive ZIP en PowerShell est différent, il se nomme "Expand-Archive". Pour l'utiliser, c'est relativement basique, il faut spécifier le ZIP à décompresser et le chemin vers le dossier dans lequel extraire le contenu :

Expand-Archive -LiteralPath <chemin-vers-zip> -DestinationPath <chemin-vers-destination>

Le fait d'ajouter le paramètre -Force permettra d'écraser les fichiers existants dans le dossier cible.

Voici un exemple pour décompresser le ZIP "C:\TEMP\ZIP\powershell-files.zip" dans le dossier ""C:\TEMP\UNZIP"" :

Expand-Archive -LiteralPath C:\TEMP\ZIP\powershell-files.zip -DestinationPath "C:\TEMP\UNZIP" -Force

Il est à noter que la commande Expand-Archive créera automatiquement le dossier de destination s'il n'existe pas.

Maintenant, à toi de jouer et d'implémenter ces commandes dans tes scripts ! ?

author avatar
Florian BURNEL Co-founder of IT-Connect
Ingénieur système et réseau, cofondateur d'IT-Connect et Microsoft MVP "Cloud and Datacenter Management". Je souhaite partager mon expérience et mes découvertes au travers de mes articles. Généraliste avec une attirance particulière pour les solutions Microsoft et le scripting. Bonne lecture.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.