VBScript 使用通配符移动文件(如果存在)

Posted

技术标签:

【中文标题】VBScript 使用通配符移动文件(如果存在)【英文标题】:VBScript to move file with wildcard, if it exists 【发布时间】:2014-01-21 06:07:22 【问题描述】:

我正在尝试创建一个脚本来检查归档事件日志文件是否存在,如果存在任何文件,则将它们移动到另一个文件夹。运行这个脚本什么都不做,也不会出错。我相信 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

【问题讨论】:

为什么VBScriptDOS批处理文件可以做到上述更简单? 【参考方案1】:

在 VBScript 中查找带有通配符的文件的适当方法:

    从包含的文件夹中获取文件集合 对于文件集合中的每个文件: 使用正则表达式在特定模式下测试文件名 如果测试通过,请对该文件执行一些操作 下一个文件

【讨论】:

在这种情况下,我会比较字符串扩展名和文件名的开头可能比正则表达式更容易处理。【参考方案2】:

您可以使用instr()right() 的组合或仅使用多个instr() 来复制通配符搜索。

Set objFSO = CreateObject("Scripting.FileSystemObject")
objStartFolder = "d:\eventlogs\"

Set objFolder = objFSO.GetFolder(objStartFolder)

Set colFiles = objFolder.Files
For Each objFile in colFiles
   if instr(objFile.Name,"Archive") <> 0 AND instr(objFile.Name,".evtx") <> 0 then
       objFSO.MoveFile objFile.Name, "archive\" + objFile.Name
   end if
Next

【讨论】:

【参考方案3】:

迟到的答案,但可能有用,因为显然没有人发现错误。

来自 VBScript 文档(在我的例子中是 script56.chm),CopyFile 方法的帮助页面说:

FileExists 方法

如果指定文件存在则返回TrueFalse 如果是 不是。

object.FileExists(filespec)

参数

对象

必填。始终是 FileSystemObject 的名称。

文件规范

必填。要确定其存在的文件的名称。如果文件预计不存在于当前文件夹中,则必须提供完整的路径说明(绝对或相对)。

因此,您的表达式 fso.FileExists("d:\eventlogs\Archive*.evtx") 在此处返回 False;您的文件夹中确实没有任何名为 Archive*.evtx 的文件。

你要么删除你的测试,但你必须处理CopyFile方法可能产生的错误,正如文档所说:

如果使用通配符的源不匹配任何文件,也会发生错误。

正如@automatedchaos 在他的回答https://***.com/a/20907209/666414 中所建议的那样,您还可以遍历文件夹的文件并决定只要文件名/扩展名与您的模式匹配时要做什么。

最后,您可以混合使用两种解决方案:遍历文件夹的文件,然后在遇到预期文件时将标志设置为 TrueExit 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 使用通配符移动文件(如果存在)的主要内容,如果未能解决你的问题,请参考以下文章

如果文件存在通配符?

linux下怎么把一个文件复制到另一个文件夹

VBscript创建数组但省略空白变量

使用 VBScript 制作批处理文件代码以使用 Unicode 符号

如何在不实际提取文件的情况下使用 VBScript 读取 .zip 文件的内容?

使用 vbscript 填充预先存在的 Excel 表单