如何以程式設計方式取消 Windows 中多個資料夾的嵌套?

如何以程式設計方式取消 Windows 中多個資料夾的嵌套?

因此,我有一個包含一些下載的資料夾結構,如下所示(我手動對其進行了一些編輯,因為它包含一些與問題無關的敏感資料。擴展名也不常見,也不相關):

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 工具)?

在這個小摘錄中,只需刪除前兩個父「Example #」資料夾即可解決所有問題,但嵌套深度有時會上下變化。如果一個資料夾僅包含一個資料夾,那麼它是我想要刪除的“中間人”,如果存在實際文件(或多個資料夾,這意味著它是實際的組織),則它應該保留在那裡。

謝謝你!

編輯:我正在嘗試實現類似的目標,刪除三重(但有時是其他深度)嵌套:

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,可以將整個區塊複製並貼上到電源外殼控制台視窗。

gci/獲取子項

對於每個

關於 為

移動項目

分割路徑

除去項目

相關內容