将文件移动到动态子文件夹

时间:2017-08-25 18:15:29

标签: powershell

我想将特定文件类型的所有文件移动到其现有结构中的子文件夹中。我能找到的所有例子都有硬编码的子文件夹。我有许多冗余文件夹结构,所以硬编码不是一个选项。

我试过这个:

$Dir = "\\root\*\REPORTS\*"

Get-ChildItem $Dir | Where-Object {$_.Name -match "csv"} | Move-Item -dest .\Queue\

产生此错误:

  
      
  • Get-ChildItem $ Dir | Where-Object {$ _。名称-match" csv"} | Move-Item<<<< -dest。\ Queue \      
        
    • CategoryInfo:WriteError:(\ root ... ity20170823.csv:FileInfo)[Move-Item],IOException
    •   
    • FullyQualifiedErrorId:MoveFileInfoItemIOError,Microsoft.PowerShell.Commands.MoveItemCommand
    •   
  •   

我已经读过句号表示当前文件夹,因此我尝试将其用于目的地,但它似乎只适用于路径。它找到文件正常,但无法移动它们。救命啊!

修改 我根据以下建议尝试了这个:

$Dir = "\\root\*\REPORTS\*"

Get-ChildItem $Dir | Where-Object {$_.Name -match "xml"} |  %{
    #Move-Item -path $_.FullName -dest $_.FullName.Replace('REPORTS', 'REPORTS\Queue')
    write-output $_.FullName
    write-output $_.FullName.Replace('REPORTS', 'REPORTS\Queue')
}

写入输出值看起来不错,但move-item行产生此错误:

  

Move-Item:找不到路径的一部分。在   C:\ Users [me] \ Desktop [filename] .ps1:18 char:14   + Move-Item<<<< -path $ .FullName -dest $ .FullName.Replace(' REPORTS',' REPORTS \ Queue')       + CategoryInfo:WriteError:(\ root \ d $ ... ity20170823.csv:FileInfo)[Move-Item],   DirectoryNotFoundException       + FullyQualifiedErrorId:MoveFileInfoItemIOError,Microsoft.PowerShell.Commands.MoveItemCommand

啊,因为路径不存在。如果我放入if-folder-exists-else-create检查,这将有效。我相信。

编辑2 这是有效的,除了它将所有文件放入为文件命名的目录。

$Dir = "\\root\*\REPORTS\*"

Get-ChildItem $Dir | Where-Object {$_.Name -match "csv"} |  %{
    New-Item -ItemType Directory -Force -Path $_.FullName.Replace('REPORTS', 'REPORTS\Queue')
    Move-Item -path $_.FullName -dest $_.FullName.Replace('REPORTS', 'REPORTS\Queue')
    #write-output $_.FullName
    #write-output $_.FullName.Replace('REPORTS', 'REPORTS\Queue')
}

结果转移到:

\\root\abc\REPORTS\Queue\20170707-resub.csv\20170707-resub.csv

如果创建的文件夹只是路径而不是文件,那就太好了。

4 个答案:

答案 0 :(得分:1)

此解决方案应根据评论(更快)完成您想要的任务:

$Dir = '\\root\*\REPORTS\*'

Get-ChildItem -Path $Dir -File -Filter '*.csv' |
  ForEach-Object {
      $Dest = "$($_.DirectoryName)\Queue"
      If (!(Test-Path -LiteralPath $Dest))
      {New-Item -Path $Dest -ItemType 'Directory' -Force}

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

答案 1 :(得分:0)

您在Move-item cmdlet中缺少-path,其中PS应该读取您正在移动的内容。这就是为什么你可能会收到这个错误。 https://docs.microsoft.com/en-us/powershell/module/microsoft.powershell.management/move-item?view=powershell-5.1

我假设你想循环遍历所有文件。我会这样做......

$dir = "\\root\*\REPORTS\*"

Get-ChildItem $Dir | Where-Object {$_.Name -match "csv"}| %{
    Move-Item -path $_.FullName -dest "$Dir\Queue\$($_.Name)"
}

我不建议使用-match因为它可以在文件名中的任何位置选取csv,除非您确定要在名称中的任何位置放置csv的所有文件。 / p>

答案 2 :(得分:0)

你需要一个两步的方法,首先迭代文件夹,然后重复文件 移动不会创建新的文件夹,你要检查自己。

$Dir = "\\root\*\REPORTS"

Get-ChildItem -Path $Dir | Where-Object {$_.PSIsContainer | ForEach-Object {
  $Destination = Join-Path $_.FullName 'Queue\'
  If (!(Test-Path $Destination)){MD $Destination|Out-Null}
  Move-Item "$($_.FullName)\*.csv" -Destination $Destination -WhatIf
}

检查文件夹是否已创建,输出是否正常删除/注释掉-WhatIf

答案 3 :(得分:0)

如果需要在文件夹中查找代码,请在每个文件夹中创建一个新的子文件夹,然后将文件从每个文件夹移动到新的子文件夹。我删除了文件过滤器,因为我不需要它。 (我使用了来自TheIncorrigible1的代码,并感谢Pawtuxet进行了代码更改) 希望我能通过发布规则来遵守规则,以便其他人可以将修改后的版本用于子文件夹。

<#
     Before:
     c:\foldertest
          folder1
              fil
              fil
          folder2
              fil
              fil
          folder3
              fil
              fil
    ----->

    After:
    c:\foldertest
          folder1
             subfolder
                 fil
                 fil
          folder2
             Subfolder
                 fil
                 fil
          folder3
             Subfolder
                 fil
                 fil
       #>

        $Dir = 'C:\temp\pstest\target\*'
        Foreach ($folder in Get-ChildItem -Path $Dir -Directory) {
        Foreach ($file in Get-ChildItem -Path $folder -File) {
            $Dest = "$folder\Subfolder"
            If (!(Test-Path -LiteralPath $Dest)) {
                New-Item -Path $Dest -ItemType 'Directory' -Force
            }
            Move-Item -Path $file.FullName -Destination $Dest
        }
    }