# Mit VBS ~~Dateien in Ordnerstruktur löschen



## RMU (2. Mai 2019)

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 (2. Mai 2019)

Ungetestet. Eine Funktion die sich selber für jeden Unterordner ausführt. Also eine Rekursive Sub

```
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 (2. Mai 2019)

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 (2. Mai 2019)

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

```
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 (2. Mai 2019)

Jetzt kommt die nächste Meldung:

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


----------



## Yaslaw (2. Mai 2019)

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 (2. Mai 2019)

Jetzt kommt Fehlermeldung früher:

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


----------



## Yaslaw (2. Mai 2019)

Dann vereinfachen wir und lassen das Selbstinitialiserende.


```
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 (2. Mai 2019)

Jetzt Nörgelt er wieder die Zeile von vorhin an:     Next subFld

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


----------



## RMU (2. Mai 2019)

STOP!

Funktioniert "GetFilder" war natürlich "GetFolder" korrigiert - Läuft


----------



## RMU (2. Mai 2019)

Kompletter lauffähiger Code also:


```
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
```


----------



## RMU (2. Mai 2019)

Viiiielen lieben Dank Yaslaw - ich hoffe ich kann Dir auch mal einen Stein in den Garten werfen 

Grüsse
Ralph


----------



## RMU (2. Mai 2019)

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 :\


----------



## Yaslaw (2. Mai 2019)

Ist es ein Serverpfad oder ein Gemapptes Laufwerk?


----------



## RMU (2. Mai 2019)

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 (2. Mai 2019)

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


----------



## RMU (2. Mai 2019)

Nein. Ordner "D:\User\User1, User2, User3, etc"


----------



## Yaslaw (2. Mai 2019)

Sollte eigentlich funktionieren.

Nimmst du `D:\User\User1` als Startordner oder `D:\User` ?


----------



## RMU (2. Mai 2019)

D:\User


----------



## RMU (2. Mai 2019)

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?


----------



## RMU (2. Mai 2019)

Ja, scheint so zu sein. Wenn er im ersten Ordner so eine Datei nicht findet bricht er ab und geht erst gar nicht zum nächsten Benutzerordner. Gerade lokal auf meinem PC getestet :\


----------



## Yaslaw (2. Mai 2019)

In dem Fall doch den Dateilöschtiel auch über eine Schleife machen


```
Sub deleteFilesInFolderRekursiv(iFldPath, iFileNamePattern)
    Dim deletePath     'String
    Dim subFld         'Filder
    Dim fl             'File

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

    'Dateien löschen
    For Each fl In fso.GetFolder(iFldPath).Files
        If fl.name Like iFileNamePattern Then fl.delete true
    Next
End Sub
```


----------



## RMU (3. Mai 2019)

Hallo Yaslaw

Sorry, bin gestern nicht mehr zum Testen gekommen. Hier kommt nun folgender Fehler:


----------



## RMU (3. Mai 2019)

Wenn ich das Script so abspeichere:

deleteFilesInFolderRekursiv "C:\Test", "~*.*"
'/**
' * Rekurisves Löschen von Dateien
' * @param    String     Pfad des Ordners
' */
Sub deleteFilesInFolderRekursiv(iFldPath, iFileNamePattern)
    Dim deletePath     'String
    Dim subFld         'Filder
    Dim fl             'File
    'Die Funktion für jeden Unterordner ausführen
    For Each subFld In fso.GetFolder(iFldPath).SubFolders
        deleteFilesInFolderRekursiv subFld.Path, iFileNamePattern
    Next
    'Dateien löschen
    For Each fl In fso.GetFolder(iFldPath).Files
        If fl.name Like iFileNamePattern Then fl.delete true
    Next
End Sub


----------



## Zvoni (3. Mai 2019)

Wo ist dein Set fso=CreateObject?


----------



## Zvoni (3. Mai 2019)

Nachtrag: Falls es nicht unbedingt VBS sein muss, geht auch PowerShell.
Office Dateien aus Outlook öffnen

Beitrag #34 ist ein Beispiel, was wir bei uns der Firma verwenden


----------



## RMU (3. Mai 2019)

Zvoni hat gesagt.:


> Nachtrag: Falls es nicht unbedingt VBS sein muss, geht auch PowerShell.
> Office Dateien aus Outlook öffnen
> 
> Beitrag #34 ist ein Beispiel, was wir bei uns der Firma verwenden


Das Problem ist: Wir haben das mit Powershell versucht. PS löscht einfach die versteckten Dateien nicht. Parameter - Force gesetzt, etc.... no Chance. VBS löscht sie aber.


----------



## Yaslaw (3. Mai 2019)

Zvoni hat gesagt.:


> Wo ist dein Set fso=CreateObject?


Und RMU? Hat Zvonis Antwort geholfen?


----------

