Arbeiten mit ZIP Dateien unter Powershell

Seit PowerShell 5.0 gibt es die Cmdlets Compress-Archive und Expand-Archive die Zip Dateien erstellen oder entpacken können.
In manchen Situationen sind diese Cmdlets nicht ausreichend, z.B. weil sie ein 2GB Limit haben, oder weil man eine ältere PowerShell Version nutzt
In diesem Fall kann man in PowerShell mit ZIP Dateien unter Zuhilfenahme der entsprechenden .Net Framework Methode arbeiten

Hier die wichtigsten Beispiele:

# Benötigte Assembly laden
Add-Type -AssemblyName System.IO.Compression.FileSystem

# Erstellen eines Zip eines Ordners
[System.IO.Compression.ZipFile]::CreateFromDirectory('C:\Windows\logs\','C:\Temp\Logs.zip')

# Extrahieren eines kompletten Zips in einen Ordner
[System.IO.Compression.ZipFile]::ExtractToDirectory('C:\temp\Logs.zip','C:\unpack\')

# Abfragen des Inhaltes einer Zip Datei
$zip =  [System.IO.Compression.ZipFile]::Open("C:\Temp\Logs.zip",'Read')
$zip.Entries.FullName
$zip.Dispose()

# Einzelne Datei aus einen Zip entpacken (in diesem Beispiel die letzte Datei im Zip)
$zip = [System.IO.Compression.ZipFile]::Open('C:\Temp\Logs.zip', 'Read')
[System.IO.Compression.ZipFileExtensions]::ExtractToFile($zip.Entries[-1],"C:\temp\$($zip.Entries[-1].Name)", $true)
$zip.Dispose()

# Bestimte Teilmenge an Dateien aus einem Zip entpacken
$zip = [System.IO.Compression.ZipFile]::Open('C:\Temp\Logs.zip', 'Read')
$zip.Entries | Where-Object Name -like *.log | ForEach-Object{[System.IO.Compression.ZipFileExtensions]::ExtractToFile($_, "C:\Unpack\$($_.Name)", $true)}
$zip.Dispose()

# Einzelne Datei einer existierenden Zip Date hinzufügen
$zip =  [System.IO.Compression.ZipFile]::Open('C:\Temp\Logs.zip','Update')
$compressionLevel = [System.IO.Compression.CompressionLevel]::Fastest
[System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($zip,'C:\Windows\regedit.exe','NewFiles\Regedit.exe',$compressionLevel)
$zip.Dispose()

# Mehrere Dateien einer existierenden Zip Datei hinzufügen
$zip =  [System.IO.Compression.ZipFile]::Open('C:\Temp\Logs.zip','Update')
$compressionLevel = [System.IO.Compression.CompressionLevel]::Fastest
Get-ChildItem "C:\Windows\*.log" | ForEach-Object {[System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($zip, $_.FullName, (Split-Path $_.FullName -Leaf), $compressionLevel)}
$zip.Dispose()

2 Kommentare

  1. Matthias Makait

    Guten Tag Herr Mariotti,

    vielen Dank für die super Erklärung hier!

    Ich nutze die .NET-Library, um zu zippen gerade aufgrund der berschränkten Speichergröße.
    Leider habe ich dasselbe Problem auch mit folgendem Construct und bekomme bei einer SQL-Backupdatei, die knapp 5 GB groß ist, die Info, das diese zu groß ist „Der Datenstrom ist zu lang“. Gibt’s eine Möglichkeit die maximal zugelassene Größe anzupassen?

    Code:
    $zipFile = [System.IO.Compression.ZipFile]::Open(„$rootPath\backups.zip“,“Update“)
    $fileName = [System.IO.Path]::GetFileName(„$dbBackupPath\“ + $dbName[’name‘] + „.bak“)
    [System.IO.Compression.ZipFileExtensions]::CreateEntryFromFile($zipFile,“$dbBackupPath\“ + $dbName[’name‘] + „.bak“,$fileName,“Optimal“) | Out-Null
    $zipFile.Dispose()

Schreibe einen Kommentar zu Matthias Makait Abbrechen

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert