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]

                             .
                             .
                             .

ご覧のとおり、実際のファイルの前には不要なフォルダーがたくさんあります。

バッチを使用して「中間フォルダー」をプログラムで削除することは可能ですか? 基本的に、フォルダーのみを含むフォルダーを削除し、サブコンテンツを 1 レベル上に移動したいと考えています。 どのように実行しますか (できれば組み込みの Windows ツールのみを使用)?

この小さな抜粋では、最初の 2 つの親「Example #」フォルダーを削除するだけですべてが解決しますが、ネストの深さは時々上下に変化します。フォルダーに 1 つのフォルダーのみが含まれている場合は、削除する「中間者」ですが、実際のファイル (または実際の組織である複数のフォルダー) がある場合は、そのままにしておく必要があります。

ありがとう!

編集: 3 重の (ただし場合によっては他の深さの) ネストを削除して、次のような結果を実現しようとしています。

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/Get-ChildItem

について

アイテムの移動

分割パス

アイテムの削除

関連情報