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 ;-)