Tek-Tips is the largest IT community on the Internet today!

Members share and learn making Tek-Tips Forums the best source of peer-reviewed technical information on the Internet!

  • Congratulations bkrike on being selected by the Tek-Tips community for having the most helpful posts in the forums last week. Way to Go!

Need help with For Each Statement 1

Status
Not open for further replies.

acewilli

IS-IT--Management
Apr 11, 2003
98
US
Hello! This script runs through and deletes files based on older than a certain date. It is on a backup server where files get deleted after 15 days (based on last modified date). I also restore files sometimes that are needed for 7 days and then need to be deleted (based on last accessed date). The script is self explanatory even without comments. I need to be able to replace my For Each statement with something that will work like it would if the dtexcept was an array. I sure hope this makes sense. Thanks in advance for your help.

dteCheck = Dateadd("d",-15,Date)
dtexcept = DateAdd("d",-7,Date)

Set objFileSys=CreateObject("scripting.filesystemobject")

set objFolder = objfilesys.GetFolder ("C:\Archive\blogger")
doFolder objFolder
set objFolder = objfilesys.GetFolder ("C:\Archive\elogger")
doFolder objFolder
set objFolder = objfilesys.GetFolder ("C:\Archive\llogger")
doFolder objFolder
Set objFolder = objfilesys.GetFolder ("C:\Archive\plogger")
doFolder objFolder
set objFolder = objfilesys.GetFolder ("C:\Archive\rlogger")
doFolder objFolder
set objFolder = objfilesys.GetFolder ("C:\Archive\mlogger")
doFolder objFolder
set objFolder = objfilesys.GetFolder ("C:\Archive\slogger")
doFolder objFolder
set objFolder = objfilesys.GetFolder ("C:\Archive\wlogger")
doFolder objFolder

Sub doFolder(myFolder)
set objFiles = myFolder.files
for each objfile in objFiles
If objfile.datelastmodified < dtecheck Then
booDel = True
For Each dtex In dtexcept
If datevalue(objfile.datelastaccessed) >= datevalue(dtex) Then
booDel = False: Exit For
End If
Next
If booDel Then objfile.Delete
End If
next
set objFolders = myFolder.subfolders
for each objFolder2 in objfolders
doFolder objfolder2
next
end Sub
 
If I understand, then you just need to be able to create an array that contains all the dates for the last 7 days. If this is the case, this code should point you in the right direction:

Code:
arrExceptions = Array()

dteExcept = DateAdd("d", -7, Now())
Do While dteExcept <= Now()
	dteExcept = DateAdd("d", 1, dteExcept)
	ReDim Preserve arrExceptions(uBound(arrExceptions) +1)
	arrExceptions(uBound(arrExceptions)) = dteExcept
Loop

For Each dteDate In arrExceptions
	WScript.Echo dteDate
Next

[red]"... isn't sanity really just a one trick pony anyway?! I mean, all you get is one trick, rational thinking, but when you are good and crazy, oooh, oooh, oooh, the sky is the limit!" - The Tick[/red]
 
prehaps this might neaten it up?

set objFolder = objfilesys.GetFolder ("C:\Archive")
For Each aFolder In objFolder.SubFolders
If Right(LCase(aFolder.Name), Len("logger")) = "logger" Then
doFolder aFolder
End If
Next

Sub doFolder(myFolder)
set objFiles = myFolder.files
for each objfile in objFiles
If objfile.datelastmodified < dtecheck Then
booDel = True
For Each dtex In dtexcept
If datevalue(objfile.datelastaccessed) >= datevalue(dtex) Then
booDel = False: Exit For
End If
Next
If booDel Then objfile.Delete
End If
next
set objFolders = myFolder.subfolders
for each objFolder2 in objfolders
doFolder objfolder2
next
end Sub
 
TomThumbKP, where do I add this code? I also need to do the datelastmodified against the dtecheck too. So, I pretty much need to do the code that you gave me and then leave that alone and do the other code to delete anything older than 2 weeks. I hope that makes sense. Below is the breakdown of what needs to happen.

Check each file in all of these paths
Set to delete all files with datelastmodified older than 2 weeks except the files that have the datelastaccessed set equal dteExcept. Do all subfolders also.

I appreciate your help and thanks in advance.

