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()
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()
Ich habe mal kurz geschaut, das „normale“ ZIP Format ist auf 4GB limitiert, da sind sie mit den 5GB leider drüber, man findet diese Info z.B. hier https://stackoverflow.com/questions/63284041/how-to-skip-zip64-format-while-zipping-file-above-4gb-size-in-c-sharp oder hier https://support.winzip.com/hc/en-us/articles/115011738628-Information-about-size-limits-with-WinZip