功能是:

E:\139
├─ 文件夹A
│ ├─ 子目录1\图片1.jpg
│ ├─ 子目录2\视频1.mp4
│ └─ 图片2.jpg

  • 运行后变成:

E:\139
├─ 文件夹A
│ ├─ 图片1.jpg
│ ├─ 视频1.mp4
│ └─ 图片2.jpg

1.把每个一级文件夹里面所有子目录的文件移动到一级文件夹内,然后删除空子目录。

2.一级文件夹里原本已经存在的文件不会被重新命名,只会移动子目录里的文件。遇到重名文件会自动变成:

图片.jpg
图片_1.jpg
图片_2.jpg

保存为:整理子目录文件到上级.vbs

Option Explicit

Dim fso, topPath, topFolder, folder

' 顶级目录
topPath = "Y:\YeonWoo"

Set fso = CreateObject("Scripting.FileSystemObject")

If Not fso.FolderExists(topPath) Then
    MsgBox "Path not found: " & topPath, vbCritical, "Error"
    WScript.Quit
End If

Set topFolder = fso.GetFolder(topPath)

For Each folder In topFolder.SubFolders
    ProcessParentFolder folder.Path
Next

MsgBox "Done!", vbInformation, "Finished"


Sub ProcessParentFolder(parentPath)
    Dim parentFolder

    If Not fso.FolderExists(parentPath) Then Exit Sub

    Set parentFolder = fso.GetFolder(parentPath)

    ' 先移动所有子目录里的文件到当前一级文件夹
    MoveFilesFromSubFolders parentFolder, parentPath

    ' 再删除所有子目录
    DeleteAllSubFolders parentFolder
End Sub


Sub MoveFilesFromSubFolders(folderObj, parentPath)
    On Error Resume Next

    Dim subFolder, fileObj
    Dim destPath

    ' 只处理子目录里的文件,不动 parentPath 第一层已有文件
    For Each subFolder In folderObj.SubFolders

        ' 先递归处理更深层子目录
        MoveFilesFromSubFolders subFolder, parentPath

        ' 再移动当前子目录里的文件
        For Each fileObj In subFolder.Files
            destPath = GetUniquePath(parentPath, fileObj.Name)
            Err.Clear
            fso.MoveFile fileObj.Path, destPath
        Next
    Next

    On Error GoTo 0
End Sub


Function GetUniquePath(parentPath, fileName)
    Dim baseName, extName, destPath, i

    baseName = fso.GetBaseName(fileName)
    extName = fso.GetExtensionName(fileName)

    destPath = fso.BuildPath(parentPath, fileName)
    i = 1

    Do While fso.FileExists(destPath)
        If extName <> "" Then
            destPath = fso.BuildPath(parentPath, baseName & "_" & i & "." & extName)
        Else
            destPath = fso.BuildPath(parentPath, baseName & "_" & i)
        End If
        i = i + 1
    Loop

    GetUniquePath = destPath
End Function


Sub DeleteAllSubFolders(folderObj)
    On Error Resume Next

    Dim subFolder

    ' 先删除更深层目录
    For Each subFolder In folderObj.SubFolders
        DeleteAllSubFolders subFolder
    Next

    ' 再删除当前层子目录
    For Each subFolder In folderObj.SubFolders
        Err.Clear
        fso.DeleteFolder subFolder.Path, True
    Next

    On Error GoTo 0
End Sub