Vbscript 将文件夹文件名与数组进行比较

Vbscript 将文件夹文件名与数组进行比较,vbscript,Vbscript,这是我的第一篇文章,我是脚本编写的新手。我决定在这里注册并寻求帮助,因为我在寻找答案时经常使用这个网站 我试图编写一个vbscript,将给定文件夹中的所有文件名与包含该文件夹“已批准”文件名的数组进行比较。如果文件夹中的文件名与数组中的任何名称都不匹配,则应删除文件夹中的文件。我的脚本看起来比较不错,但是当它发现一个不匹配的文件时,它似乎想删除它检查的最后一个文件名,而不是不匹配的文件名。这是我所拥有的。非常感谢您的意见。多谢各位 共有12个“可接受”的文件名。4个文件名,每个文件名有3个不同

这是我的第一篇文章,我是脚本编写的新手。我决定在这里注册并寻求帮助,因为我在寻找答案时经常使用这个网站

我试图编写一个vbscript,将给定文件夹中的所有文件名与包含该文件夹“已批准”文件名的数组进行比较。如果文件夹中的文件名与数组中的任何名称都不匹配,则应删除文件夹中的文件。我的脚本看起来比较不错,但是当它发现一个不匹配的文件时,它似乎想删除它检查的最后一个文件名,而不是不匹配的文件名。这是我所拥有的。非常感谢您的意见。多谢各位

共有12个“可接受”的文件名。4个文件名,每个文件名有3个不同的扩展名


    DIM objFSO, objUser, userName, strFolder, objFolder, objFiles, sigTxt1, sigTxt2, sigTxt3, 
    sigCust, sigExt1, sigExt2, sigExt3

    SET objFSO = CreateObject("Scripting.FileSystemObject")
    SET objUser = CreateObject("WScript.Network")
    userName = objUser.UserName
    strFolder = "C:\Users\" & userName & "\AppData\Roaming\Microsoft\Signatures\"
    SET objFolder = objFSO.GetFolder(strFolder)
    SET objFiles = objFolder.files
    sigTxt1 = "FSignature"
    sigTxt2 = "PSignature"
    sigTxt3 = "PWSignature"
    sigExt1 = ".htm"
    sigExt2 = ".rtf"
    sigExt3 = ".txt"
    sigCust = "CustomSignature"
    DIM SigName
    SigName=Array(sigTxt1 & sigExt1, sigTxt1 & sigExt2,  sigTxt1 & sigExt3, sigTxt2 & sigExt1, sigTxt2 &
    sigExt2, sigTxt2 & sigExt3, sigTxt3 & sigExt1, sigTxt3 & sigExt2, sigTxt3 & sigExt3, 
    sigCust & sigExt1, sigCust & sigExt2, sigCust & sigExt3)

    DIM i, sigFoldFile, sigArrName, sName1, sName2, noMatch
    i = 1
    noMatch = "True"
    DO WHILE i  0 THEN
            noMatch = "True"
            wscript.echo "Match = NO" & vbNewline & sname1 & "  " & sName2 & vbNewline & "noMatch = " & 
    noMatch
        ELSE
            noMatch = "False"
            wscript.echo "Match = YES" & vbNewline & sname1 & " = " & sName2 & vbNewline & "noMatch = " & 
    noMatch
            EXIT FOR
        NEXT
    If noMatch = "True" THEN
        wscript.echo "Deleteing file " & sName2
    '   objFSO.DeleteFile sName2
    END IF
    i = i + 1
    wscript.echo i               'temporary line for checking that value of i
    NEXT
    LOOP
更新
我现在正在工作。谢谢大家。我将发布脚本,以防它能帮助其他人。我意识到我的objFSO.DeleteFile行需要包含strFolder,以便指定完整路径。我还添加了一个文件计数变量,因为“您不应该设置noMatch=”True“对于objFiles中的每个sigFoldFile,紧跟其后?为什么不使用字典而不是数组?”?这样你就可以直接拿到火柴,而不必每次都循环。亲爱的威尔逊,谢谢你的建议。我已经想到了这一点,但我的理性是,我只需要在第一次设置noMatch=True。虽然这似乎很有效,但在考虑了你的建议后,我确实移动了线路,因为这是更好的练习。Pankaj,谢谢你的回复。我以前没用过字典,但我见过人们使用字典的脚本。我将不得不研究学习这项技术。嗯,我的建议不是关于“更好的练习”。我的建议是试图解决你的问题。我猜不是吗?您不应该在objfile中的每个sigFoldFile之后立即设置noMatch=“True”?为什么不使用字典而不是数组?这样你就可以直接拿到火柴,而不必每次都循环。亲爱的威尔逊,谢谢你的建议。我已经想到了这一点,但我的理性是,我只需要在第一次设置noMatch=True。虽然这似乎很有效,但在考虑了你的建议后,我确实移动了线路,因为这是更好的练习。Pankaj,谢谢你的回复。我以前没用过字典,但我见过人们使用字典的脚本。我将不得不研究学习这项技术。嗯,我的建议不是关于“更好的练习”。我的建议是试图解决你的问题。我想没有吧?

    Option Explicit
    DIM objFSO, objUser, userName, strFolder, objFolder, objFiles, sigTxt1, 
    sigTxt2, sigCust, sigExt1, sigExt2, sigExt3
    SET objFSO = CreateObject("Scripting.FileSystemObject")
    SET objUser = CreateObject("WScript.Network")
    userName = objUser.UserName
    strFolder = "C:\Users\" & userName & 
    "\AppData\Roaming\Microsoft\Signatures\"
    SET objFolder = objFSO.GetFolder(strFolder)
    SET objFiles = objFolder.files
    sigTxt1 = "FSignature"
    sigTxt2 = "PSignature"
    sigCust = "CustomSignature"
    sigExt1 = ".htm"
    sigExt2 = ".rtf"
    sigExt3 = ".txt"
    DIM SigName
    SigName=Array(sigTxt1 & sigExt1, sigTxt1 & sigExt2,  sigTxt1 & sigExt3, 
    sigTxt2 & sigExt1, sigTxt2 & sigExt2, sigTxt2 & sigExt3, sigCust & 
    sigExt1, sigCust & sigExt2, sigCust & sigExt3)
    '------------------------------------------LINE 19
    DIM f, i, j, sigFoldFile, sigArrName, sName1, sName2, noMatch
    f = objFolder.Files.count
    i = 1
    j = f + 1
    DO WHILE i < j
    FOR EACH sigFoldFile in objFiles
        noMatch = "True"
        sName2 = sigFoldFile.Name
        FOR EACH sigArrName in SigName
            sName1 = sigArrName
        IF sName2 <> sName1 THEN
            noMatch = "True"
        ELSE
            noMatch = "False"
            EXIT FOR
        END IF
        NEXT
    IF noMatch = "True" THEN
        wscript.echo "Deleteing file " & sName2
        sigFoldFile.Attributes = 0
        objFSO.DeleteFile strFolder & sName2
    END IF
    i = i + 1
    NEXT
    LOOP