VBScript以使用通配符移动文件(如果存在)
我正在尝试创建一个脚本,用于检查存档的事件日志文件是否存在,如果存在任何文件,则将其移动到另一个文件夹。运行此脚本不会执行任何操作,也不会出现任何错误。我相信If语句中的通配符会给我带来问题。我对vbscript和一般脚本都是新手,希望能得到一些建议VBScript以使用通配符移动文件(如果存在),vbscript,wildcard,file-exists,Vbscript,Wildcard,File Exists,我正在尝试创建一个脚本,用于检查存档的事件日志文件是否存在,如果存在任何文件,则将其移动到另一个文件夹。运行此脚本不会执行任何操作,也不会出现任何错误。我相信If语句中的通配符会给我带来问题。我对vbscript和一般脚本都是新手,希望能得到一些建议 Set fso = CreateObject("Scripting.FileSystemObject") If (fso.FileExists("d:\eventlogs\Archive*.evtx")) Then FSO.CopyFile
Set fso = CreateObject("Scripting.FileSystemObject")
If (fso.FileExists("d:\eventlogs\Archive*.evtx")) Then
FSO.CopyFile "d:\eventlogs\Archive*.evtx" , "d:\eventlogs\archive\"
FSO.Deletefile "d:\eventlogs\archive*.evtx"
End if
在VBScript中查找带有通配符的文件的适当方法:
您可以通过组合使用
instr()
和right()
,或者只使用多个instr()
来复制通配符搜索
Set objFSO=CreateObject(“Scripting.FileSystemObject”)
objStartFolder=“d:\eventlogs\”
设置objFolder=objFSO.GetFolder(objStartFolder)
设置colFiles=objFolder.Files
对于colFiles中的每个objFile
如果instr(objFile.Name,“Archive”)0和instr(objFile.Name,“.evtx”)0,则
objFSO.MoveFile objFile.Name,“存档\”+objFile.Name
如果结束
下一个
迟交答案,但可能有用,因为显然没有人发现错误
在VBScript文档中(script56.chm
在我的例子中),CopyFile方法的帮助页面显示:
FileExists方法
如果指定的文件存在,则返回True错误如果是
不是
object.FileExists(filespec)
参数
反对
必需的。始终是文件系统对象的名称
文件规范
必需的。要确定其存在的文件的名称。如果文件不应存在于当前文件夹中,则必须提供完整的路径规范(绝对或相对)
因此,表达式fso.FileExists(“d:\eventlogs\Archive*.evtx”)
在此处返回False;实际上,您的文件夹中没有任何名为Archive*.evtx
的文件
您可以删除测试,但必须处理CopyFile
方法可能产生的错误,如doc所述:
如果使用通配符的源与任何文件不匹配,也会发生错误
正如@automatedchaos在他的回答中所建议的,您还可以循环浏览文件夹的文件,并决定在文件名/扩展名与您的模式匹配时执行什么操作
最后,您可以混合使用这两种解决方案:循环浏览文件夹的文件,然后在遇到预期文件时将标志设置为True和Exit loop
,然后使用CopyFile
方法
像这样:
With CreateObject("Scripting.FileSystemObject")
For Each objFile in .GetFolder("d:\eventlogs\").Files
If Left(objFile.Name, 7) = "Archive" And .GetExtensionName(objFile) = "evtx" Then
archiveFound = True
End If
Next
If archiveFound Then
.CopyFile "d:\eventlogs\Archive*.evtx", "d:\eventlogs\archive\"
.DeleteFile "d:\eventlogs\Archive*.evtx"
End If
End With
注意,通配符也与
DeleteFile
方法一起使用 为什么VBScript
而DOS
批处理文件可以更简单地执行上述操作?在这种情况下,我需要对扩展名和文件名开头进行字符串比较,这可能比正则表达式更容易处理。
With CreateObject("Scripting.FileSystemObject")
For Each objFile in .GetFolder("d:\eventlogs\").Files
If Left(objFile.Name, 7) = "Archive" And .GetExtensionName(objFile) = "evtx" Then
archiveFound = True
End If
Next
If archiveFound Then
.CopyFile "d:\eventlogs\Archive*.evtx", "d:\eventlogs\archive\"
.DeleteFile "d:\eventlogs\Archive*.evtx"
End If
End With