Thank you,

Ace
 
How about this?

dteCheck = Dateadd("d",-15,date)
arrExceptions = Array()
dteExcept = DateAdd("d", -7, Now())

set objFileSys=createobject("scripting.filesystemobject")
set objFolder = objfilesys.GetFolder ("G:\Archive\blogger")
doFolder objFolder
set objFolder = objfilesys.GetFolder ("G:\Archive\elogger")
doFolder objFolder
set objFolder = objfilesys.GetFolder ("G:\Archive\llogger")
doFolder objFolder
set objFolder = objfilesys.GetFolder ("G:\Archive\plogger")
doFolder objFolder
set objFolder = objfilesys.GetFolder ("G:\Archive\rlogger")
doFolder objFolder
set objFolder = objfilesys.GetFolder ("G:\Archive\mlogger")
doFolder objFolder
set objFolder = objfilesys.GetFolder ("G:\Archive\slogger")
doFolder objFolder
set objFolder = objfilesys.GetFolder ("G:\Archive\wlogger")
doFolder objFolder

sub doFolder(myFolder)
set objFiles = myFolder.files

For Each objfile in objFiles

Do While dteExcept <= Now()
dteExcept = DateAdd("d", 1, dteExcept)
ReDim Preserve arrExceptions(uBound(arrExceptions) +1)
arrExceptions(uBound(arrExceptions)) = dteExcept
Loop

If objfile.datelastmodified < dtecheck Then
booDel = True
For Each dteDate In arrExceptions
booDel = False: Exit For
Next
If booDel Then objfile.Delete
End If
next
set objFolders = myFolder.subfolders
for each objFolder2 in objfolders
doFolder objfolder2
next
end Sub
 
Okay.....this one seems to be working. Tell me if you see any problems with it. Thanks!

dteCheck = Dateadd("d",-15,date)
arrExceptions = Array()
dteExcept = DateAdd("d",-7,date)

set objFileSys=createobject("scripting.filesystemobject")
set objFolder = objfilesys.GetFolder ("C:\Archive\blogger")
doFolder objFolder
set objFolder = objfilesys.GetFolder ("C:\Archive\elogger")
doFolder objFolder
set objFolder = objfilesys.GetFolder ("C:\Archive\llogger")
doFolder objFolder
set objFolder = objfilesys.GetFolder ("C:\Archive\plogger")
doFolder objFolder
set objFolder = objfilesys.GetFolder ("C:\Archive\rlogger")
doFolder objFolder
set objFolder = objfilesys.GetFolder ("C:\Archive\mlogger")
doFolder objFolder
set objFolder = objfilesys.GetFolder ("C:\Archive\slogger")
doFolder objFolder
set objFolder = objfilesys.GetFolder ("C:\Archive\wlogger")
doFolder objFolder

sub doFolder(myFolder)
set objFiles = myFolder.files

For Each objfile in objFiles

Do While dteExcept <= Now()
dteExcept = DateAdd("d", 1, dteExcept)
ReDim Preserve arrExceptions(uBound(arrExceptions) +1)
arrExceptions(uBound(arrExceptions)) = dteExcept
Loop

If objfile.datelastmodified < dtecheck Then
booDel = True
For Each dteDate In arrExceptions
If DateValue(objfile.datelastaccessed) = DateValue(dteDate) Then
booDel = False: Exit For
End If
Next
If booDel Then objfile.Delete
End If
next
set objFolders = myFolder.subfolders
for each objFolder2 in objfolders
doFolder objfolder2
next
end Sub
 
Why not building the arrExceptions array only once ?

Hope This Helps, PH.
Want to get great answers to your Tek-Tips questions? Have a look at FAQ219-2884 or FAQ181-2886
 
why not have the arrExceptions as a dictionary object then you can do an indexed search of it which will be quiker than looping through the arExceptions all the time?
 
Great suggestions! I will do exactly that. I also figured out that I need to check the date on the parent folder of the file. Well....actually it is something like this.

G:\xlogger\050155.055\xlogger\0010\filename.txt

I am going to change the script to check the modified date on the 0010 folder because the modified date changes each time a file is restored from backup.

I'll post once I'm done. Thanks for your help!

Ace
 
