Vraag Hoe zip / unzip je bestanden in Powershell?


Is er een one-liner die bestanden (* .zip) in PowerShell zal zip / unzippen?


103
2018-06-03 15:57


oorsprong


verwant: Unzip met PS in Server Core - Ruben Bartelink


antwoorden:


DotNetZip kunt u dit vanuit PowerShell doen. Het is geen one-liner, maar in de bibliotheek kunt u het PowerShell-script schrijven dat u nodig hebt.

U kunt ook de COM-interface gebruiken, zie Comprimeer bestanden met Windows PowerShell en pakket vervolgens een Windows Vista Sidebar-gadget.

Googlen van "zip powershell" of "unzip powershell" kan ook nuttige resultaten opleveren.


21
2018-06-03 16:02



+1 Het gelinkte artikel bevat nuttige taken in tegenstelling tot het meest up-reviewed antwoord - Ruben Bartelink
-1 voor het suggereren van een Google-zoekopdracht. Dit is het topresultaat van StackExchange in een zoekopdracht van Google naar "unzip powershell" - machine yearning


Dit is hoe je het kunt doen puur vanuit Powershell zonder externe hulpmiddelen. Hiermee pak je een bestand met de naam test.zip uit in de huidige werkmap:

$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



gebruik $ destination.Copyhere ($ zip_file.items (), 0x10) voor het overschrijven van bestaande bestanden. 0x4 verbergt het dialoogvenster en 0x14 combineert deze en overschrijft en verbergt het dialoogvenster. - Peter
De lijn $destination.Copyhere($zip_file.items()) doet de feitelijke unziping. - Jonathan Allen
Je kunt het bovenstaande in een functie plaatsen, als je wilt: 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
Dit zou het geaccepteerde antwoord moeten zijn. - tugberk
Dit mislukt voor mij wanneer het zipbestand alleen een map bevat (items zijn leeg) - James Woolfenden


Nu in .NET Framework 4.5 is er een Zip bestand klasse die je als volgt kunt gebruiken:

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

56
2017-12-30 17:46



Het definitief werkte - ik gebruikte het om meer dan 400 zip-bestanden te extraheren. Ik zal controleren of ik hier geen 4.5 heb, maar het verschijnt niet onder Microsoft.NET. - GalacticCowboy
Deze zou geweldig zijn als er een eenvoudige methode was voor ExtractToDirectory en een optie om alle bestaande bestanden te overschrijven. - James Dunne
Laad de assembly met Add-Type, bijvoorbeeld: Add-Type -AssemblyName System.IO.Compression.FileSystem - Mike
@JamesDunne - Als u geen andere bestanden hebt die u moet bewaren, kunt u 'Remove-Item -Recurse $ TargetFolder' gebruiken. Anders kunt u wat u wilt, doen, maar het zou niet-triviaal zijn. Je zou de zip moeten openen om te lezen en dan door de zip lopen, een vorig doelobject verwijderen en het nieuwe uitpakken. Gelukkig voor mij werkt de eenvoudige oplossing. ;) - Mike
Wees gewaarschuwd dat relatieve bestandslocaties de .NETTO huidige directory, niet de PowerShell-versie. Zien hier. Het is waarschijnlijk beter alleen om (Resolve-Path $someDir).Path de argumenten. - jpmc26


Misschien wilt u uitchecken De PowerShell-communityuitbreidingen (PSCX) die hiervoor speciaal cmdlets heeft.


18
2018-06-03 15:59



+1 PSCX is een geweldige set van add-on-cmdlets - ik zou willen dat ik meer kon kiezen en kiezen welke ik wil en welke ik niet. Het lijkt een heleboel te veranderen in mijn Powershell-instantie .... - marc_s
Ik ben dit tegengekomen omdat ik de PSCX-installatie eigenlijk wil automatiseren als ik dat voor sommige collega's kan doen. Probeer het nu om te zien wat voor soort problemen ik tegenkom - jcolebrand


Ik weet dat dit een heel oude vraag is, maar ik zag hem net gekoppeld op Twitter toen ik dacht dat ik een actueel antwoord zou plaatsen.

PowerShell 5, momenteel beschikbaar op Windows 10 of via de Windows Management Framework 5 Productievoorbeeld, wordt geleverd met twee ingebouwde cmdlets voor 'zippen' en 'uitpakken':


14
2017-10-17 20:59



Het is een goed ding om nieuwe informatie te geven aan oude vragen. ;) +1 - jpmc26


Ik vind de eenvoudigste oplossing om alleen de binaries van het infozip-programma te gebruiken die ik al jaren gebruik en gebruik in een UNIX-omgeving.

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.

Het zou rechttoe rechtaan zijn om een ​​Powershell-wrapper om de tekstuitvoer te plaatsen, maar in de praktijk heb ik dat nooit nodig, dus ik heb er geen last van gehad.

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


5
2017-08-03 19:40





ik houd ook van Info-ZIP (de Zip-engine die te vinden is in de meeste andere Zip-hulpprogramma's) en 7-Zip, een andere favoriet met zowel een GUI- als een opdrachtregel-zip-hulpprogramma. Het punt is dat er enkele goede commandoregel-hulpprogramma's zijn die voor de meeste PowerShell-taken werken.

Er zijn een aantal trucs voor het uitvoeren van opdrachtregelhulpprogramma's die niet met PowerShell zijn gebouwd:

  • Voer een uitvoerbaar bestand uit dat begint met een nummer in de naam, voer het in met een Ampersand (&).

    & 7zip.exe

  • Wikkel elk token in, het hulpprogramma verwacht te zien vanaf de opdrachtregel, tussen aanhalingstekens.

    & "c: \ pad met spatie \ SomeCommand.exe" "/ parameter2" "/ parameter2" "parameter2's Waarde" "Waarde2` "met een aanhalingsteken"

Probeer dit:

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

Of zelfs:

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

5
2017-08-11 15:07