PowerShell:将子文件夹中相同类型的所有文件移动到子文件夹

PowerShell: Move all files from same type in subfolders, to subsubfolders

我尝试将所有扩展名为 .wav 的文件从某个根文件夹内的 400 个不同文件夹移动到它们名为 'Stems' 的子文件夹中。这意味着根文件夹中的 400 个文件夹中的每一个都有一个名为 'Stems'.

的子文件夹
$Dir = 'F:\PRODUCTION\Complete Projects\*'

Get-ChildItem -Path $Dir -File -Filter '*.wav' |
  ForEach-Object {
      $Dest = "$($_.DirectoryName)\*\Stems"
      If (!(Test-Path -LiteralPath $Dest))
      {New-Item -Path $Dest -ItemType 'Directory' -Force}

      Move-Item -Path $_.FullName -Destination $Dest
  }

当我select为变量$dir一个指定的项目文件夹并从$dest$变量中删除*时,如下所示,它确实移动了.wav文件正确到 'Stems' 子文件夹。

$Dir = 'F:\PRODUCTION\Complete Projects\Project 392 - Woodland\'

Get-ChildItem -Path $Dir -File -Filter '*.wav' |
  ForEach-Object {
      $Dest = "$($_.DirectoryName)\*\Stems"
      If (!(Test-Path -LiteralPath $Dest))
      {New-Item -Path $Dest -ItemType 'Directory' -Force}

      Move-Item -Path $_.FullName -Destination $Dest
  }

但是,我希望能够一次对不同的文件夹名称执行此操作,而不是每个指定文件夹执行 400 次。

有什么建议吗?

如果我理解正确的话,你可以添加一个 -Recurse 开关到 Get-ChildItem 来获取所有 .wav 文件,然后按它们父文件夹的路径对它们进行分组,然后对每个组进行迭代对象并将它们移动到各自的 sub-folder.

IO.FileInfo outputted by Get-ChildItem has a .Directory property which represents the file's parent directory, the property value is a IO.DirectoryInfo 个实例的每个实例。

# get all wav files recursive
Get-ChildItem -Path $Dir -File -Filter '*.wav' -Recurse |
    # group them by their parent folder absolute path
    Group-Object { $_.Directory.FullName } | ForEach-Object {
        # for each group, create a destination folder
        $dest = New-Item (Join-Path $_.Name -ChildPath 'Stems') -ItemType Directory -Force
        # and move them
        $_.Group | Move-Item -Destination $dest -WhatIf
    }

一旦您认为脚本正在执行您想要的操作,您就可以删除 -WhatIf 开关。