如何在文件夹的每个子目录中执行命令?

时间:2018-12-24 06:44:37

标签: windows powershell batch-file file-io command-line

我有一个文件夹,该文件夹中有更多文件夹。

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

例如,我有:

  
      
  • 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”文件夹应用相同的命令。

1 个答案:

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