脚本功能解析
该脚本的主要作用是“扁平化”指定文件夹(Y:\YeonWoo)下所有一级子文件夹的内部目录结构。
具体逻辑如下:
- 遍历根目录:针对 Y:\YeonWoo 里的每一个一级文件夹(父文件夹)。
- 提取文件:递归遍历这些一级文件夹内部的所有子文件夹,将里面的所有文件全部移动到该一级文件夹的根目录下。
- 处理同名冲突:如果移动时遇到重名文件,会自动在文件名后加上下划线和序号(如 photo_1.jpg)以防覆盖。
- 清理空目录:将文件全部提出后,彻底删除这些一级文件夹内部的所有子文件夹,仅留下一级文件夹和其中的所有文件。
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
评论 0
欢迎参与讨论,请保持友善与尊重。