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

我正在尝试创建一个脚本,用于检查存档的事件日志文件是否存在,如果存在任何文件,则将其移动到另一个文件夹。运行此脚本不会执行任何操作,也不会出现任何错误。我相信If语句中的通配符会给我带来问题。我对vbscript和一般脚本都是新手,希望能得到一些建议

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