You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.29 07:16:22