Alle Access-Datenbanken komprimieren

Das Problem

Das folgende Skript ist eine Variante des Access-Scripts zur automatischen Komprimierung und Sicherung von Datenbanken. Dieses Skript durchsucht systematisch alle lokalen Festplatten und komprimiert alle .mdb und .mde-Dateien.

Auch hier wird das Archivbit vor dem Komprimieren geprüft nach dem Komprimieren gelöscht, damit das Skript einen zweiten Durchlauf schneller absolviert.

Voraussetzungen

Zum Komprimieren muss neben dem Windows Scripting Host wieder eine Access 2000-Version oder eine 'kostenlose' Access-2000 Runtime Version (aus dem Office 2000 Developers-Paket) auf dem System installiert sein.

Bekannnte Probleme

Wenn das Skript eine Datenbank nicht bearbeiten kann, hält Access an und wartet, bis der Benutzer eine Dialogbox bestätigt. Aus diesem Grunde läuft Access nicht minimiert, sondern in normaler Fenstergröße, aber ohne Fokus. Typische Probleme sind:

  • Tote Links: Im Ordner 'Dokumente' befinden sich Verweise auf eine Datenbank, die aber gelöscht wurde.

  • Access kann eine Datenbank nicht retten.

  • Die Datenbank wurde mit einem Kennwort geschützt.

  • Auf der Festplatte befindet sich ein älteres Access, welches versucht, Datenbanken einer neueren Version zu komprimieren.

  • Es existieren zwei Access-Installationen auf den System eine von Access 97 und eine von Access 2000. Wenn die letzte Datenbank mit Access 97 geöffnet wurde, so ist diese Version allen .mdb/.mde-dateien zugewiesen - und damit trifft vermutlich wieder der vorgenannte Punkt auf irgend eine Datenbank zu.

  • Das Komprimieren ist nur bei exklusivem Zugriff möglich. Wenn die Datenbank gerade verwendet wird, hält Access an.

  • Trotz intensiver Festplattentätigkeit scheint das Programm einige Sekunden inaktiv zu sein. Dies ist allerdings die Phase, in der es das Dateisystem nach .mdb und .mde-Dateien durchsucht und daher normal.

Das Script ‘AlleAccessDBsKomprimieren.vbs’
    Set Shell = CreateObject("WScript.Shell")
    Set Access = CreateObject("Access.Application")
    Set DateiSystem = CreateObject("Scripting.FileSystemObject")
    Set Suche = Access.FileSearch

    AccessPfad =  """" & Access.SysCmd(9) & "MSACCESS.EXE"" """

    On Error Resume Next

    For Each LaufWerk In DateiSystem.Drives

      If Laufwerk.DriveType = 2 Then

        For Each DateiTyp In Array("*.mde", "*.mdb")

          Suche.LookIn = LaufWerk.DriveLetter & ":\"
          Suche.FileName = DateiTyp
          Suche.SearchSubFolders = True
          Suche.Execute()

          For Each Datei In Suche.FoundFiles

            If Access.DBEngine.OpenDatabase(Datei).Updatable Then
              With DateiSystem.GetFile(Datei)
                    If .Attributes And 32 Then
                  Shell.Run AccessPfad & Datei & """ /compact", 4, True
                  .Attributes = .Attributes And Not 32
                End If
              End With
            End If
          Next
        Next
      End If
    Next
Erstellen des Scripts

Damit das Script funktioniert, sind folgende Maßnahmen zu treffen:

  • NotePad öffnen, den oben angegebenen Quelltext in eine leere Textdatei kopieren

  • Die zu komprimierenden Dateien stehen am Anfang der Datei. Die Zahl der Dateien ist beliebig. Nach dem Schlüsselwort Komprimieren wird der vollständige Pfad der MDB-Datei eingetragen - fertig.

  • Datei mit der Endung .VBS speichern

  • Pfade zu Access und dem Packprogramm prüfen / korrigieren

Das VBS läuft beim ersten Aufruf sehr langsam, weil jede MDB-Datei komprimiert und gepackt werden muß. Da über das Archiv-Attribut geprüft wird, ob die Datei verändert wurde, ist der Ablauf aber ab dem zweiten Mal erheblich schneller, da nur noch die geänderten Dateien geprüft werden.
Dies bietet auch einen weiteren Vorteil: Da die Backups nicht bei jedem Durchlauf erstellt werden, enthalten enthalten die Backup-Versionen wirklich ältere Daten, so daß nach einer Aktualisierung auch 'mal der Rückwärtsgang eingelegt werden kann.

Weitere Anpassungen

Die vom Skript bearbeiteten Dateitypen werden in der Zeile
  For Each DateiTyp in Array("*.mde", "*.mdb")
festgelegt. Die Liste kann um beliebige Access-Dateitypen erweitert werden.