Home All Groups Group Topic Archive Search About

Need help with delete old files script



Author
8 Oct 2007 5:56 PM
Dave Allen
I need a script that will delete files and folders older then 30 days.
I found this script and it works except it does not scan sub-folders

http://blogs.msdn.com/benjguin/archive/2006/12/01/delete-old-files-script.aspx

Does anyone know how to make this scan sub-folders?


cscript DeleteOldFiles.vbs "C:\Test" 30


option explicit

Call DoTheJob()
WScript.Echo "--- end of script execution ---"

Sub DoTheJob
    dim limitDate
    dim formattedLimitDate
    dim folder
    dim strComputer
    dim objWMIService
    dim colFileList
    dim objFile
    dim nbFiles
    dim totalFiles
    dim nbErrors
    dim result
    dim nbDays

    if WScript.Arguments.Count <> 2 then
        WScript.Echo "usage : DeleteOldFiles.vbs <folder> <nb of days ago>"
        WScript.Echo "sample: DeleteOldFiles.vbs C:\Windows\temp 90"
        Exit Sub
    end if

    folder = WScript.Arguments(0)
    nbDays = WScript.Arguments(1)

    'calculate and format limit date
    limitDate = DateAdd("d", -1 * nbDays , Date)

    formattedLimitDate = DatePart("yyyy", limitDate)

    if DatePart("m", limitDate) < 10 then
     formattedLimitDate = formattedLimitDate & "0"
    end if
    formattedLimitDate = formattedLimitDate & DatePart("m", limitDate)

    if DatePart("d", limitDate) < 10 then
     formattedLimitDate = formattedLimitDate & "0"
    end if
    formattedLimitDate = formattedLimitDate & DatePart("d", limitDate)

    'show what will be done
    WScript.Echo "Will remove files from " & folder & " with a date older
than " & formattedLimitDate & " (" & nbDays & " days ago)"


    'Get the files and delete the old ones
    strComputer = "."

    Set objWMIService = GetObject("winmgmts:" _
        & "{impersonationLevel=impersonate}!\\" & strComputer &
"\root\cimv2")

    Set colFileList = objWMIService.ExecQuery _
        ("ASSOCIATORS OF {Win32_Directory.Name='" & folder & "'} Where " _
            & "ResultClass = CIM_DataFile")

    nbFiles = 0
    totalFiles = 0
    nbErrors = 0

    For Each objFile In colFileList
        totalFiles = totalFiles + 1
        if objFile.CreationDate < formattedLimitDate then

            result = objFile.Delete()

         WScript.Echo objFile.Name & " - " & objFile.CreationDate & ".
Delete Result: " & result
         if result = 0 then
             nbFiles = nbFiles + 1
         else
             nbErrors = nbErrors + 1
         end if
        end if
    Next

    'Show the result
    Wscript.Echo "Total files in folder: " & totalFiles
    WScript.Echo "Deleted files:         " & nbFiles
    WScript.echo "Errors:                " & nbErrors
End Sub

Author
9 Oct 2007 6:56 PM
dveit
Try building a WMI query or WSH FSO function that enumerates the subfolders
from the root folder you're checking. Then for each subfolder run your
routine that does the file cleanup. Plagiarized from the Windows 2000
Scripting Guide:

