Ordner, Unterordner und Dateien löschen per VBS

Yaslaw

alter Rempler
Moderator
Hm... Ich programmiere fast nie VBS sondern immer VBA. Kennt VBS den Befehl Like nicht?

Ich habe aber ein ähnliches Script. Dort arbeite ich aber mit RegExp und das funktioniert einwandfrei

Visual Basic:
'-------------------------------------------------------------------------------
'File         : lib_cookies
'               Copyright mpl by ERB software
'               All rights reserved
'               http://wiki.yaslaw.info/dokuwiki/doku.php/vba/
'Environment  : VBA 2007 +
'Version      : 1.0.0
'Name         :
'Author       : Stefan Erb (ERS)
'History      : 03.05.2017 - ERS - Creation
'-------------------------------------------------------------------------------
Option Explicit

'/**
' * Pfad zu den Cookies
' */
Const C_COOKIES_FOLDER = "C:\Users\XXXXXX\AppData\Roaming\Microsoft\Windows\Cookies\"
Const C_LOG_FILE = "C:\XXXX\VB_SCRIPTS\del_cookies.log"

Dim fso: Set fso = CreateObject("Scripting.FileSystemObject")
Dim logStream:   Set logStream = fso.OpenTextFile(C_LOG_FILE, 8, True)
Dim cnt

cnt = deleteCookies(C_COOKIES_FOLDER, "/tagesanzeiger/i")
logStream.writeLine now & vbTab & cnt & vbTab &  "/tagesanzeiger/i"
cnt = deleteCookies(C_COOKIES_FOLDER, "/landbote/i")
logStream.writeLine now & vbTab & cnt & vbTab &   "/landbote/i"

logStream.close
'-------------------------------------------------------------------------------
' Public members
'-------------------------------------------------------------------------------
'/**
' * Löscht alle Cookies eines Patterns. Das Cookie-Verzeichnis wird Rekursiv durchsucht. Sprich, auch die Unterverzeichnisse sind betroffen
' * @param  String      URL zu den Cookies
' * @param  String      RegExp-Pattern inkl. Modifiers -> http://wiki.yaslaw.info/doku.php/vba/cast/cregexp#pattern_inkl_modifiers
' * @return Long        Anzahl gelöschter Cookies
' */
Function deleteCookies(ByVal iPath, ByVal iPattern)
    Dim f
    Dim rxEntry: Set rxEntry = cRx(iPattern)


    Dim rxFileFilter:  Set rxFileFilter = cRx("/\.txt$/i")

    'Durch die Subfolder iterieren
    For Each f In fso.GetFolder(iPath).SubFolders
        deleteCookies = deleteCookies + deleteCookies(f.path, iPattern)
    Next
    
    'Die einzelnen Files durchgehen
    For Each f In fso.GetFolder(iPath).Files
        'sicherstellen, dass es ein Cookie ist
        If rxFileFilter.test(f.name) Then
            'Inhalt prüfen
            Dim stream
            Set stream = f.OpenAsTextStream
            if not stream.AtEndOfStream then
                If rxEntry.test(stream.ReadAll) Then
                    stream.close
                    f.delete True
                    deleteCookies = deleteCookies + 1
                End If
            end if
        End If
    Next    
End Function


'-------------------------------------------------------------------------------
' Private Libraries
'-------------------------------------------------------------------------------

' Die folgende Version cRx() verwende ich als Library in anderen Funktion.
' Sie entspricht der Version mit den Modifier im String.

'/**
' * Dies ist die Minimalversion von cRegExp
' * http://wiki.yaslaw.info/dokuwiki/doku.php/vba/cast/cregexp#abgespeckte_version
' * mögliche Delemiter: @&!/~#=\|
' * mögliche Modifiers: g (Global), i (IgnoreCode, m (Mulitline)
' *
' * @example    myRx = cRx("/([a]{2,})/i") 'Finde alle folgen von a. Flag:IgnoreCase
' * @version    2.1.0 (01.12.2014)
' * @param      String      Pattern mit Delimiter und Modifier analog zu PHP
' * @return     Object      RegExp-Object
' */
Function cRx(ByVal iPattern)
    Set cRx = CreateObject("VBScript.RegExp")
    Dim rxP: Set rxP = CreateObject("VBScript.RegExp"): rxP.pattern = "^([@&!/~#=\|])?(.*)\1(?:([Ii])|([Gg])|([Mm]))*$"
    Dim sm :           Set sm = rxP.execute(iPattern)(0).subMatches
    cRx.pattern = sm(1):        cRx.IgnoreCase = Not isEmpty(sm(2)):       cRx.Global = Not isEmpty(sm(3)):     cRx.Multiline = Not isEmpty(sm(4))
End Function
 

Supe

Erfahrenes Mitglied
Ich leider auch nicht. Gibt's vielleicht einen VBS-Experten, der mir hier weiterhelfen könnte?
 
Zuletzt bearbeitet:

Yaslaw

alter Rempler
Moderator
Ein Kurzer Test hat ergeben, dass VBS keine Freude am LIKE hat. Dein Link zeigt zu VB. Nicht ales was in VB6 oder VBA funktioniert geht auch in VBS.

Du kannst entweder über RegExp gehen oder den Dateinamen zerlegen. Das ist einfacher, geht jedoch nur gut, wenn du wirklich nur den Anfang prüfen willst.
Visual Basic:
'Achtung: Beim Filter den * weglassen!
deleteFilesWithFilter "C:\ABC\test", "bas"

Sub deleteFilesWithFilter(strFolder, strFilter)
 dim oFolder, oFiles, item
 Set oFolder = fso.GetFolder(strFolder)
 Set oFiles = oFolder.Files
 
 For each item in oFiles
  If left(item.Name, len(strFilter)) = strFilter Then
   ' um Schreibgeschützte Dateien zu löschen, True übergeben
   fso.DeleteFile item, True
  End If
 
 Next
End Sub
 

Supe

Erfahrenes Mitglied
Hurra! Das tut's jetzt! Sauber! Danke Yaslaw!

Jetzt möchte ich nur nicht nur die Ordner geleert haben sondern die Ordner ganz wegschießen:

Visual Basic:
Set fso = CreateObject("Scripting.FileSystemObject")
Call deleteFolder("C:\Java\tomcat7a\temp")
Call deleteFolder("C:\Java\tomcat7a\work")
Call deleteFolder("C:\Java\tomcat7a\logs")
Sub deleteFolder(strFolder)
Call DeleteFiles(strFolder)
 Call fso.DeleteFolder(strFolder & "\*")
End Sub

Damit werden immer nur die Ornder geleert, aber "work" soll auch weg, da es neu erstellt werden soll.
Wie ist dazu der Befehl?
 

Supe

Erfahrenes Mitglied
Bekomme ich nicht hin. Die Ordner werden geleert, aber nicht gelöscht, egal mit welcher Methode.