首页 > 解决方案 > 如何在文件夹的每个子目录中执行命令?

问题描述

我有一个文件夹,其中包含更多文件夹。

我希望将某个“级别”的所有文件上移一个。

例如我有:

  • ParentFolder\Actor1\Movie\HighRes\HighresMovie.mp4
  • 父文件夹\Actor1\Movie\LowresMovie.mp4
  • ParentFolder\Actor2\Movie\HighRes\HighresMovie.mp4
  • 父文件夹\Actor2\Movie\LowresMovie.mp4

但我希望它看起来像:

  • ParentFolder\Actor1\Movie\HighresMovie.mp4
  • 父文件夹\Actor1\Movie\LowresMovie.mp4
  • ParentFolder\Actor2\Movie\HighresMovie.mp4
  • 父文件夹\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”文件夹。

标签: windowspowershellbatch-filefile-iocommand-line

解决方案


这将获取$TopDir树中匹配*.mp4HighRes在路径名中具有的文件列表。然后它遍历列表,获取父目录名称,并将文件移动到该父目录。

-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".

推荐阅读