Powershell: Dateien komprimieren und löschen
Verzeichnishygiene wird auf Windows- Servern nicht gerade gross geschrieben. Spätestens beim Einsatz eines IIS wird man sehr schnell merken, dass die Logfiles einfach zu viel Platz wegnehmen.Die Lösung ist das folgende Powershell- Script.
[System.Reflection.Assembly]::LoadFrom("C:\admin\cleanup_iislogs\ICSharpCode.SharpZipLib.dll")
$Now = Get-Date
$ZipDays = "7"
$DelDays = "30"
$LogFolder = "C:\inetpub\logs\LogFiles"
$LastWriteZip = $Now.AddDays(-$ZipDays)
$LastWriteDel = $Now.AddDays(-$DelDays)
$Folders = get-childitem $LogFolder
foreach ($Folder in $Folders) {
write-host "Working on $LogFolder\$Folder" -Foregroundcolor "Yellow";
$ZipFiles = get-childitem $LogFolder\$Folder -exclude *.zip -recurse `
| Where {$_.LastWriteTime -le "$LastWriteZip"}
If ($ZipFiles.length -gt 0 ) {
foreach ($File in $ZipFiles) {
$zipname = "$File.zip"
write-host "Compressing file $File to $zipname" -Foregroundcolor "Yellow";
$zip = [ICSharpCode.SharpZipLib.Zip.ZipFile]::Create($zipname)
$zip.BeginUpdate()
$zip.Add($File)
$zip.CommitUpdate()
$zip.Close()
write-host "Deleting the sourcefile $File" -Foregroundcolor "Red";
Remove-Item $File | out-null
}
Write-Host "Compression complete!" -Foregroundcolor "Green";
}
Else {
Write-Host "Nothing to compress!" -Foregroundcolor "Green";
}
$DelFiles = get-childitem $LogFolder\$Folder\*.zip -recurse `
| Where {$_.LastWriteTime -le "$LastWriteDel"}
If ($DelFiles.length -gt 0 ) {
foreach ($File in $DelFiles) {
write-host "Deleting file $FILE" -Foregroundcolor "Red";
Remove-Item $File | out-null
}
Write-Host "Cleanup complete!" -Foregroundcolor "Green";
}
Else {
Write-Host "Nothing to delete!" -Foregroundcolor "Green";
}
}
Beschreibung
Zum Komprimieren verwende ich die SharpZipLib, eine unter der GPL stehende Zip, GZip, BZip2 and Tar Implementierung für .NET.Zeile 3 legt fest wie alt eine Datei sein muss bevor sie komprimiert wird; Zeile 4 die Anzahl an Tagen wie lange diese komprimierten Dateien aufgehoben werden sollen.
Zeile 5 legt das Arbeitsverzeichnis fest. Im Beispiel ist es das Logverzeichnis eines IIS.
Das Script durchsucht dann alle Ordner unterhalb des in Zeile 5 definierten Verzeichnisses. Wie immer: The script is provided as is without any warranty ;-)