VBScript 以获取超过 N GB 的目录大小,然后删除最旧的'Folder'以恢复空间



我对蝙蝠脚本很陌生,希望能够执行以下操作:

我有一个主要的"备份"文件夹,该文件夹又包含用于单个每日备份的唯一文件夹(即命名为"备份(日期/时间"(。 在这些单独的每日备份文件夹中,它们包含文件和文件夹。

因此,我希望能够检查主"备份"文件夹,如果大小大于50GB,则删除最旧的文件夹和其中包含的任何内容。

我在论坛中遇到了下面的脚本,它完成了我正在寻找的功能,但在文件而不是文件夹上。 由于我的脚本基本水平,我不确定适应它与文件夹一起工作或是否已经有其他可用的东西会有多简单。

非常感谢

Set fso = CreateObject("Scripting.FileSystemObject")
Set F = fso.GetFolder("C:UsersUserDesktopNew FolderStoriesTest")
If F.size > 2^30*2 Then
'Comments on a stupid editor that can't handle tabs
'Creating an in memory disconnected recordset to sort files by date
Set rs = CreateObject("ADODB.Recordset")
With rs
.Fields.Append "Date", 7 
.Fields.Append "Txt", 201, 5000 
.Open
For Each Thing in f.files
.AddNew
.Fields("Date").value = thing.datelastmodified
.Fields("Txt").value = thing.path
.UpDate
Next
.Sort = "Date Desc"
Do While not .EOF
fso.deletefile  .Fields("Txt").Value
If f.size < 2^30*2 then Exit Do
.MoveNext
Loop
End With
End If

下面是执行您正在寻找的操作的代码:

Dim objFSO
PurgeBackups "C:Temp"
Sub PurgeBackups(p_sRootFolder)
Dim objRootFolder
Dim objOldestFolder
Dim fOldestInitialized
Dim objFolder
Dim lngFolderSize
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objRootFolder = objFSO.GetFolder(p_sRootFolder)
fOldestInitialized = False
For Each objFolder In objRootFolder.SubFolders
lngFolderSize = GetFolderSize(objFolder)
If lngFolderSize > 50000000000# Then
' Decide if you want to delete this Folder or not
If Not fOldestInitialized Then
Set objOldestFolder = objFolder
fOldestInitialized = True
End If
' Compare date
If objFolder.DateCreated < objOldestFolder.DateCreated Then
Set objOldestFolder = objFolder
End If
End If
Next
If fOldestInitialized Then
' Delete oldest folder
objOldestFolder.Delete
End If
End Sub    
Function GetFolderSize(p_objFolder)
Dim objFile
Dim objFolder
Dim lngFolderSize
lngFolderSize = 0
For Each objFile In p_objFolder.Files
lngFolderSize = lngFolderSize + objFile.Size
Next
For Each objFolder In p_objFolder.SubFolders
lngFolderSize = lngFolderSize + GetFolderSize(objFolder)
Next
GetFolderSize = lngFolderSize
End Function

请在下面找到我的尝试,该尝试基于现有脚本并进行了修改以适应,并增加了一些额外的慌乱......如能发表评论,我将不胜感激。

strOldestFolder = ""
dtmOldestDate = Now
Set oShell = CreateObject("WScript.Shell")
strHomeFolder = oShell.ExpandEnvironmentStrings("%USERPROFILE%HDBackups")
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(strHomeFolder)
intFolderSize = Int((objFolder.Size / 1024) / 1024)
If intFolderSize >= 50 Then ' change as appropriate, value in MBytes
Set objSubFolders = objFolder.SubFolders
For Each objFolder in objSubFolders
strFolder = objFolder.Path
dtmFolderDate = objFolder.DateCreated
If dtmFolderDate < dtmOldestDate Then
dtmOldestDate = dtmFolderDate
strOldestFolder = strFolder
End If
Next
objFSO.DeleteFolder(strOldestFolder)
End If

我不完全满意的一个方面是前六行中"str"和"Set"的外观和整洁度,我想将它们组合在一起,即所有 Set 组合在一起。 但到目前为止,无法在不失败的情况下做到这一点。

注意:根据原始描述使用了50MB而不是50GB,使测试更容易一些。

相关内容

最新更新