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.

Kevin Kuphal
la source
+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())
Ameer Deen
la source
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)
mousio
la source
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.

Kevin Colby
la source
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:

Windos
la source
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/

Brian Reiter
la source
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)
Nathan Hartley
la source
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()) 
}
Nico
la source
0

WinRAR peut fonctionner en mode CMD en acceptant des arguments

adopter le pilote
la source
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 .

chien mortel
la source