Pregunta

I am trying to create a vbscript that automatically clears files/folders from the recycle bin that have been there for more than x days. the problem is, when I get the deletion date of the files, the DateDiff function returns a mismatch error.

    const Active = TRUE
    const MaxAge = 30
    const RECYCLE_BIN = &Ha&

    checked = 0
    deleted = 0

    Set objFso = CreateObject("Scripting.FileSystemObject")
    Set objShell = CreateObject("Shell.Application")
    Set objFolder = objShell.Namespace(RECYCLE_BIN)
    Set colItems = objFolder.Items

    For Each objItem  In colItems
            Checked = Checked + 1
            dateDeleted = objFolder.GetDetailsOf(objItem, 2) 'the deletion date per file/folder
            If DateDiff("D", dateDeleted, Now()) > MaxAge Then
                    If objItem.Type = "File Folder" Then
                            Deleted = Deleted + 1
                            objFso.DeleteFolder(objItem.Path)
                    Else
                            Deleted = Deleted + 1
                            objFso.DeleteFile(objItem.Path)
                    End If
            End If
    Next
    if Active then verb = " file(s) deleted" Else verb = " file(s) would be deleted"
    WScript.Echo Checked & " file(s) checked, " & Deleted & verb

I have also tried doing this but this also returned to mismatch error:

    const Active = TRUE
    const MaxAge = 30
    const RECYCLE_BIN = &Ha&

    checked = 0
    deleted = 0

    Set objFso = CreateObject("Scripting.FileSystemObject")
    Set objShell = CreateObject("Shell.Application")
    Set objFolder = objShell.Namespace(RECYCLE_BIN)
    Set colItems = objFolder.Items

    For Each objItem  In colItems
            Checked = Checked + 1
            dateStr = objFolder.GetDetailsOf(objItem, 2) 'the deletion date per file/folder
            dateArr = Split(dateStr, " ")

            If DateDiff("D", dateArr(0), Now()) > MaxAge Then
                    If objItem.Type = "File Folder" Then
                            Deleted = Deleted + 1
                            objFso.DeleteFolder(objItem.Path)
                    Else
                            Deleted = Deleted + 1
                            objFso.DeleteFile(objItem.Path)
                    End If
            End If
    Next
    if Active then verb = " file(s) deleted" Else verb = " file(s) would be deleted"
    WScript.Echo Checked & " file(s) checked, " & Deleted & verb

AND tried: const Active = TRUE const MaxAge = 30 const RECYCLE_BIN = &Ha&

    checked = 0
    deleted = 0

    Set objFso = CreateObject("Scripting.FileSystemObject")
    Set objShell = CreateObject("Shell.Application")
    Set objFolder = objShell.Namespace(RECYCLE_BIN)
    Set colItems = objFolder.Items

    For Each objItem  In colItems
            Checked = Checked + 1
            dateStr = objFolder.GetDetailsOf(objItem, 2) 'the deletion date per file/folder
            dateArr = Split(dateStr, " ")
            dateDeleted = cDate(dateArr(0))
            If DateDiff("D", dateDeleted, Now()) > MaxAge Then
                    If objItem.Type = "File Folder" Then
                            Deleted = Deleted + 1
                            objFso.DeleteFolder(objItem.Path)
                    Else
                            Deleted = Deleted + 1
                            objFso.DeleteFile(objItem.Path)
                    End If
            End If
    Next
    if Active then verb = " file(s) deleted" Else verb = " file(s) would be deleted"
    WScript.Echo Checked & " file(s) checked, " & Deleted & verb

but again this does not work and creates a mismatch error on the cDate.

any help would be appreciated

¿Fue útil?

Solución

This looks related to the string encoding that's returned from GetDetailsOf(). I didn't spend a lot of time trying to figure out what it was. Instead, I just stripped out any non-date characters by using a regex. Here's an example:

Dim re
Set re = New RegExp
re.Global = True
re.Pattern = "[^/0-9]"    ' Assuming regional settings use "/" for separator

d = objFolder.GetDetailsOf(objItem, 2)

' Split by space char and return first element to get date only...
d = Split(d, " ")(0)

' Remove any non-date chars...
d = re.Replace(d, "")

MsgBox DateDiff("d", d, Date)    ' Works!

Of course, you could combine everything into a single statement:

d = re.Replace(Split(objFolder.GetDetailsOf(objItem, 2), " ")(0), "")
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top