VBScript保留最后14个文件,删除14天以前的任何文件

时间:2014-07-24 14:11:56

标签: vbscript

我有一个VB脚本文件,通过特定的directopry路径中的许多文件和文件夹,并删除30天以前的任何文件

但是我想添加一个例外,以保留最后14个文件,所以如果我昨天没有任何新文件,那么今天它将删除14天之前的文件,我将留下13个文件 我想保留最后14个文件,无论它的年龄,但如果有超过14个文件,那么删除最旧的

任何人都可以帮助我在我的脚本中添加它,以及如何?这是我正在使用的脚本

On Error Resume Next

Set oFileSys = WScript.CreateObject("Scripting.FileSystemObject")
sRoot = "C:\Program Files (x86)\Syslogd\Logs"           'Path root to look for files
today = Date
nMaxFileAge = 14                    'Files older than this (in days) will be deleted

DeleteFiles(sRoot)

Function DeleteFiles(ByVal sFolder)

Set oFolder = oFileSys.GetFolder(sFolder)
Set aFiles = oFolder.Files
Set aSubFolders = oFolder.SubFolders

For Each file in aFiles
    dFileCreated = FormatDateTime(file.DateCreated, "2")
    If DateDiff("d", dFileCreated, today) > nMaxFileAge Then
        file.Delete(True)
    End If
Next

For Each folder in aSubFolders
    DeleteFiles(folder.Path)
Next

End Function

1 个答案:

答案 0 :(得分:0)

我认为你可以通过几种方式做到这一点。一种方法是使用DIR命令对文件进行排序,然后您可以迭代该列表并删除从第15位开始的列表。例如,此命令将仅返回文件名,按日期降序排序:

dir /o-d /a-d /b

您可以使用Shell.RunShell.Exec来捕获其输出。 "问题"使用Shell.Run是您需要将输出发送到文件,然后打开文件并阅读它。没什么大不了但需要文件I / O.如果使用Shell.Exec,则可以直接捕获标准输出,但只要运行DIR命令,就必须处理命令提示符窗口闪烁。

如果您对其中任何一个"问题"都很好,那么该方法应该可以正常工作。

但你可以使用FileSystemObject完成所有事情。关键是只获取第14个最新文件的日期。这是你怎么做到的。

' Only run if we actually have more than 14 files...
If oFolder.Files.Count > 14 Then

    ' Create an array to the hold the dates of each file in this folder...
    ReDim a(oFolder.Files.Count - 1)

    ' Store the dates...
    i = 0
    For Each oFile In oFolder.Files
        a(i) = oFile.DateLastModified    ' Or use DateCreated, if you wish
        i = i + 1
    Next

    ' Sort the array...
    Sort a

    ' Get the 14th most-recent date...
    dtmCutOff = a(13)

    ' Iterate the files once more and delete any files older than our cut-off...
    For Each oFile In oFolder.Files
        If oFile.DateLastModified < dtmCutOff Then oFile.Delete
    Next

End If

' Simple bubble sort...
Sub Sort(a)
    For i = UBound(a) - 1 To 0 Step -1
        For j = 0 To i
            If a(j) > a(j + 1) Then
                temp = a(j + 1)
                a(j + 1) = a(j)
                a(j) = temp
            End If
        Next
    Next
End Sub

我认为你唯一的问题是,如果完全相同的日期和时间的两个文件占据第14个位置。使用此方法,脚本将保留两者,并且您最终会得到15个文件(或更多,如果有更多匹配项)。但无论您使用何种方法,这都会成为一个问题。如果您最近的20个文件具有相同的日期和时间,那么您如何从这20个文件中选择14来保留? =)