Schreibschutz entfernen

VBS-Anwendungen für das Dateisystem

[Beschreibung] · [Programm-Listing] · [Download des Skripts]


Beschreibung

Wer Dateien von einer CD-ROM auf die Festplatte kopiert, der übernimmt auch das Schreibschutz-Attribut von Dateien und Ordnern. Dies ist besonders lästig, wenn man kopierte Dateien bearbeiten will, weil z.B. Datenbanken schon beim Öffnen wegen dem Schreibschutz eine Warnmeldung ausgeben.
Das folgende Skript entfernt von einem Verzeichnis, den untergeordneten Verzeichnissen und allen Dateien den Schreibschutz.

Das Skript zeigt zum Abschluss eine Meldung, die angibt, wieviele Dateien bearbeitet wurden. Diese Meldung verschwindet nach 5 Sekunden automatisch, so dass das Skript beispielsweise auch von einem Systempflegeprogramm aufgerufen werden kann, ohne daß es den Prozess des aufrufenden Skripts anhält.

Der Code And Not 1 löscht das Schreibschutz-Attribut der Datei. Ersetzt man die 1 durch andere Werte, kann man auch andere Attribute zurücksetzen:
And Not  2 = Versteckte Datei (Hidden)
And Not  4 = Systemdatei
And Not 32 = Archiv-Attribut löschen
Die Attribute kann man auch addieren: 34 = 32 + 2 setzt das Archiv- und das Schreibschutz-Attribut zurück.

Um das Schreibschutz-Attribut zu setzen vwerwendet man Or 1 statt And Not 1. Sinngemäß lauten die Werte für die anderen Attribute:
Or  2 = Versteckte Datei (Hidden)
Or  4 = Systemdatei
Or 32 = Archiv-Attribut setzen

Das Skript basiert auf dem bereits beschriebenen rekurisven Skript zur Suche im Dateisystem.

Es kann auf mehrere Arten aufgerufen werden:

  • Drag & Drop: Man markiert im Explorer eine oder mehrere Dateien und/oder Verzeichnisse und zieht sie auf das Skript

  • Senden an: Im Ordner ‘\Windows\SendTo’ kann eine Verknüpfung zum Skript angelegt werden. Dadurch steht das Skript im Kontextmenü des Explorers unter ‘Senden an...’ zur Verfügung.
    Hinweis: Der Ordner ‘\Windows\SendTo’ ist versteckt, und kann nur angezeigt werden, wenn man im Explorer im Menü ‘Extras -> Ordneroptionen’ (je nach Windows-Version) die Registerkarte ‘Ansicht’ wählt und bei ‘Versteckte Dateien’ die Option ‘Alle Dateien anzeigen’ wählt.

  • Dialog: Falls keine Argumente übergeben wurden, öffnet das Skript beim Aufrufen ein Windows-Dialogfenster, in dem eine Datei oder ein Verzeichnis ausgewählt werden kann.

Programm-Listing

Die grünen Texte im unten angegebenen Quellcode sind Kommentare, die bei der Eingabe ausgelassen werden können.

 Option Explicit
On Error Resume Next

Dim Anzahl
Anzahl = 0

Dim FS, Liste, Nr, Verzeichnis, Objekt


Set Liste    = WScript.Arguments
Set FS       = CreateObject("Scripting.FileSystemObject")


If Liste.Count > 0 Then
    ' Then wird ausgeführt, wenn aus dem Explorer Dateien
    ' mit Drag & Drop auf diese Skript-Datei gezogen wurden
    For Nr = 0 To Liste.Count - 1
        DateiSystemDurchsuchen Liste(Nr)
    Next
Else
    ' Else wird ausgeführt, wenn dieses Skript gestartet
    ' wurde, ohne dass Argumente übergeben wurden

    ' Ruft einen Dialog von Windows auf, mit dem eine
    ' Datei oder ein Ordner ausgewählt werden kann
    Set Verzeichnis = CreateObject("Shell.Application") _
        .BrowseForFolder(0, "Datei oder Verzeichnis wählen" _
        , &H4011, 17)

    ' Skript beenden, falls im Dialog die Schaltfläche
    ' Abbrechen gedrückt wurde
    If TypeName(Verzeichnis) = "Nothing" Then WScript.Quit

    Objekt = LCase(TypeName(Verzeichnis.ParentFolder))

    If (Objekt LIKE "folder*") Then
        For Each Objekt In Verzeichnis.ParentFolder.Items
            If Objekt.Name = Verzeichnis.Title Then Exit For
        Next
    End If
    DateiSystemDurchsuchen Objekt.Path
End If

' *** Ende des Scripts

' ---------------------------------------------------------- '
' Rekursives Unterprogramm um das Dateisystem zu durchsuchen
' ---------------------------------------------------------- '

Private Sub DateiSystemDurchsuchen(Pfad)
    Dim Ordner, UnterOrdner, Datei

    If FS.FolderExists(Pfad) Then
        ' Then: Falls Ordner übergeben wurde
        Set Ordner = FS.GetFolder(Pfad)

        ' Papierkorb nicht bearbeiten
        If LCase(Ordner.Name) = "recycled" Then Exit Sub

        ' Funktion Bearbeiten() für Ordner aufrufen
        If Not Bearbeiten(Ordner, False) Then Exit Sub

        ' Alle Dateien im Ordner bearbeiten
        For Each Datei In Ordner.Files
            ' Prozedur Bearbeiten() für Dateien aufrufen
            If Not Bearbeiten(Datei, True) Then Exit For
        Next

         ' Alle Unterordner rekursiv bearbeiten
        For Each UnterOrdner In Ordner.SubFolders
            ' Einstieg In die Rekursion
            DateiSystemDurchsuchen UnterOrdner
        Next

    ElseIf FS.FileExists(Pfad) Then
        ' Else: Falls eine einzelne Datei übergeben wurde
        Bearbeiten FS.GetFile(Pfad), True
    End If
End Sub


' Zeigt 5 Sekunden lang die Anzahl der bearbeiteten Dateien
CreateObject("WScript.Shell").PopUp Anzahl &  _
    " Dateien und Ordner bearbeitet", 5, "Schreibschutz entfernen"


'*** Ende des Skripts

' Hier wird festgelegt, wie Dateien bearbeitet werden sollen.
Private Function Bearbeiten(Datei, IstDatei)
    ' Schreibschutz-Attribut einer/s Datei/Ordners löschen
    Datei.Attributes = Datei.Attributes And Not 1
    Anzahl = Anzahl + 1
    Bearbeiten = True
End Function