Frage Wie komprimiere ich Dateien in Powershell?


Gibt es einen Einzeiler, der Dateien in PowerShell zip / entzippt (* .zip)?


103
2018-06-03 15:57


Ursprung


verbunden: Entpacken Sie mit PS im Server Core - Ruben Bartelink


Antworten:


DotNetZip können Sie dies von PowerShell aus tun. Es ist kein One-Liner, aber die Bibliothek ermöglicht es Ihnen, das benötigte PowerShell-Skript zu schreiben.

Sie können auch die COM-Schnittstelle verwenden, siehe Komprimieren Sie Dateien mit Windows PowerShell und verpacken Sie dann ein Windows Vista-Sidebar-Gadget.

Googling "Zip Powershell" oder "entpacken Powershell" könnte auch nützliche Ergebnisse.


21
2018-06-03 16:02



+1 Der verlinkte Artikel hat nützliche Aufgaben im Gegensatz zu der am häufigsten gestellten Antwort - Ruben Bartelink
-1 für das Vorschlagen einer Google-Suche. Dies ist das oberste StackExchange-Ergebnis in einer Google-Suche nach "entpacken Powershell" - machine yearning


So können Sie es ohne externe Tools rein aus Powershell machen. 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())

154
2017-11-14 01:36



Verwenden Sie $ destination.Copyhier ($ zip_file.items (), 0x10) zum Überschreiben vorhandener Dateien. 0x4 verbirgt das Dialogfeld, und 0x14 kombiniert diese und überschreibt und verbirgt den Dialog. - Peter
Die Linie $destination.Copyhere($zip_file.items()) macht das eigentliche Unzipieren. - Jonathan Allen
Sie können das Obige in eine Funktion packen, wenn Sie wollten: 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
Dies sollte die akzeptierte Antwort sein. - tugberk
Dies scheitert für mich, wenn die Zip-Datei nur einen Ordner enthält (die Einträge sind leer) - James Woolfenden


Jetzt in .NET Framework 4.5 gibt es ein Zip-Datei Klasse, die Sie so verwenden können:

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

56
2017-12-30 17:46



Es bestimmt gearbeitet - ich habe es verwendet, um über 400 Zip-Dateien zu extrahieren. Ich überprüfe, um sicherzustellen, dass ich 4.5 nicht hier habe, aber es erscheint nicht unter Microsoft.NET. - GalacticCowboy
Diese würde Großartig wäre, wenn es eine einfache Methode zum ExtractToDirectory und eine Option zum überschreiben aller vorhandenen Dateien gäbe. - James Dunne
Laden Sie die Assembly mit Add-Type, zum Beispiel: Add-Type -AssemblyName System.IO.Compression.FileSystem - Mike
@JamesDunne - Wenn Sie keine anderen Dateien haben, die Sie aufbewahren müssen, können Sie 'Remove-Item -Recurse $ TargetFolder' verwenden. Ansonsten kann das, was Sie wollen, getan werden, aber es wäre nicht trivial. Sie müssten die Zip-Datei zum Lesen öffnen und dann die Zip-Datei öffnen, ein beliebiges vorheriges Zielobjekt löschen und das neue Zielobjekt auspacken. Zum Glück funktioniert die einfache Lösung. ;) - Mike
Seien Sie gewarnt, dass relative Dateispeicherorte die verwenden .NETZ Aktuelles Verzeichnis, nicht die PowerShell eins. Sehen Hier. Es ist wahrscheinlich besser, nur zu (Resolve-Path $someDir).Path die Argumente. - jpmc26


Vielleicht möchten Sie auschecken Die PowerShell-Community-Erweiterungen (PSCX) Das hat Cmdlets speziell dafür.


18
2018-06-03 15:59



+1 PSCX ist eine großartige Sammlung von Add-On-Cmdlets - ich wünschte nur, ich könnte mehr auswählen, welche ich möchte und welche nicht. Es scheint sich in meiner Powershell-Instanz sehr zu ändern .... - marc_s
Ich bin darauf gestoßen, weil ich eigentlich die PSCX-Installation automatisieren möchte, wenn ich für einige Kollegen kann. Versuche es jetzt, um zu sehen, auf welche Art von Problemen ich stoße - jcolebrand


Ich weiß, dass das eine sehr alte Frage ist, aber ich habe es gerade auf Twitter verlinkt gesehen, dass ich eine aktuelle Antwort posten würde.

PowerShell 5, derzeit verfügbar unter Windows 10 oder über die Windows Management Framework 5 Produktionsvorschau, kommt mit zwei eingebauten Cmdlets zum "Zippen" und "Entpacken":


14
2017-10-17 20:59



Es ist ein gut neue Informationen zu alten Fragen zu liefern. ;) +1 - jpmc26


Ich finde die einfachste Lösung, um 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 einfach, 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/


5
2017-08-03 19:40





ich mag auch Info-ZIP (die Zip-Engine, die in den meisten anderen Zip-Programmen zu finden ist) und 7-Zipein weiterer Favorit, der sowohl eine GUI als auch eine Befehlszeilen-Zip-Utility hat. Der Punkt ist, es gibt einige gute Befehlszeilenprogramme, die für die meisten PowerShell-Aufgaben funktionieren.

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

  • Führen Sie eine ausführbare Datei aus, die mit einer Zahl im Namen beginnt, und fügen Sie ihr ein Ampersand (&) hinzu.

    & 7zip.exe

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

    & "c: \ Pfad mit Leerzeichen \ SomeCommand.exe" "/ Parameter2" "/ Parameter2" "Wert von Parameter2" "Wert2` "mit einem Zitat"

Versuche dies:

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

Oder auch:

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

5
2017-08-11 15:07





James Holwell Ich mag deine 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()) 
}

2
2017-10-11 17:56





WinRAR kann im CMD-Modus arbeiten und Argumente akzeptieren


0
2017-08-03 19:49