我有一个脚本应该遍历一组目录并删除任何超过给定天数的文件。然后,如果目录为空,则应将其删除。有数十万个子目录,每个子目录包含1-3个子目录,每个子目录包含0-N个文件。
文件删除工作正常,但有两个问题:
(1)没有目录被删除
(2)由于某种原因,该脚本会跳过大量目录(例如:“E:\ data”包含900,000个以数字命名的目录,其数字从700开始,一直到1000000.每个目录都包含几个目录。脚本将处理目录300000到1000000并跳过编号小于300000的脚本。)
好像它可能正在跳过空目录,但我不知道为什么,而且我不知道它为什么不删除空目录。
以下是代码:
Dim strDir, strDays
Dim objFolder, objSubFolder, objFile, objOtherFolder
Set objFSO = CreateObject("Scripting.FileSystemObject")
strDir = "E:\Data"
strDays = 90
Set objFolder = objFSO.getFolder(strDir)
Call CleanupFiles(strDir, strDays)
WScript.Echo "DONE!"
Sub CleanupFiles(inDirectory, inOlderThanDays)
WScript.Echo "DOING: " & inDirectory & vbCr
Set objFolder = objFSO.getFolder(inDirectory)
For Each objFile In objFolder.files
If dateDiff("d",objFile.dateLastModified,Now) > inOlderThanDays Then
wscript.echo "DEL " & objFile.name & " " & objFile.dateLastModified & vbCr
objFile.Delete
End If
Next
If objFSO.FileExists(inDirectory & "\thumbs.db") Then
objFSO.DeleteFile(inDirectory & "\thumbs.db")
If Err Then
WScript.Echo "Error deleting:" & inDirectory & "\thumbs.db" & " - " & Err.Description
Err.Clear
End If
End If
For Each objSubFolder In objFolder.SubFolders
Call CleanupFiles(objSubFolder.Path, inOlderThanDays)
Next
For Each objSubFolder In objFolder.SubFolders
If objSubFolder.Files.Count = 0 And objSubFolder.SubFolders.Count = 0 Then
wscript.echo "DEL DIRECTORY!! " & ObjSubFolder.Path & vbCr
ObjSubFolder.Delete
End If
Next
End Sub
答案 0 :(得分:0)
FSO对象应该在子例程的范围内声明。如上所述,递归早期结束,因为objFSO,objFolder和objSubfolder被覆盖,因此无法完成for / each循环。
通过在子程序中声明(DIM)变量来解决这个问题。