循环中迭代次数过多

时间:2016-01-04 01:13:37

标签: vbscript

此脚本收集文件夹中的所有文件,并通过将行数附加到文件名来重命名文件。所有文件都是.txt文件。该方法(因为fso.MoveFilefso.DeleteFile太特殊,生成权限错误)是

  1. 创建文本文件
  2. 然后在文件夹中创建文件的集合,
  3. 然后将每个文件复制到具有新名称的同一文件夹中,并
  4. 最后删除已复制的原始文件。
  5. 除非集合中没有空文本文件,否则脚本可以正常工作。发生的情况是,使用新文件重建集合,然后脚本再次重命名文件。我知道我可以通过检查每个文件是否存在某些重复字符串来阻止这种情况,但我想知道发生了什么?为什么脚本会重建文件集并重新运行它们?这种情况一直持续到我杀死这个过程为止。

    另一个有趣的事实是,如果我碰巧捕获一个空文本文件,我的消息会显示并且脚本停在那里,但仍然会再次处理集合中的第一个文件。请注意,空文件恰好是集合中的最后一个,但第一个文件再次被处理。

    因此,通过设计,一个名为'ab0.txt'的创建文本文件被重命名为'ab0-15.txt',因为它有15行文本。这个新重命名的文件看起来像'ab0-15-15-15-15-15-15-15-15-15-15.txt'

    问题:发生了什么事?是否有更好,更有效的方法来实现这一目标?

    以下是与此问题相关的代码:

    Set fso = CreateObject("Scripting.FileSystemObject")
    Set oFolder = fso.GetFolder(strSaveTo)
    Set colFiles = oFolder.Files
    
    ' Call Sub to copy and rename
    ChangeFileName colFiles
    MsgBox("File renaming complete.")
    ' Exit code
    
    Sub ChangeFileName(collectionSet)
      Const ForReading = 1
      Dim oFile
    
      For Each oFile In collectionSet
        Set LineCnt = fso.OpenTextFile(oFile, ForReading)
        If oFile.Size = 0 then
          'if this msg is not included, weird things happen
          MsgBox("The file named " & oFile & _
            " is empty.You may want to verify and manually delete it.")
          '[I had some code in here to delete the empty file, but nothing worked]
        Else
          Do While LineCnt.AtEndOfStream <> True
            LineCnt.SkipLine
          Loop
          lineVar = lineCnt.Line-1
          strNewFile = strSaveTo & Left(oFile.name, Len(oFile.name)-4) & _
                       "-" & lineVar & ".txt"
          fso.CopyFile oFile, strNewFile
          LineCnt.Close
          fso.DeleteFile oFile, True
        End If
      Next
    End Sub
    

3 个答案:

答案 0 :(得分:3)

我已经听到轶事证据表明master集合是&#34; live&#34;,这意味着新创建的文件将被添加到集合中并进行迭代,但我可以&#39;找到任何说明这种或那种方式的文件。无论如何,在处理它们之前,首先将集合中的Files对象复制到数组中可能是个好主意:

File

答案 1 :(得分:1)

collectionSet似乎是您尝试修改的文件夹中的文件集合。问题是,每次通过for-each循环时,您都会将文件添加到此文件夹,其中一些文件会反馈到循环中。您需要做的是找到一种方法来在之前拍摄文件夹的快照,然后尝试迭代它。执行此操作的方法是在迭代之前用文件的名称替换文件夹collectionSet,然后修改代码以打开文件他们的名字(而不是通过文件对象)。这样,当你迭代它时,这个集合不会扩展。

答案 2 :(得分:1)

  1. 你应该在他们使用的范围内创建你的变种(例如你的 文件/文件夹对象用于子。
  2. 始终明确(ly)声明您的变种。
  3. 您不需要复制文件并重命名,然后执行删除操作。 只需使用FileObject.Name属性重命名它。
  4. 以下是一个例子:

    Option Explicit 'always declare your vars!
    
    Dim strFolder:    strFolder = "c:\temp\Rename Test"
    Dim strExtension: strExtension = "txt"
    
    ' Call Sub to rename the files in the folder
    ChangeFileName strFolder, strExtension
    
    Sub ChangeFileName(strFolder, strExtension)
        Const ForReading = 1
        Dim FSO:        set FSO = CreateObject("Scripting.FileSystemObject")
        Dim objFolder:  set objFolder = FSO.GetFolder(strFolder)
        Dim colFiles:   set colFiles = objFolder.Files
        Dim objFile
        Dim intCount
        Dim strFileName
        Dim objTextStream
    
        For Each objFile In colFiles
                msgbox "File: " & objfile.path & vbcrlf & FSO.GetExtensionName(objFile.path)
    
            if UCase(FSO.GetExtensionName(objFile.Path)) = UCase(strExtension) and _ 
               objFile.Size > 0 then
                'set LineCnt = FSO.OpenTextFile(objFile, ForReading)
                set objTextStream = objFile.OpenAsTextStream(ForReading,-2)
                intCount = 0
                strFileName = objFile.Name
                Do While objTextStream.AtEndOfStream <> True 
                    intCount = intCount + 1
                    objTextStream.ReadLine
                Loop
                objTextStream.Close
                objFile.Name = FSO.GetBaseName(objFile.Path) & "-" & _
                               intCount & "." & FSO.GetExtensionName(objFile.Path)
            end if
        Next
    End Sub