Okay....now I'm drawing a blank on how to check for the date on the 0010 folder as in my last post. These folders are 0001 thru 0095. Below is the script that I have right now. I appreciate any help.

'-----------------------------------------

dteCheck = Dateadd("d",-15,date)
arrExceptions = Array()
dteExcept = DateAdd("d",-7,date)

set objFileSys=createobject("scripting.filesystemobject")
set objFolder = objfilesys.GetFolder ("C:\Archive\blogger")
doFolder objFolder
set objFolder = objfilesys.GetFolder ("C:\Archive\elogger")
doFolder objFolder
set objFolder = objfilesys.GetFolder ("C:\Archive\llogger")
doFolder objFolder
set objFolder = objfilesys.GetFolder ("C:\Archive\plogger")
doFolder objFolder
set objFolder = objfilesys.GetFolder ("C:\Archive\rlogger")
doFolder objFolder
set objFolder = objfilesys.GetFolder ("C:\Archive\mlogger")
doFolder objFolder
set objFolder = objfilesys.GetFolder ("C:\Archive\slogger")
doFolder objFolder
set objFolder = objfilesys.GetFolder ("C:\Archive\wlogger")
doFolder objFolder

sub doFolder(myFolder)
set objFiles = myFolder.files

For Each objfile in objFiles

Do While dteExcept <= Now()
dteExcept = DateAdd("d", 1, dteExcept)
ReDim Preserve arrExceptions(uBound(arrExceptions) +1)
arrExceptions(uBound(arrExceptions)) = dteExcept
Loop

If objfile.datelastmodified < dtecheck Then
booDel = True
For Each dteDate In arrExceptions
If DateValue(objfile.datelastaccessed) = DateValue(dteDate) Then
booDel = False: Exit For
End If
Next
If booDel Then objfile.Delete
End If
next
set objFolders = myFolder.subfolders
for each objFolder2 in objfolders
doFolder objfolder2
next
end Sub
'-------------------------------------------------

Thank you,

Ace
 
Okay....here is what I have. Please tell me if you see a problem with this script. Any expert opinion is appreciated very much. Thanks in advance!

'---------------------------------
dteCheck = Dateadd("d",-15,date)
arrExceptions = Array()
dteExcept = DateAdd("d",-7,date)

set objFileSys=createobject("scripting.filesystemobject")
set objFolder = objfilesys.GetFolder ("C:\Archive\blogger")
doFolder objFolder
set objFolder = objfilesys.GetFolder ("C:\Archive\elogger")
doFolder objFolder
set objFolder = objfilesys.GetFolder ("C:\Archive\llogger")
doFolder objFolder
set objFolder = objfilesys.GetFolder ("C:\Archive\plogger")
doFolder objFolder
set objFolder = objfilesys.GetFolder ("C:\Archive\rlogger")
doFolder objFolder
set objFolder = objfilesys.GetFolder ("C:\Archive\mlogger")
doFolder objFolder
set objFolder = objfilesys.GetFolder ("C:\Archive\slogger")
doFolder objFolder
set objFolder = objfilesys.GetFolder ("C:\Archive\wlogger")
doFolder objFolder

sub doFolder(myFolder)
set objFiles = myFolder.files

For Each aFolder In objFolder.SubFolders

If Left(LCase(aFolder.Name), Len("00")) = "00" Then

For Each objfile in objFiles

Do While dteExcept <= Now()
dteExcept = DateAdd("d", 1, dteExcept)
ReDim Preserve arrExceptions(uBound(arrExceptions) +1)
arrExceptions(uBound(arrExceptions)) = dteExcept
Loop

If datevalue(objfile.datelastmodified) < datevalue(dtecheck) Then
booDel = True
WScript.Echo afolder & " " & objfile.name
For Each dteDate In arrExceptions
If DateValue(afolder.datelastmodified) = DateValue(dteDate) Then
If DateValue(objfile.datelastaccessed) = DateValue(dteDate) Then
booDel = False: Exit For
End If
End If
Next
If booDel Then objfile.Delete
End If
Next
End If
Next

set objFolders = myFolder.subfolders
for each objFolder2 in objfolders
doFolder objfolder2
next
end Sub

'---------------------------------

Thank you,

Ace
 
Status
Not open for further replies.

Part and Inventory Search

Sponsor

Back
Top