Comment compresser / décompresser des fichiers dans Powershell?


Réponses:


21

DotNetZip vous permettra de le faire à partir de PowerShell. Ce n'est pas une ligne, mais la bibliothèque vous permettra d'écrire le script PowerShell dont vous avez besoin.

Vous pouvez également utiliser l'interface COM, voir Compresser les fichiers avec Windows PowerShell, puis conditionner un gadget Windows Vista Sidebar .

Googler "zip PowerShell" ou "Unzip PowerShell" pourrait également donner des résultats utiles.


+1 L'article lié contient des tâches utiles contrairement à la réponse la plus votée
Ruben Bartelink

5
-1 pour suggérer une recherche Google. Voici le meilleur résultat StackExchange dans une recherche Google de "unzip powershell"
machine yearning

154

Voici comment vous pouvez le faire uniquement à partir de Powershell sans outils externes. Cela décompresse un fichier appelé test.zip dans le répertoire de travail en cours:

$shell_app=new-object -com shell.application
$filename = "test.zip"
$zip_file = $shell_app.namespace((Get-Location).Path + "\$filename")
$destination = $shell_app.namespace((Get-Location).Path)
$destination.Copyhere($zip_file.items())

26
utilisez $ destination.Copyhere ($ zip_file.items (), 0x10) pour écraser les fichiers existants. 0x4 masque la boîte de dialogue et 0x14 les combine et remplace et masque la boîte de dialogue.
Peter

3
La ligne $destination.Copyhere($zip_file.items())effectue la décompression réelle.
Jonathan Allen

2
Vous pouvez associer ce qui précède à une fonction, si vous le souhaitez: function unzip($filename) { if (!(test-path $filename)) { throw "$filename does not exist" } $shell = new-object -com shell.application $shell.namespace($pwd.path).copyhere($shell.namespace((join-path $pwd $filename)).items()) }
James Holwell le

6
Cela devrait être la réponse acceptée.
Tugberk

2
Cela échoue pour moi lorsque le fichier zip ne contient qu'un dossier (les éléments sont vides)
James Woolfenden

56

Maintenant, dans .NET Framework 4.5, il existe une classe ZipFile que vous pouvez utiliser comme ceci:

[System.Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem')
[System.IO.Compression.ZipFile]::ExtractToDirectory($sourceFile, $targetFolder)

1
Ce serait formidable s’il existait une méthode simple pour ExtractToDirectory et une option pour écraser tous les fichiers existants.
James Dunne

1
Cela fonctionne avec .NET 4.5. Cependant, vous avez également besoin de Powershell V3.
DalSoft

3
Chargez l'assembly avec Add-Type, par exemple: Add-Type -AssemblyName System.IO.Compression.FileSystem
Mike

2
@JamesDunne - Si vous n'avez pas d'autres fichiers à conserver, vous pouvez utiliser 'Remove-Item -Recurse $ TargetFolder'. Sinon, ce que vous voulez peut être fait, mais ce ne serait pas trivial. Vous devez ouvrir le zip pour le lire, puis le parcourir, en supprimant tout objet cible précédent et en décompressant le nouvel objet. Heureusement pour moi, la solution facile fonctionne. ;)
Mike

3
Sachez que les emplacements de fichiers relatifs utiliseront le répertoire actuel .NET , et non le répertoire PowerShell. Voir ici . C'est probablement mieux que (Resolve-Path $someDir).Pathles arguments.
jpmc26

18

Vous voudrez peut-être consulter les extensions de la communauté PowerShell (PSCX) qui disposent d’applets de commande spécialement conçues à cet effet.


1
+1 PSCX est un ensemble de cmdlets complémentaires. J'aimerais seulement pouvoir choisir celles que je veux et celles que je ne veux pas. Il semble que cela change beaucoup dans mon exemple Powershell ....
marc_s

Je l'ai rencontré parce que je souhaite en fait automatiser l'installation de PSCX si possible pour certains de mes collègues. J'essaie maintenant de voir quel genre de problèmes je rencontre
jcolebrand

16

Je sais que la question est très ancienne, mais je viens de la voir reliée sur Twitter, pensant publier une réponse actualisée.

PowerShell 5, actuellement disponible sous Windows 10 ou via Windows Management Framework 5 Production Preview , est fourni avec deux applets de commande intégrées pour la compression et le décompression:


3
C'est une bonne chose de fournir de nouvelles informations à d'anciennes questions. ;) +1
jpmc26

5

Je trouve la solution la plus simple qui consiste à utiliser les fichiers binaires d’Infozip que j’utilise depuis des années et à utiliser dans un environnement UNIX.

PS> zip -9r ../test.zip * 
PS> cd .. 
PS> unzip -t test.zip Archive:  test.zip
    testing: LinqRepository/          OK
    testing: LinqRepository/ApplicationService.cs   OK
    testing: LinqRepository/bin/      OK 
... 
No errors detected in compressed data of test.zip.

Il serait tout à fait direct de placer une enveloppe PowerShell autour du texte mais, dans la pratique, je n'en ai jamais besoin et je ne m'en suis donc pas soucié.

http://www.info-zip.org/


5

J'aime aussi Info-ZIP (le moteur Zip que l'on trouve dans la plupart des autres utilitaires Zip) et 7-Zip , un autre favori qui possède à la fois une interface graphique et un utilitaire Zip en ligne de commande. Le fait est que de bons utilitaires de ligne de commande fonctionnent pour la plupart des tâches PowerShell.

Il existe des astuces pour exécuter des utilitaires de ligne de commande qui n'ont pas été conçues avec PowerShell:

  • Si vous exécutez un fichier exécutable dont le nom commence par un numéro, faites-le précéder d’une esperluette (&).

    & 7zip.exe

  • Entourez chaque jeton que l’utilitaire attend de la ligne de commande, entre guillemets.

    & "c: \ chemin avec espace \ SomeCommand.exe" "/ paramètre2" "/ paramètre2" "valeur de paramètre2" "valeur2` "avec une citation"

Essaye ça:

zip filename.zip (Get-ChildItem somepath\*)

Ou même:

zip filename.zip (Get-Content ListOfFiles.txt)

2

James Holwell j'aime votre réponse mais je l'ai développée un peu

# Example
#unzip "myZip.zip" "C:\Users\me\Desktop" "c:\mylocation"
function unzip($fileName, $sourcePath, $destinationPath)
{
    $shell = new-object -com shell.application
    if (!(Test-Path "$sourcePath\$fileName"))
    {
        throw "$sourcePath\$fileName does not exist" 
    }
    New-Item -ItemType Directory -Force -Path $destinationPath -WarningAction SilentlyContinue
    $shell.namespace($destinationPath).copyhere($shell.namespace("$sourcePath\$fileName").items()) 
}



0

J'ai créé un module compatible avec PowerShell 2.0 qui utilise les commandes natives du système d'exploitation Windows pour compresser et décompresser des fichiers de manière synchrone. Cela fonctionne sur les systèmes d'exploitation plus anciens, tels que Windows XP, et ne nécessite pas .Net 4.5 ni aucun autre outil externe. Les fonctions bloqueront également l'exécution du script jusqu'à ce que tous les fichiers aient été compressés / décompressés. Vous pouvez trouver plus d'informations et le module sur mon blog ici .

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.