【问题标题】:VBS: For-each loop (sometimes) iterates through file collection indefinitelyVBS:for-each 循环(有时)无限期地遍历文件集合
【发布时间】:2018-08-17 04:46:09
【问题描述】:

以下 VBscript 的目标是为指定目录中具有特定扩展名的所有文件添加用户定义的字符串:

directory = "C:\Users\xxxxxxxx\Desktop\Test\"   'include final backslash
extension = ".doc"  'include period, ex: ".tab"
''''''''''''''''''''''''''''''''''''''''''

addStr = InputBox("Enter the text you would like to prepend:", , "xxxxxxxx_xxxxxxxxxx_x_xx_xxx_")


Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFolder = objFSO.GetFolder(directory)
Set colFiles = objFolder.Files

For Each file In colFiles
    absPath = objFSO.GetAbsolutePathName(file)
    currentExtension = objFSO.GetExtensionName(absPath)
    If  StrComp(currentExtension, Mid(extension, 2)) = 0 Then
        file.Name = addStr & objFSO.GetFileName(file)
    End If
Next

脚本通常运行良好,但偶尔会出现这种问题行为

在包含大量文件和/或具有长名称的文件的目录上运行脚本时,脚本似乎会迭代回文件集合(即,预先添加到已经预先添加的文件)并这样做直到文件名变得太长而无法被 FSO 识别,从而导致脚本崩溃。

发生这种情况的文件数量/文件名长度的阈值似乎非常明显且可重现。例如,如果我创建一个目标目录(例如“...\Desktop\Test”),其中包含一个名为“1.doc”的文件,该文件被多次复制/粘贴,脚本将正确重命名多达 31 个文件,但它演示了 32+ 个文件的问题行为。同样,如果我在 31 个文件(以相同方式生成)上运行该脚本两次,则该脚本在第二次运行时演示了有问题的行为。

非常感谢您对潜在问题的任何想法 - 在此先感谢!

【问题讨论】:

标签: vbscript filesystemobject


【解决方案1】:

您可能在此处遇到问题,因为您正在修改文件 迭代它们。尝试先创建一个文件名数组,然后遍历该数组,更改名称。

ReDim a(colFiles.Count - 1)
i = 0

For Each File In colFiles
    a(i) = File.Path
    i = i + 1
Next

For i = 0 To UBound(a)
    If StrComp(objFSO.GetExtensionName(a(i)), Mid(extension, 2)) = 0 Then
        With objFSO.GetFile(a(i))
            .Name = addStr & .Name
        End With
    End If
Next

【讨论】:

    【解决方案2】:

    出现上述行为的原因是,当您最初调用Set colFiles = objFolder.Files 时,会检索前32 个文件,并将其放入缓存中。处理完这 32 个文件后,系统会检索前 32 个尚未处理的文件名。

    由于您在初次调用后重命名了文件,系统将这些文件视为尚未处理的新文件名。由于它们的名称仍按字母顺序排列,因此它们被放入 32 文件缓存中,并再次进行处理。

    @Bond 的解决方案是此问题的标准解决方法。由于 vbs 的限制,这是此问题的唯一实际解决方案。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-16
      • 2016-07-16
      • 2014-08-13
      • 1970-01-01
      • 1970-01-01
      • 2021-12-31
      相关资源
      最近更新 更多