【问题标题】:Delete Files After Filename - vbscript删除文件名后的文件 - vbscript
【发布时间】:2014-10-14 13:34:08
【问题描述】:

基本上我正在尝试编写一个脚本来删除某个文件名之后的文件,所以基于下面的文件列表

FILE_000001_FULL.ZIP
FILE_000002_FULL.ZIP
FILE_000003_FULL.ZIP
FILE_000004_FULL.ZIP
FILE_000005_FULL.ZIP
FILE_000006_DELTA.ZIP
FILE_000007_DELTA.ZIP
FILE_000008_FULL.ZIP

FILE_000005_FULL.ZIP 之前的所有内容都将被删除。这些文件是使用工具创建的,并将按文件名排序,因此最高的数字在前。基本上需要保存 2 个最新的 FULL 文件和它们之间的 DELTA(如果有的话)。我希望这是有道理的。

到目前为止,这就是我所拥有的,但只是不断循环,而不仅仅是找到 2 个最新的完整内容。

Dim fso, folder, files, ToDel, sfolder
Set fso = CreateObject("Scripting.FileSystemObject")
sFolder = ("C:\MDS")
Set ToDel = fso.CreateTextFile ("C:\MDS\FileList.txt", True)
Set folder = fso.GetFolder(sFolder)
set files = folder.files


For each folderIDX In files
    ToDel.WriteLine(folderidx.Name)
Next

ToDel.close


Dim arrFileLines()
i = 0
Set ObjFile = FSO.OpenTextFile("C:\MDS\FileList.txt", 1)
Do Until objFile.AtEndOfStream
    Redim Preserve arrFileLines(i)
    arrFileLines(i) = objFile.ReadLine
    i = i + 1
Loop

ObjFile.Close
s = 0

Do While s < 2
For l = Ubound(arrFileLines) to LBound(arrFileLines) Step -1
    For Each strLine in arrFileLines
        IF InStr(strLine, "FULL") <> 0 Then
        wscript.echo "Found Full!!!!"
        wscript.echo strLine, s
        s = S + 1
        End If

Next
Next
LooP

我的想法是从文本文件中删除行,然后使用此文本文件从目录中删除文件。

希望一切都说得通,有人可以提出一些建议!

【问题讨论】:

    标签: vbscript


    【解决方案1】:

    您应该能够通过文件夹进行两次迭代来执行此操作,而无需/使用文本文件。在第一次通过时,记录分配给最近两个 FULL 的数字。然后,在第二遍中,删除小于第二高 FULL 的所有文件。

    它的外观如下:

    ' First pass: Find the two latest FULLs...
    For Each File In FSO.GetFolder("c:\mds").Files
    
        ' Is this a FULL?
        If Right(File.Name, 8) = "FULL.ZIP" Then
    
            ' Get the numeric value from the file name (6 digits starting as pos 6)...
            intNum = CLng(Mid(File.Name, 6, 6))
    
            ' Maintain the two latest FULLs...
            If intNum > intMax1 Then
                intMax2 = intMax1
                intMax1 = intNum
            ElseIf intNum > intMax2 Then
                intMax2 = intNum
            End If
    
        End If
    
    Next
    
    ' Second pass: Delete anything prior to the second-latest FULL...
    For Each File In FSO.GetFolder("c:\mds").Files
    
        intNum = CLng(Mid(File.Name, 6, 6))
        If intNum < intMax2 Then File.Delete
    
    Next
    

    【讨论】:

    • 看起来不错,但似乎在第 28 行字符 5 的 intNum = CLng(Mid(File.Name, 6, 6)) 的第二个命令上出错。错误是类型不匹配:Clng。
    • 为了简单起见,我在这里没有做任何错误检查。您的文件夹中可能有一个文件的名称与其他文件不同,因此其文件名中没有字符 6 到 11 的数值。确保根据您的规范 (FILE_######_FULL/DELTA.ZIP) 命名所有文件并添加一些错误检查。例如,测试它是否以“FILE_”开头并以“.ZIP”结尾。将字符 6-11 提取为字符串并使用 IsNumeric() 测试该字符串,然后再使用 CLng() 转换为数字。如果您需要任何帮助,请告诉我。
    • 似乎脚本没有运行,在初始 intNum 命令之后放置 wscript.echo intNum 命令,脚本运行但没有输出任何内容?是否需要声明更多变量? Set fso = CreateObject("Scripting.FileSystemObject") Dim intNum, intMax2, intMax1
    • 您是否声明了On Error Resume Next?如果你这样做了,禁用它,它会告诉你是否没有声明任何变量(假设你也声明了Option Explicit)。
    • 邦德,很抱歉一直问,但试图让我明白这一点。该脚本通读文件,但 IF 语句似乎没有执行。尝试在每个点放置 wscript.echo 命令,但它没有放置任何输出。甚至将 Right(File.Name, 8) 更改为 Right(Lcase(File.name), 8) 因为读取这可能会导致问题。有什么想法吗?
    最近更新 更多