strRootFolder = "c:\test"
strComputer = "."
Set objWMIService = GetObject("winmgmts:"_
    & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")
Set colSubfolders = objWMIService.ExecQuery _
    ("ASSOCIATORS OF {Win32_Directory.Name='" & strRootFolder & "'} " _
    & "WHERE AssocClass = Win32_Subdirectory " _
    & "ResultRole = PartComponent")

For Each objFolder in colSubFolders
    'Run your subroutine to purge old files here
Next

Show quote
"Dave Allen" <nom***@namail.com> wrote in message
news:O3Vw0SdCIHA.4752@TK2MSFTNGP04.phx.gbl...
>I need a script that will delete files and folders older then 30 days.
> I found this script and it works except it does not scan sub-folders
>
> http://blogs.msdn.com/benjguin/archive/2006/12/01/delete-old-files-script.aspx
>
> Does anyone know how to make this scan sub-folders?
>
>
> cscript DeleteOldFiles.vbs "C:\Test" 30
>
>
> option explicit
>
> Call DoTheJob()
> WScript.Echo "--- end of script execution ---"
>
> Sub DoTheJob
>    dim limitDate
>    dim formattedLimitDate
>    dim folder
>    dim strComputer
>    dim objWMIService
>    dim colFileList
>    dim objFile
>    dim nbFiles
>    dim totalFiles
>    dim nbErrors
>    dim result
>    dim nbDays
>
>    if WScript.Arguments.Count <> 2 then
>        WScript.Echo "usage : DeleteOldFiles.vbs <folder> <nb of days ago>"
>        WScript.Echo "sample: DeleteOldFiles.vbs C:\Windows\temp 90"
>        Exit Sub
>    end if
>
>    folder = WScript.Arguments(0)
>    nbDays = WScript.Arguments(1)
>
>    'calculate and format limit date
>    limitDate = DateAdd("d", -1 * nbDays , Date)
>
>    formattedLimitDate = DatePart("yyyy", limitDate)
>
>    if DatePart("m", limitDate) < 10 then
>     formattedLimitDate = formattedLimitDate & "0"
>    end if
>    formattedLimitDate = formattedLimitDate & DatePart("m", limitDate)
>
>    if DatePart("d", limitDate) < 10 then
>     formattedLimitDate = formattedLimitDate & "0"
>    end if
>    formattedLimitDate = formattedLimitDate & DatePart("d", limitDate)
>
>    'show what will be done
>    WScript.Echo "Will remove files from " & folder & " with a date older
> than " & formattedLimitDate & " (" & nbDays & " days ago)"
>
>
>    'Get the files and delete the old ones
>    strComputer = "."
>
>    Set objWMIService = GetObject("winmgmts:" _
>        & "{impersonationLevel=impersonate}!\\" & strComputer &
> "\root\cimv2")
>
>    Set colFileList = objWMIService.ExecQuery _
>        ("ASSOCIATORS OF {Win32_Directory.Name='" & folder & "'} Where " _
>            & "ResultClass = CIM_DataFile")
>
>    nbFiles = 0
>    totalFiles = 0
>    nbErrors = 0
>
>    For Each objFile In colFileList
>        totalFiles = totalFiles + 1
>        if objFile.CreationDate < formattedLimitDate then
>
>            result = objFile.Delete()
>
>         WScript.Echo objFile.Name & " - " & objFile.CreationDate & ".
> Delete Result: " & result
>         if result = 0 then
>             nbFiles = nbFiles + 1
>         else
>             nbErrors = nbErrors + 1
>         end if
>        end if
>    Next
>
>    'Show the result
>    Wscript.Echo "Total files in folder: " & totalFiles
>    WScript.Echo "Deleted files:         " & nbFiles
>    WScript.echo "Errors:                " & nbErrors
> End Sub
>
>
>
Author
9 Oct 2007 8:47 PM
urkec
"Dave Allen" wrote:

> I need a script that will delete files and folders older then 30 days.
> I found this script and it works except it does not scan sub-folders
>
> http://blogs.msdn.com/benjguin/archive/2006/12/01/delete-old-files-script.aspx
>
> Does anyone know how to make this scan sub-folders?

I tried to modify your script to enumerate files recursively.
Based on a post I saw in this group recently, the script will not work with
folder names that include "'" or "}". In that case you will have to use
double instead of single quotes and double the backslashes when executing the
ASSOCIATORS OF query (I hope I got that right). If you are not going to use
the script remotely, FSO is faster than WMI (recent post by R. Mueller
compares the two methods).

This is the modified script, I used ASSOCIATORS OF query with
Win32_SubDirectory class, like in the post by Dveit. I don't have time to
test it, but if you search this group, you can find other samples for working
with files and folders.

option explicit

if WScript.Arguments.Count <> 2 then
WScript.Echo "usage : DeleteOldFiles.vbs <folder> <nb of days ago>"
WScript.Echo "sample: DeleteOldFiles.vbs C:\Windows\temp 90"
WScript.Quit
end if

dim folder
dim nbFiles
dim totalFiles
dim nbErrors
dim limitDate
dim formattedLimitDate
dim nbDays

nbFiles = 0
totalFiles = 0
nbErrors = 0

folder = WScript.Arguments(0)
nbDays = WScript.Arguments(1)

'calculate and format limit date
limitDate = DateAdd("d", -1 * nbDays , Date)

formattedLimitDate = DatePart("yyyy", limitDate)

if DatePart("m", limitDate) < 10 then
formattedLimitDate = formattedLimitDate & "0"
end if
formattedLimitDate = formattedLimitDate & DatePart("m", limitDate)

if DatePart("d", limitDate) < 10 then
formattedLimitDate = formattedLimitDate & "0"
end if
formattedLimitDate = formattedLimitDate & DatePart("d", limitDate)

'show what will be done
WScript.Echo "Will remove files from " & folder & " with a date older than "
& formattedLimitDate & " (" & nbDays & " days ago)"


Call DoTheJob(folder)

'Show the result
Wscript.Echo "Total files in folder: " & totalFiles
WScript.Echo "Deleted files: " & nbFiles
WScript.echo "Errors: " & nbErrors

WScript.Echo "--- end of script execution ---"


Sub DoTheJob (fldr)

dim strComputer
dim objWMIService
dim colFileList
dim objFile
dim result
dim colSubfolders
dim objSubfolder

'Get the files and delete the old ones
strComputer = "."

Set objWMIService = GetObject("winmgmts:" _
& "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2")

Set colFileList = objWMIService.ExecQuery _
("ASSOCIATORS OF {Win32_Directory.Name='" & fldr & "'} Where " _
& "ResultClass = CIM_DataFile")

For Each objFile In colFileList
totalFiles = totalFiles + 1
if objFile.CreationDate < formattedLimitDate then

'result = objFile.Delete()
WScript.Echo objFile.Name & " will be deleted"

'WScript.Echo objFile.Name & " - " & objFile.CreationDate & ".Delete Result:
" & result
if result = 0 then
nbFiles = nbFiles + 1
else
nbErrors = nbErrors + 1
end if
end if
Next

Set colSubfolders = objWMIService.ExecQuery _
("ASSOCIATORS OF {Win32_Directory.Name='" & fldr & "'} Where " _
& "AssocClass = Win32_SubDirectory " _
& "ResultRole = PartComponent")

For Each objSubfolder In colSubfolders
Call DoTheJob (objSubfolder.Name)
Next

End Sub


--
urkec

AddThis Social Bookmark Button