Question Comment compresser / décompresser des fichiers dans Powershell?


Existe-t-il un one-liner permettant de compresser / décompresser des fichiers (* .zip) dans PowerShell?


103
2018-06-03 15:57


origine


en relation: Décompressez avec PS dans Server Core - Ruben Bartelink


Réponses:


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 Compressez les fichiers avec Windows PowerShell, puis empaquetez un gadget Windows Vista Sidebar.

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


21
2018-06-03 16:02



+1 article lié contient des tâches utiles contrairement à la réponse la plus votée - Ruben Bartelink
-1 pour suggérer une recherche Google. Ceci est le meilleur résultat StackExchange dans une recherche Google pour "unzip powershell" - machine yearning


Voilà 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())

154
2017-11-14 01:36



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
La ligne $destination.Copyhere($zip_file.items()) fait la décompression réelle. - Jonathan Allen
Vous pouvez fragmenter ce qui précède dans une fonction si vous vouliez: 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
Cela devrait être la réponse acceptée. - tugberk
Cela échoue pour moi lorsque le fichier zip ne contient qu'un dossier (les éléments sont vides) - James Woolfenden


Maintenant, dans .NET Framework 4.5, il existe un Fichier zip classe que vous pouvez utiliser comme ceci:

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

56
2017-12-30 17:46



Il absolument travaillé - je l'ai utilisé pour extraire plus de 400 fichiers zip. Je vais vérifier que je n'ai pas la version 4.5 ici, mais cela ne s'affiche pas sous Microsoft.NET. - GalacticCowboy
Ce aurait être formidable s’il existait une méthode simple pour ExtractToDirectory et une option pour écraser tous les fichiers existants. - James Dunne
Chargez l'assembly avec Add-Type, par exemple: Add-Type -AssemblyName System.IO.Compression.FileSystem - Mike
@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
Soyez averti que les emplacements de fichiers relatifs utiliseront la .NET répertoire actuel, ne pas celui de PowerShell. Voir ici. Il vaut probablement mieux juste (Resolve-Path $someDir).Path les arguments. - jpmc26


Vous voudrez peut-être vérifier Les extensions de communauté PowerShell (PSCX) qui a des applets de commande spécifiquement pour cela.


18
2018-06-03 15:59



+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. Cela semble changer beaucoup dans mon cas 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. Essayer maintenant de voir quel genre de problèmes je rencontre - jcolebrand


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 le logiciel Aperçu de la production de Windows Management Framework 5, est livré avec deux cmdlets intégrées pour "zipper" et "décompresser":


14
2017-10-17 20:59



C'est un bien chose à fournir de nouvelles informations à de vieilles questions. ;) +1 - jpmc26


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
2017-08-03 19:40





J'aime aussi Info-ZIP (le moteur Zip présent dans la plupart des autres utilitaires Zip) et 7-Zip, un autre favori qui a à 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 quelques 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)

5
2017-08-11 15:07





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()) 
}

2
2017-10-11 17:56





WinRAR peut fonctionner en mode CMD en acceptant des arguments


0
2017-08-03 19:49





L'approche ionique bascule:

https://dotnetzip.codeplex.com/wikipage?title=PS-Examples

supporte les mots de passe, d'autres méthodes de cryptage, etc.


0
2018-01-13 22:53





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.


0
2018-05-02 22:13