Powershell:循环浏览子目录并移动文件

时间:2019-02-19 22:28:28

标签: powershell

我的目标是简单的任务。 我想在提供的根文件夹“ D:Temp \ IMG”的所有子文件夹中创建常量名称为“ jpg”的文件夹,并将每个扩展名为“ .jpg”的子文件夹中的所有文件移动到该新创建的“ jpg”文件夹中。

我认为我无需具备对powershell的深入了解就可以自行解决此问题,但似乎我不得不问。

到目前为止,我已经创建了这段代码

$Directory = dir D:\Temp\IMG\ | ?{$_.PSISContainer};
foreach ($d in $Directory) {
Write-Host "Working on directory $($d.FullName)..."
Get-ChildItem -Path "$($d.FullName)" -File -Recurse -Filter '*.jpg' |
  ForEach-Object {
      $Dest = "$($d.DirectoryName)\jpg"
      If (!(Test-Path -LiteralPath $Dest))
      {New-Item -Path $Dest -ItemType 'Directory' -Force}

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

我从中得到的是每个子文件夹中文件夹“ jpg”创建的无限循环。 请问我的代码和逻辑在这里哪里出错了?

2 个答案:

答案 0 :(得分:0)

以下脚本将完成这项工作。

$RootFolder = "F:\RootFolder"

$SubFolders = Get-ChildItem -Path $RootFolder -Directory

Foreach($SubFolder in $SubFolders)
{ 
    $jpgPath = "$($SubFolder.FullName)\jpg"
    New-Item -Path $jpgPath -ItemType Directory -Force

    $jpgFiles = Get-ChildItem -Path $SubFolder.FullName -Filter "*.jpg"

    Foreach($jpgFile in $jpgFiles)
    {
        Move-Item -Path $jpgFile.FullName -Destination "$jpgPath\"
    }
}

答案 1 :(得分:0)

我敢肯定,这将完成您的尝试。尽管指定了您想要的原始脚本(Get-ChildItem的语法有些严格),但实际上并没有递归,因此我将其修复。还修正了我的建议(我忘记了Extension属性包括前面的点,因此'FileName.jpg'具有'.jpg'作为扩展名)。我添加了一些检查,如果文件已经存在于目标位置,它会发出警告。

$Directory = dir D:\Temp\IMG\ -Directory
foreach ($d in $Directory) {
    Write-Host "Working on directory $($d.FullName)..."
    Get-ChildItem -Path "$($d.fullname)\*" -File -Recurse -filter '*.jpg' |
        Where{$_.Directory.Name -ne $_.Extension.TrimStart('.')}|
        ForEach-Object {
            $Dest = join-path $d.FullName $_.Extension.TrimStart('.')
            If (!(Test-Path -LiteralPath $Dest))
            {New-Item -Path $Dest -ItemType 'Directory' -Force|Out-Null}

            If(Test-Path ($FullDest = Join-Path $Dest $_.Name)){
                Write-Warning "Filename conflict moving:`n     $($_.FullName)`nTo:`n     $FullDest"
            }Else{
                Move-Item -Path $_.FullName -Destination $Dest -Verbose
            }
      }
}