因此,我有一个包含一些下载内容的文件夹结构,如下所示(我手动对其进行了一些编辑,因为它包含一些敏感数据,这些数据与问题无关。扩展名也不常见,也不相关):
C:.
│ [FILENAME].[ext]
│
├───Example 1
│ └───Example 1
│ └───Example 1
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
│ │
│ └───Folder.[ext]
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
│ │
│ ├───test1
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
│ │
│ ├───test10
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
│ │
│ ├───test11
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
│ │
│ ├───test12
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
│ │
│ ├───test2
│ [FILENAME].[ext]
│ [FILENAME].[ext]
│
│
├───Example 2
│ └───Example 2
│ └───Example 2
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
│ │
│ ├───Folder.[ext]
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
│ │
│ └───Setup
│ [FILENAME].[ext]
│ [FILENAME].[ext]
│ [FILENAME].[ext]
│ [FILENAME].[ext]
│ [FILENAME].[ext]
│
├───Example 3
│ └───Example 3
│ └───Example 3
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
│ │
│ └───Folder.[ext]
│ [FILENAME].[ext]
│ [FILENAME].[ext]
│ [FILENAME].[ext]
│ [FILENAME].[ext]
│ [FILENAME].[ext]
│ [FILENAME].[ext]
│
├───Example 4
│ └───Example 4
│ └───Example 4
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
│ │
│ └───Folder.[ext]
│ [FILENAME].[ext]
│ [FILENAME].[ext]
│ [FILENAME].[ext]
│ [FILENAME].[ext]
│ [FILENAME].[ext]
.
.
.
如您所见,实际文件之前有很多不必要的文件夹。
是否可以使用批处理以编程方式删除“中间文件夹”?基本上,我想删除任何仅包含文件夹的文件夹并将子内容提升一级。如何完成(最好仅使用内置的 Windows 工具)?
在这个小摘录中,只需删除前两个父级“示例 #”文件夹即可解决所有问题,但嵌套深度有时会上下变化。如果一个文件夹只包含一个文件夹,那么我想删除的是“中间人”,如果有实际文件(或多个文件夹,这意味着它的实际组织),那么它应该保留在那里。
谢谢你!
编辑:我正在尝试实现类似的目标,删除三重(但有时是其他深度)嵌套:
C:.
├───Example 1
│ │ [FILENAME].[ext]
│ │ [FILENAME].[ext]
.
.
.
答案1
在电源外壳,一个简单的递归函数就可以找到第一个包含文件的子文件夹。然后可以将该文件夹的内容移动到其顶级容器中。之后,可以删除空文件夹。只需编辑$Top
以反映文件夹的路径:
$Top = 'c:\TopFolder'
Function Get-NonEmptyPath ($FPath) {
If ( -not (gci -LiteralPath $FPath -file) ) {
$Return = Get-NonEmptyPath ( gci -LiteralPath $FPath -Directory ).FullName
} Else { $Return = $FPath }
$Return
}
Filter Get-LiteralPath { $_ | Select @{ N='LiteralPath'; E={ $_.FullName }}}
( Get-ChildItem $Top -Directory ).FullName | ForEach{
If (( $Buried = Get-NonEmptyPath $_ ) -ne $null ) {
gci -LiteralPath $Buried | Get-LiteralPath | Move-Item -Destination $_
For ( $Empty = $Buried ; $Empty -ne $_ ; ( $Empty = Split-Path -LiteralPath $Empty )) {
Remove-Item -LiteralPath $Empty
}
}
}
编辑后$Top
,整个块可以复制并粘贴到电源外壳控制台窗口。