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
【问题讨论】:
为什么VBScript
当DOS
批处理文件可以做到上述更简单?
【参考方案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 方法
如果指定文件存在则返回True; False 如果是 不是。
object.FileExists(filespec)
参数
对象
必填。始终是 FileSystemObject 的名称。
文件规范
必填。要确定其存在的文件的名称。如果文件预计不存在于当前文件夹中,则必须提供完整的路径说明(绝对或相对)。
因此,您的表达式 fso.FileExists("d:\eventlogs\Archive*.evtx")
在此处返回 False;您的文件夹中确实没有任何名为 Archive*.evtx
的文件。
你要么删除你的测试,但你必须处理CopyFile
方法可能产生的错误,正如文档所说:
如果使用通配符的源不匹配任何文件,也会发生错误。
正如@automatedchaos 在他的回答https://***.com/a/20907209/666414 中所建议的那样,您还可以遍历文件夹的文件并决定只要文件名/扩展名与您的模式匹配时要做什么。
最后,您可以混合使用两种解决方案:遍历文件夹的文件,然后在遇到预期文件时将标志设置为 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 使用通配符移动文件(如果存在)的主要内容,如果未能解决你的问题,请参考以下文章
使用 VBScript 制作批处理文件代码以使用 Unicode 符号