我有一个文件夹,该文件夹中有更多文件夹。
我希望将某个“级别”的所有文件上移一个。
例如,我有:
- ParentFolder \ Actor1 \ Movie \ HighRes \ HighresMovie.mp4
- ParentFolder \ Actor1 \ Movie \ LowresMovie.mp4
- ParentFolder \ Actor2 \ Movie \ HighRes \ HighresMovie.mp4
- ParentFolder \ Actor2 \ Movie \ LowresMovie.mp4
但是我希望它看起来像:
- ParentFolder \ Actor1 \ Movie \ HighresMovie.mp4
- ParentFolder \ Actor1 \ Movie \ LowresMovie.mp4
- ParentFolder \ Actor2 \ Movie \ HighresMovie.mp4
- ParentFolder \ Actor2 \ Movie \ LowresMovie.mp4
这是一个巨大的文件夹,大约包含1000个“演员”文件夹。
我目前有部分命令行命令在起作用:
for /f "delims==" %i in ('dir /a:d /b') do for /f "delims==" %f in ('dir "%i" /a:d /b') do (move "%i\%f\*.*" "%i"&&rd "%i\%f" /s /q)
我可以从“ Actor”文件夹中的命令行运行此命令,它确实可以实现我想要的功能。现在,我希望能够从“ ParentFolder”运行它,并使它对我拥有的每个“ Actor”文件夹应用相同的命令。
答案 0 :(得分:1)
这将获取$TopDir
树中与*.mp4
匹配且路径名中包含HighRes
的文件的列表。然后,它会遍历列表,获取父目录名称,然后将文件移至该父目录。
准备好进行真实操作时,请删除-WhatIf
... [咧嘴]
$TopDir = "$env:TEMP\ParentFolder"
$Filter = '*.mp4'
$SourceDir = 'HighRes'
$MoveFileList = Get-ChildItem -LiteralPath $TopDir -Filter $Filter -Recurse -File |
Where-Object {$_.DirectoryName -match $SourceDir}
foreach ($MFL_Item in $MoveFileList)
{
$DestDir = Split-Path -Path $MFL_Item.DirectoryName -Parent
Move-Item -LiteralPath $MFL_Item.FullName -Destination $DestDir -WhatIf
}
输出[经过重新格式化以便于阅读] ...
What if: Performing the operation
"Move File"
on target
"Item: C:\Temp\ParentFolder\Actor1\Movie\HighRes\HighresMovie.mp4
Destination: C:\Temp\ParentFolder\Actor1\Movie\HighresMovie.mp4".
What if: Performing the operation
"Move File"
on target
"Item: C:\Temp\ParentFolder\Actor2\Movie\HighRes\HighresMovie.mp4
Destination: C:\Temp\ParentFolder\Actor2\Movie\HighresMovie.mp4".