通过目录递归并根据父目录重命名/追加文件名

时间:2011-01-21 21:34:17

标签: vbscript

我有一堆子目录的目录。

MAIN_DIR \

每个子目录都是“项目名称”,例如

MAIN_DIR \ BOBEVANS324

MAIN_DIR \ BILLJOHNSON3

每个“project”文件夹中都包含一堆子目录。假设我正在寻找“.abc”文件,如果不查看文件夹结构,这些文件的名称都没有意义。例如,

MAIN_DIR \ BOBEVANS234 \ SUBDIR \ 3904902490.abc

正如您所看到的,“3904902490.abc”在目录树的上下文之外没有任何意义。我想通过在复制文件后将目录名称附加到文件名来重命名它。

因此,它会查看MAIN_DIR的所有子文件夹并尝试查找“.abc”文件。当它找到一个时,它会将其复制到dest目录并将其重命名为“BOBEVANS234_SUBDIR_3904902490.abc”。

2 个答案:

答案 0 :(得分:0)

您想查看FileSystemObject,尤其是Folder ObjectSubFoldersName(创建新名称)属性和File Object并且它是Move Method(请记住,如果您将文件移动到同一目录中的其他名称,它将具有与重命名相同的效果)。

要找到要重命名的文件,不幸的是你必须手工查找它们,虽然它很容易,因为在这篇MS KB文章中可以看到它(它是为VB6编写的,但它与VBScript非常相似):{ {3}}

答案 1 :(得分:0)

这是我用于脚本的递归函数,你也可以使用它

注意您必须使用Recurse NOT RecurseX recursex由Recurse Function使用。

注意:如果有很多子目录,那么递归可能需要一段时间。

Recurse功能会返回包含所有文件夹的 ARRAY EVERY 子文件夹。

例如:

Dim I, SubDirectories

SubDirectories=Recurse ("MAIN_DIR")

For I=0 To UBound (SubDirectories)

WScript.Echo SubDirectories (I)

Next

'########################################## '# # '# Function # '# # '# Recurse Function # '# by Ronnie Matthews # '########################################## '# # '# This will return an array of all # '# Folders and subfolders (every levels) # '# in a directory provided. # '# # '##########################################

Function Recurse (dir)

    Dim FSO
    Set FSO = CreateObject("Scripting.Filesystemobject")


    If Not FSO.FolderExists (dir) Then

        Recurse=Array (Empty)
        Exit Function
    End If

    Dim RecArr, RecArrID
    RecArr=Array (dir)
    RecArrID=1
    Recurse=RecurseX (dir,RecArr,RecArrID)
    RecArr=Empty
    RecArrID=Empty



End Function

'DO NOT CALL THIS FUNCTION DIRECTLY. ONLY RECURSE
Function RecurseX (Dir,RecArr,RecArrID)



    Dim F,FSO

    Set FSO = CreateObject("Scripting.Filesystemobject")

    For Each F In FSO.GetFolder (dir).SubFolders
        ReDim Preserve RecArr (RecArrID)
        RecArr (RecArrID)=F.Path
        RecArrID=RecArrID+1
        If F.SubFolders.Count>=1 Then


            RecurseX=RecurseX (F.Path,RecArr,RecArrID)

        End If

    Next

    RecurseX=RecArr

End Function

Function Recurse (dir) Dim FSO Set FSO = CreateObject("Scripting.Filesystemobject") If Not FSO.FolderExists (dir) Then Recurse=Array (Empty) Exit Function End If Dim RecArr, RecArrID RecArr=Array (dir) RecArrID=1 Recurse=RecurseX (dir,RecArr,RecArrID) RecArr=Empty RecArrID=Empty End Function 'DO NOT CALL THIS FUNCTION DIRECTLY. ONLY RECURSE Function RecurseX (Dir,RecArr,RecArrID) Dim F,FSO Set FSO = CreateObject("Scripting.Filesystemobject") For Each F In FSO.GetFolder (dir).SubFolders ReDim Preserve RecArr (RecArrID) RecArr (RecArrID)=F.Path RecArrID=RecArrID+1 If F.SubFolders.Count>=1 Then RecurseX=RecurseX (F.Path,RecArr,RecArrID) End If Next RecurseX=RecArr End Function