Solved

VBScript for deleting nested subfolders every 30 days except one.

Posted on 2010-08-25
14
1,256 Views
Last Modified: 2012-05-10
The following script was intended to delete all subfolders and nested subfolders from a parent folder with the exception of one subfolder named "Log". These subfolders and nested subfolders do contain files as well. To clarify, I want to preserve the parent folder, preserve the Log subfolder (and it's contents), while deleting all other subfolders (and their contents) from the parent. Can someone identify how to correct this script?

Dim fso, OlderThanDate

Dim folder, folderCollection, subFolder

 

OlderThanDate = DateAdd("d", -60, Date) 

Set fso = CreateObject("Scripting.FileSystemObject")

Set folder = fso.GetFolder("D:\archive\")

Set folderCollection = folder.SubFolders

For Each subFolder In folderCollection

    If subFolder.Name <> "Log" Then

        If subFolder.DateCreated < OlderThanDate Then

            fso.DeleteFolder subFolder.Path, True

	Else 

	    fso.DeleteFolder subFolder.Path, False    	

    End If

End If   

Next

Open in new window

0
Comment
Question by:jcb431
  • 8
  • 5
14 Comments
 
LVL 18

Expert Comment

by:exx1976
Comment Utility
This should work.  I'd recommend testing it first though.


HTH,
exx
OlderThanDate = DateAdd("d", -30, Date) 

Set fso = CreateObject("Scripting.FileSystemObject")

deleteFolders "D:\archive\", True



Function deleteFolders(path, parent)

	Set folder = fso.GetFolder(path)

	Set folderCollection = folder.SubFolders

	For Each subFolder In folderCollection

	    If subFolder.Name <> "Log" Then

	    	deleteFolders subfolder.path, False

	    	For Each file In subfolder.files

	    		If file.datecreated < olderthandate Then fso.DeleteFile file.path

	    	Next

	    	If subFolder.DateCreated < OlderThanDate and not parent Then fso.DeleteFolder subFolder.Path, True

	    End If

	Next

End Function

Open in new window

0
 

Author Comment

by:jcb431
Comment Utility
Resulted in the following runtime error:

Line: 15
Char:7
Error: Object required: 'subFolder'
0
 
LVL 18

Expert Comment

by:exx1976
Comment Utility
I don't know what you did, but line 15 of the code I posted is  "End If"...  ??
0
 

Author Comment

by:jcb431
Comment Utility
I had inserted an additional empty line. I've since removed it. The script now matches the posted one line for line. The same error is now referencing line 14.
0
 

Author Comment

by:jcb431
Comment Utility
Resulted in the following runtime error:

Line: 14
Char:7
Error: Object required: 'subFolder'
0
 
LVL 18

Expert Comment

by:exx1976
Comment Utility
Ahhh..  I see what's going on.  My apologies, I sort of wrote that in a hurry.  I'll have a new one up for you in a few minutes.


-exx
0
 
LVL 18

Accepted Solution

by:
exx1976 earned 250 total points
Comment Utility
Try this one.  Also, it doesn't look at the age of the files/folders.  I think I mis-read your original question.  You want this to happen every 30 days, and to remove everything but the root and the logs, right?  The first one was looking at everything checking to see if it was 30 days old.  This one ignores file/folder age, and just deletes.  Schedule it to run every 30 days.


HTH,
exx
Set fso = CreateObject("Scripting.FileSystemObject")

deleteFolders "D:\archive\", True



Function deleteFolders(path, parent)

	Set folder = fso.GetFolder(path)

	If folder.Name <> "Log" Then

		For Each file In folder.Files

			fso.DeleteFile file.path

		Next

	End If

	For Each subFolder In folder.subfolders

	    If subFolder.Name <> "Log" Then

	    	deleteFolders subfolder.path, False

	    	If Not parent Then fso.DeleteFolder subFolder.Path, True

	    End If

	Next

End Function

Open in new window

0
Enabling OSINT in Activity Based Intelligence

Activity based intelligence (ABI) requires access to all available sources of data. Recorded Future allows analysts to observe structured data on the open, deep, and dark web.

 

Author Comment

by:jcb431
Comment Utility
New WSH error:

Line: 14
Char: 26
Error: Invalid procedure call or argument
Code: 800A0005
Source: Microsoft VBscript runtime error

*** I need to clarify somethings.  The Root folder contains a Log folder and a number of User folders. Each /User should be deleted 30 days from the date when they were first moved into Root. The script would run nightly and check the age of each /User folder. Only the /Users that have existed in Root for 30 days, would be deleted.  So it really is a matter of age, not interval. Take a look at the following:

/Root - - -
              - - - /Log
              - - - /User1
                               - - - /User1/SubDirectory#1
                               - - - /User1/SubDirectory#2
             - - - /User2
                               - -  - /User2/SubDirectory#1
                                - - - /User2/SubDirectory#2

In this case, the only folders whose age we are conerned about are /Users1 and /Users2. When those 2 specific directories reach 30 days old, they and all of their sub directories and files should be deleted. If /Users2 reaches 30 days old before /Users1, then this is what the directory structure should look like after the script executes:

/Root - - -
              - - - /Log
              - - - /User1
                               - - - /User1/SubDirectory#1
                               - - - /User1/SubDirectory#2
0
 
LVL 142

Assisted Solution

by:Guy Hengel [angelIII / a3]
Guy Hengel [angelIII / a3] earned 250 total points
Comment Utility
let's see:
OlderThanDate = DateAdd("d", -30, Date) 

Set fso = CreateObject("Scripting.FileSystemObject")

deleteFolders "D:\archive\", True



Function deleteFolders(path, parent)

        Set folder = fso.GetFolder(path)

        Set folderCollection = folder.SubFolders

        For Each subFolder In folderCollection

            If subFolder.Name <> "Log" Then

               deleteFolders subFolder.path, False

               If subFolder.DateCreated < OlderThanDate and not parent Then  

                  For Each file In subfolder.files

                     If file.datecreated < olderthandate Then 

                       file.delete

                     end if

                  Next

                  subFolder.delete

               end if

            End If

        Next

End Function

Open in new window

0
 

Author Comment

by:jcb431
Comment Utility
Invalid procedure call or argument on line 17, character 19.  
0
 

Author Comment

by:jcb431
Comment Utility
anyone?
0
 
LVL 18

Expert Comment

by:exx1976
Comment Utility
Sorry I've been MIA..   Code: 800A0005 is "Access Denied".  Check the file permissions of the directories you are trying to delete and make sure the user you're running the code as has the proper access to all of them.


-exx
0
 

Author Comment

by:jcb431
Comment Utility
Thanks for the reply. I'll give it a shot and reply soon.
0
 

Author Comment

by:jcb431
Comment Utility
Still unresolved. There are workarounds. I appreciate both of your efforts. Thanks.
0

Featured Post

How to run any project with ease

Manage projects of all sizes how you want. Great for personal to-do lists, project milestones, team priorities and launch plans.
- Combine task lists, docs, spreadsheets, and chat in one
- View and edit from mobile/offline
- Cut down on emails

Join & Write a Comment

I met Paul Devereux (@pdevereux) today when I responded to his tweet asking “Anybody know how to automate adding files from disk to a folder in #outlook  ?”.  I replied back and told Paul that using automation, in this case scripting, to add files t…
Over the years I have built up my own little library of code snippets that I refer to when programming or writing a script.  Many of these have come from the web or adaptations from snippets I find on the Web.  Periodically I add to them when I come…
In this seventh video of the Xpdf series, we discuss and demonstrate the PDFfonts utility, which lists all the fonts used in a PDF file. It does this via a command line interface, making it suitable for use in programs, scripts, batch files — any pl…
When you create an app prototype with Adobe XD, you can insert system screens -- sharing or Control Center, for example -- with just a few clicks. This video shows you how. You can take the full course on Experts Exchange at http://bit.ly/XDcourse.

771 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

11 Experts available now in Live!

Get 1:1 Help Now