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

VBScript保留最后14个文件,删除任何超过14天的文件,vbscript,Vbscript,我有一个VB脚本文件,它在一个特定的directopry路径中遍历许多文件和文件夹,并删除任何超过30天的文件 但是我想添加一个例外,保留最后14个文件,所以假设我昨天没有任何新文件,那么今天它将删除14天以前的文件,剩下13个文件 我想保留最后14个文件,不管它的年龄,但如果有超过14个文件,那么删除最旧的 谁能帮我把它添加到脚本的什么地方,以及如何添加?这是我使用的脚本 On Error Resume Next Set oFileSys = WScript.CreateObject("Sc

我有一个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

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

dir /o-d /a-d /b
您可以使用
Shell.run
Shell.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个文件时才运行。。。
如果oFolder.Files.Count>14,则
'创建一个数组以保存此文件夹中每个文件的日期。。。
重拨a(oFolder.Files.Count-1)
'存储日期。。。
i=0
对于oFolder.Files中的每个文件
a(i)=oFile.DateLastModified”或使用DATECUREATED,如果您愿意的话
i=i+1
下一个
'对数组进行排序。。。
排序a
'获取最近的第14次约会。。。
dtmCutOff=a(13)
'再次迭代文件并删除任何比截止日期早的文件。。。
对于oFolder.Files中的每个文件
如果oFile.DateLastModifieda(j+1),那么
温度=a(j+1)
a(j+1)=a(j)
a(j)=温度
如果结束
下一个
下一个
端接头

我想你唯一的问题是,如果两个文件的日期和时间完全相同,占据第14位。使用此方法,脚本将同时保留这两个文件,最终将得到15个文件(如果有更多匹配项,则会有更多文件)。但不管你用什么方法,这都是个问题。如果您最近的20个文件具有相同的日期和时间,您如何从这20个文件中选择14个保存?=)

你是说你想在每个文件夹中保留14个最新的文件吗?我很困惑,因为你一直在交换14个文件和14天的条款。正确,我想保留每个文件夹中最近的14个文件。我可以将你发送的代码添加到我的第一个脚本中吗?如果是,在哪个位置?是的。它将直接进入您的
DeleteFiles
函数。然后只需将递归的部分添加到每个子文件夹中。我应该将代码粘贴到哪一行?就在“Function DeleteFiles(ByVal sFolder)”一行之后?如果您摆脱for循环(
,用于文件中的每个文件
),并使用上面的代码,它应该可以工作。