Link to home
Start Free TrialLog in
Avatar of jacksonwsa
jacksonwsa

asked on

Simple delete folder script

Hello, I'm looking for a script .bat or .vbs (something that will easily work with task scheduler) that will delete a folder that is at least one day old (or anything but the current day) with a specific name. Here's my scenario.

I have many old anti-virus folders getting archived with the date as the folder name here are 3 folder I have currently in my directory and I would like to have a script that deletes the other two - I DO NOT WANT TO DELETE ANY OF THE OTHER FOLDERS IN THAT DIRECTORY. With the 3 folders below it would delete #'s 1. and 2.

1. 20130130 (Date modified 1/31)
2. 20130201 (Date modified 2/2)
3. 20130202 (Date modified 2/3)

I would like to run this script every morning, I'm assuming we can do something like (2013*) for the name piece?

THANKS!
Avatar of Gabriel Clifton
Gabriel Clifton
Flag of United States of America image

I use this VB to delete "old" folders and use a batch script to call it. You could just call it from task scheduler or command prompt.
cscript "\\server\share$\deleteold.vbs" "path to root folder to check date eg \\server\share2" 14  <-- age of oldest folder you want to keep, 1 would be one day.

Dim oShell
Set oShell = CreateObject("Wscript.Shell")

forceUseCScript

Sub forceUseCScript()
   If Not WScript.FullName = WScript.Path & "\cscript.exe" Then
      oShell.Run "cmd.exe /k " & WScript.Path & "\cscript.exe //NOLOGO " & Chr(34) & WScript.scriptFullName & Chr(34),1,False
      WScript.Quit 0
   End If
End Sub


'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

Open in new window

Avatar of jacksonwsa
jacksonwsa

ASKER

This seems pretty complex for something this simple
It is actually not complex. The code above is the vbscript that reads the date all of the folders in the root folder and deletes any "old" folders. This script can be permanent in that you create it once and and just change your calls whether by batch script, command line, or scheduled task to change your variables. I use this all of the time and it makes things super easy.

Example: I have the script on my desktop and I want to delete all folders in my mapped drive g: that are older than 10 days

cscript "%userprofile%\desktop\deleteold.vbs" "G:\" 10

or

Example 2: I have the script on my desktop and I want to delete all folders in my mapped drive g: in the folder test that are older than 21 days

cscript "%userprofile%\desktop\deleteold.vbs" "G:\test" 21
Avatar of Giovanni
Hi, try this...

@echo off
setlocal enabledelayedexpansion
cd /d "%~dp0"
set mm=%date:~4,2%
set dd=%date:~7,2%
set yyyy=%date:~10,4%
set yy=%date:~12,2%
if exist !yyyy!!mm!!dd! echo Skipping !yyyy!!mm!!dd!
for /f %%f in ('dir /ad/od/b') do (
	if not %%f==!yyyy!!mm!!dd! (
		echo rd /s /q %%f
	)
)

Open in new window


Remove the echo in front of the rd /s /q %%f command if the output is the intended result.
OK, gotcha - thanks PantherTech. I'm going to test this tomorrow after I tried creating a few test folders.
Oh I don't know if you noticed my original comment, I also have to have it only select folders that begin with 2013... not just anything older than 1 day. Is there a way I can get that to work?
ASKER CERTIFIED SOLUTION
Avatar of Giovanni
Giovanni
Flag of United States of America image

Link to home
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
Start Free Trial