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
开关。
我尝试将所有扩展名为 .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
开关。