Wie kann ich Dateien in Powershell komprimieren / dekomprimieren?

Antworten:

21

Mit DotNetZip können Sie dies von PowerShell aus tun. Es ist kein Einzeiler, aber in der Bibliothek können Sie das benötigte PowerShell-Skript schreiben.

Sie können auch die COM-Schnittstelle verwenden. Weitere Informationen finden Sie unter Komprimieren von Dateien mit Windows PowerShell. Packen Sie dann ein Windows Vista-Sidebar-Gadget .

Wenn Sie "zip powershell" oder "unzip powershell" googeln, werden möglicherweise auch nützliche Ergebnisse erzielt.

Kevin Kuphal
quelle
+1 Verknüpfter Artikel hat nützliche Aufgaben im Gegensatz zu der am häufigsten gestellten Antwort
Ruben Bartelink
5
-1 für den Vorschlag einer Google-Suche. Dies ist das Top-Ergebnis von StackExchange bei einer Google-Suche nach "unzip powershell"
machine
154

Dies ist, wie Sie es ohne externe Werkzeuge von Powershell aus tun können. Dies entpackt eine Datei namens test.zip in das aktuelle Arbeitsverzeichnis:

$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
quelle
26
Verwenden Sie $ destination.Copyhere ($ zip_file.items (), 0x10), um vorhandene Dateien zu überschreiben. 0x4 verbirgt das Dialogfeld und 0x14 kombiniert diese und überschreibt und verbirgt das Dialogfeld.
Peter
3
Die Leitung $destination.Copyhere($zip_file.items())übernimmt das eigentliche Entpacken.
Jonathan Allen
2
Sie können das Obige in eine Funktion 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()) }
packen
6
Dies sollte die akzeptierte Antwort sein.
Tugberk
2
Dies schlägt für mich fehl, wenn die ZIP-Datei nur einen Ordner enthält (Elemente sind leer)
James Woolfenden
56

In .NET Framework 4.5 gibt es jetzt eine ZipFile- Klasse, die Sie folgendermaßen verwenden können:

[System.Reflection.Assembly]::LoadWithPartialName('System.IO.Compression.FileSystem')
[System.IO.Compression.ZipFile]::ExtractToDirectory($sourceFile, $targetFolder)
mousio
quelle
1
Dies wäre großartig, wenn es eine einfache Methode für ExtractToDirectory und eine Option zum Überschreiben aller vorhandenen Dateien gäbe.
James Dunne
1
Dies funktioniert mit .NET 4.5. Sie benötigen jedoch auch Powershell V3.
DalSoft
3
Laden Sie die Assembly mit Add-Type, zum Beispiel: Add-Type -AssemblyName System.IO.Compression.FileSystem
Mike
2
@JamesDunne - Wenn Sie keine anderen zu bewahrenden Dateien haben, können Sie 'Remove-Item -Recurse $ TargetFolder' verwenden. Ansonsten können Sie tun, was Sie wollen, aber es wäre nicht trivial. Sie müssen die Zip-Datei zum Lesen öffnen und dann die Zip-Datei durchgehen, um alle vorherigen Zielobjekte zu löschen und die neue auszupacken. Zum Glück funktioniert die einfache Lösung. ;)
Mike
3
Seien Sie gewarnt, dass relative Dateispeicherorte das aktuelle .NET- Verzeichnis und nicht das PowerShell- Verzeichnis verwenden . Sehen Sie hier . Es ist wahrscheinlich besser, nur um (Resolve-Path $someDir).Pathdie Argumente.
jpmc26
18

Möglicherweise möchten Sie die PowerShell Community Extensions (PSCX) auschecken, die speziell für diesen Zweck Cmdlets enthält.

Kevin Colby
quelle
1
+1 PSCX ist ein großartiger Satz zusätzlicher Cmdlets - ich wünschte nur, ich könnte mehr auswählen, welche ich möchte und welche nicht. In meiner Powershell-Instanz scheint sich einiges zu ändern ...
marc_s
Ich bin auf dieses Problem gestoßen, weil ich die PSCX-Installation automatisieren möchte, wenn ich es für einige Kollegen kann. Ich versuche jetzt
herauszufinden,
16

Ich weiß, dass dies eine sehr alte Frage ist, aber ich habe sie gerade auf Twitter verlinkt gesehen, in der Annahme, ich würde eine aktuelle Antwort posten.

PowerShell 5, das derzeit unter Windows 10 oder über die Windows Management Framework 5-Produktionsvorschau verfügbar ist , verfügt über zwei integrierte Cmdlets zum 'Zippen' und 'Entpacken':

Windos
quelle
3
Es ist eine gute Sache, alte Fragen mit neuen Informationen zu versorgen. ;) +1
jpmc26
5

Ich finde die einfachste Lösung, um nur Infozip-Binärdateien zu verwenden, die ich seit Jahren verwende und in einer UNIX-Umgebung verwende.

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.

Es wäre unkompliziert, einen Powershell-Wrapper um die Textausgabe zu legen, aber in der Praxis brauche ich das nie, also habe ich mich nicht darum gekümmert.

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

Brian Reiter
quelle
5

Ich mag auch Info-ZIP (die Zip-Engine, die in den meisten anderen Zip-Dienstprogrammen zu finden ist) und 7-Zip , einen weiteren Favoriten, der sowohl ein GUI- als auch ein Befehlszeilen-Zip-Dienstprogramm enthält. Der Punkt ist, dass es einige gute Befehlszeilendienstprogramme gibt, die für die meisten PowerShell-Aufgaben geeignet sind.

Es gibt einige Tricks zum Ausführen von Befehlszeilendienstprogrammen, die nicht mit PowerShell erstellt wurden:

  • Wenn Sie eine ausführbare Datei ausführen, die mit einer Zahl im Namen beginnt, müssen Sie ein kaufmännisches Und (&) voranstellen.

    & 7zip.exe

  • Schließen Sie jedes Token, das das Dienstprogramm von der Befehlszeile erwartet, in Anführungszeichen ein.

    & "c: \ Pfad mit Leerzeichen \ SomeCommand.exe" "/ parameter2" "/ parameter2" "parameter2s Wert" "Wert2" "mit einem Anführungszeichen"

Versuche dies:

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

Oder auch:

zip filename.zip (Get-Content ListOfFiles.txt)
Nathan Hartley
quelle
2

James Holwell Ich mag Ihre Antwort, aber ich habe sie ein wenig erweitert

# 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
quelle
0

WinRAR kann im CMD-Modus arbeiten und Argumente akzeptieren

Adopilot
quelle
0

Ich habe ein PowerShell 2.0-kompatibles Modul erstellt, das die nativen Windows-Betriebssystembefehle verwendet, um Dateien synchron zu komprimieren und zu dekomprimieren. Dies funktioniert unter älteren Betriebssystemen wie Windows XP und erfordert weder .NET 4.5 noch andere externe Tools. Die Funktionen blockieren auch die Skriptausführung, bis alle Dateien komprimiert / dekomprimiert wurden. Sie können weitere Informationen und das Modul auf meinem Blog hier finden .

tödlicher Hund
quelle