VBS:For-each循环(有时)无限期地遍历文件收集

时间:2014-04-24 00:41:59

标签: vbscript filesystemobject

以下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个文件(以相同方式生成)上运行两次脚本,则脚本会在第二次运行时演示有问题的行为。

对基本问题的任何想法都非常感谢 - 提前感谢!

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

发生上述现象的原因是,因为当您最初调用g = df.groupby('group') def f(gr): n = gr.tail(1).copy() n.value = np.nan return gr.append(n) g.apply(f).reset_index(drop=True) group value 0 1 2.0 1 1 3.0 2 1 NaN 3 2 NaN 4 2 5.0 5 2 4.0 6 2 NaN 时,将检索前32个文件并将其放入缓存中。处理完这32个文件后,系统将检索尚未处理的前32个文件名。

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

@Bond提供的解决方案是此问题的标准解决方法。由于vb的限制,这是此问题的唯一可行解决方案。