VBScript 获取目录大小,如果超过 N GB,则删除最旧的 'Folder' 以恢复 space

VBScript to get directory size if over N GB then delete oldest 'Folder' to recover space

我是 bat 脚本的新手,希望能够执行以下操作:

我有一个主 'backups' 文件夹,该文件夹又包含单独的日常备份文件夹(即命名为 'backup (date/time')。在这些单独的每日备份文件夹中,它们包含文件和文件夹。

因此,我希望能够检查主 'backups' 文件夹,如果大小大于 50GB,那么最旧的文件夹和其中包含的任何内容都会被删除。

我在 中看到了下面的脚本,它可以满足我的要求,但针对的是文件而不是文件夹。由于我的基本脚本水平,我不确定如果它与文件夹一起使用或者是否有其他可用的东西,那么适应它会有多简单。

非常感谢

Set fso = CreateObject("Scripting.FileSystemObject")
Set F = fso.GetFolder("C:\Users\User\Desktop\New Folder\Stories\Test")

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

请在下方找到我的尝试,该尝试基于现有的 script 并经过修改以适应,并增加了一些额外的混乱。 . .我将不胜感激。

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' 的外观和整洁度,我想将它们组合在一起,即所有的集合在一起。但是到目前为止,如果没有脚本失败,就无法这样做。

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