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