VBScript中For Each遍历PNG文件为何无法突破1000个限制?
解决VBScript遍历大量PNG文件时在第1000个停止的问题
这个问题我之前也碰到过!罪魁祸首其实是WScript.Echo的输出缓冲区限制——Windows脚本宿主(WSH)对控制台输出的缓冲区有默认大小限制,当你连续输出大约1000行内容后,缓冲区会被填满,脚本就会卡住停止执行,而不是FileSystemObject本身不能遍历更多文件。
你的脚本里每找到一个PNG文件就会用WScript.Echo输出信息,这就是导致遍历中断的核心原因。毕竟你有3万多个文件,远远超过了echo缓冲区的承载能力。
修复方案
最简单的解决方法就是移除或者注释掉WScript.Echo那一行(如果它只是用来调试的话),因为你的核心需求是把文件相关信息导出以便后续导入Excel,echo并不是必需的。如果需要保留时间戳信息,直接把它们写入输出文件即可,修改后的代码如下:
Option Explicit 'force all variables to be declared Const ForWriting = 2 Dim objFSO Set objFSO = CreateObject("Scripting.FileSystemObject") Dim objTS 'Text Stream Object Set objTS = objFSO.OpenTextFile("C:\tmp\output.txt", ForWriting, True) Recurse objFSO.GetFolder("C:\tmp") objTS.Close() Sub Recurse(objFolder) Dim objFile, objSubFolder For Each objFile In objFolder.Files If LCase(objFSO.GetExtensionName(objFile.Name)) = "png" Then ' 注释掉或删除WScript.Echo,避免缓冲区溢出 ' WScript.Echo objFSO.GetBaseName(objFile.Name) & vbTab & _ ' CDate(objFile.DateLastModified) & vbTab & _ ' CDate(objFile.DateCreated) ' 把需要的信息直接写入文件,方便后续导入Excel objTS.WriteLine objFSO.GetBaseName(objFile.Name) & vbTab & _ CDate(objFile.DateLastModified) & vbTab & _ CDate(objFile.DateCreated) & vbTab & objfile.Path End If Next 'unmark to make it recursive 'For Each objSubFolder In objFolder.SubFolders ' Recurse objSubFolder 'Next End Sub
额外说明
如果你确实需要控制台输出,可以改用WScript.StdOut.WriteLine(需以CScript宿主运行脚本),不过即便如此,也不建议在遍历大量文件时频繁输出到控制台——写入文件才是更稳定、高效的方式,也更符合你后续导入Excel的需求。
内容的提问来源于stack exchange,提问作者Peter
相关产品推荐
相关产品推荐

