Mit VBS ~~Dateien in Ordnerstruktur löschen


RMU

Grünschnabel
#1
Hallo Zusammen

Ich bräuchte ein VBS Script was mir in sämtlichen Benutzerordnern auf dem Server immer mal wieder die temporären Dateien löscht, welche dadurch entstehen wenn mein Officedokumente nicht sauber bendet. Die diese fangen dann ja mit mindestens einer Tilde an.

Dim FSO
On Error Resume Next
Set FSO = CreateObject("Scripting.FileSystemObject")
FSO.DeleteFile("C:\Test\~*.*"), True

Ich kann mit diesem Vierzeiler nur auf erster Ebene löschen. Das das Script auch sämtliche Unterordner durchforstet und diese Dateien löscht bekomme ich auch nach zig Google-Versuchen mit Codeschnipseln nicht hin :\

Meine Spezialität ist Citrix und Virtualisierungen - Mit VBS habe ich nicht viel am Hut. Es wäre Super wenn mir hier jemand Helfen kann.

Grüsse
Ralph
 

Yaslaw

n/a
Moderator
#2
Ungetestet. Eine Funktion die sich selber für jeden Unterordner ausführt. Also eine Rekursive Sub
Visual Basic:
deleteFilesInFolderRekursiv "C:\Test", "~*.*"

'/**
' * Rekurisves Löschen von Dateien
' * @param    String     Pfad des Ordners
' */
Sub deleteFilesInFolderRekursiv(iFldPath, iFileNamePattern)
    Static fso
    Dim deletePath
    Dim subFld

    'fso initialisieren, falls es nicht schon ist. Sollte dank Static nur beim Ersten AUfruf der Fall sein.
    If fso Is Nothing Then Set fso = CreateObject("Scripting.FileSystemObject")

    'Die Funktion für jeden Unterordner ausführen
    For Each subFld In fso.GetFolder(iFldPath).SubFolders
        deleteFilesInFolderRekursiv subFld.Path, iFileNamePattern
    Next subFld

    'Löschpfad zusammensetzen und ausführen
    deletePath = fso.BuildPath(iFldPath, iFileNamePattern)
    fso.DeleteFile deletePath, True
End Sub
 

RMU

Grünschnabel
#3
Hi Yaslaw

Danke für das schnelle Feedback. Hier bekomme ich die Fehlermeldung:

Zeile: 8
Zeichen: 5
Fehler: Anweisung erwartet
Code: 800A0400
Quelle: Kompilierungsfehler in Microsoft VBScript

:\

Grüsse
Ralph
 

Yaslaw

n/a
Moderator
#4
Hab mal nachgeschaut. VBS kennt Static nicht. Man kann das aber über eine globale Variable (public) lösen
Static-Zeile aus dem Scrip löschen und dafür am ANfang des Script die Publiczeile hinzufügen
Visual Basic:
Public fso
deleteFilesInFolderRekursiv "C:\Test", "~*.*"

'/**
' * Rekurisves Löschen von Dateien
' * @param    String     Pfad des Ordners
' */
Sub deleteFilesInFolderRekursiv(iFldPath, iFileNamePattern)
    Dim deletePath
    Dim subFld

    'fso initialisieren, falls es nicht schon ist. Sollte dank Static nur beim Ersten AUfruf der Fall sein.
    If fso Is Nothing Then Set fso = CreateObject("Scripting.FileSystemObject")
....
 

RMU

Grünschnabel
#5
Jetzt kommt die nächste Meldung:

Zeile: 18 (Next subFld)
Zeichen: 10
Fehler: Anweisungsende erwartet
Code: 800A0401
QQUell: Kompilierungsfehler in Microsoft VBScript
 

Yaslaw

n/a
Moderator
#6
Mach mal bei Next subFld das subFld weg.

Ist halt try and Error. Ich programiere VBA und ganz selten VBS (etwa alle 5 Jahre mal).
 

RMU

Grünschnabel
#7
Jetzt kommt Fehlermeldung früher:

Zeile: 13 (If fso Is Nothing Then Set fso = CreateObject("Scripting.FileSystemObject"))
Zeichen: 5
Fehler: Objekt erforderlich
 

Yaslaw

n/a
Moderator
#8
Dann vereinfachen wir und lassen das Selbstinitialiserende.

Visual Basic:
Public fso
Set fso = CreateObject("Scripting.FileSystemObject")

deleteFilesInFolderRekursiv "C:\Test", "~*.*"

'/**
' * Rekurisves Löschen von Dateien
' * @param    String     Pfad des Ordners
' */
Sub deleteFilesInFolderRekursiv(iFldPath, iFileNamePattern)
    Dim deletePath
    Dim subFld

    'Die Funktion für jeden Unterordner ausführen
    For Each subFld In fso.GetFilder(iFldPath).SubFolders
        deleteFilesInFolderRekursiv subFld.Path, iFileNamePattern
    Next subFld

    'Löschpfad zusammensetzen und ausführen
    deletePath = fso.BuildPath(iFldPath, iFileNamePattern)
    fso.DeleteFile deletePath, True
End Sub
 

RMU

Grünschnabel
#9
Jetzt Nörgelt er wieder die Zeile von vorhin an: Next subFld

Wenn ich "subFLD" lösche kommt anhängender Fehler: fehler.jpg
 

RMU

Grünschnabel
#11
Kompletter lauffähiger Code also:

Visual Basic:
Public fso
Set fso = CreateObject("Scripting.FileSystemObject")
deleteFilesInFolderRekursiv "C:\Test", "~*.*"
'/**
' * Rekurisves Löschen von Dateien
' * @param    String     Pfad des Ordners
' */
Sub deleteFilesInFolderRekursiv(iFldPath, iFileNamePattern)
    Dim deletePath
    Dim subFld
    'Die Funktion für jeden Unterordner ausführen
    For Each subFld In fso.GetFolder(iFldPath).SubFolders
        deleteFilesInFolderRekursiv subFld.Path, iFileNamePattern
    Next
    'Löschpfad zusammensetzen und ausführen
    deletePath = fso.BuildPath(iFldPath, iFileNamePattern)
    fso.DeleteFile deletePath, True
End Sub
 
Zuletzt bearbeitet von einem Moderator:

RMU

Grünschnabel
#13
Geht doch nicht. Lokal auf meinem PC gehts. Wenn ich auf dem Server starte, scheint er mir nur den ersten Benutzerordner zu nehmen. Die anderen nicht :\
 

RMU

Grünschnabel
#15
Ich starte es direkt als Admin auf dem Server. Ist ein normales Verzeichnis mit der Bezeichnung "User". Und darunter dann halt für jeden Benutzer ein Ordner mit jeweils diversen Unterordner.
 

Zvoni

Erfahrenes Mitglied
#16
Yaslaw's Frage war:
Ist es ein Pfad "\\MeinServer\MeinShare\Verzeichnis\user1"
oder ist es ein
"N:\Verzeichnis\user1" usw.
 

RMU

Grünschnabel
#20
Wenn ich "On Error Resume next" Auskommentiere, bekomme ich Fehler für Line 23:
"fso.DeleteFile deletePath, True"

Könnte es sein, das er Abbricht wenn er in einem Ordner keine Datei findet?
 

Neue Beiträge