根据文件名将文件移动到文件夹

时间:2017-03-22 10:31:16

标签: powershell

我在一个目录中有几千个文件。其中许多文件需要根据文件名的一部分组合在自己的目录中。我需要文件名的一部分作为目标文件夹名称。我把破折号放在文件名的一部分,我需要命名目录。

例如,以下文件位于单个目录中:

  • FILEA-123-.PDF
  • FILEB-123-.PDF
  • filec-456-.PDF
  • 日提交-123-.PDF
  • file3-456-.PDF

我需要将所有带有“-123-”的文件移动到名为“123”的文件夹中。同样,我需要将所有带有“-456-”的文件移动到名为“456”的文件夹,依此类推。

这是我到目前为止所做的:

$dir = "C:\convert"
$filelist = (Get-Item $dir).GetFiles()
foreach ($file in $filelist)
{
    $newdir = $file.Name -match '-\d+-'
    Move-Item $file -Destination "C:\convert\$matches[0]"
}

我也试过这个:

$dir = "C:\convert"
$filelist = (Get-Item $dir).GetFiles()
foreach ($file in $filelist)
{
    $pieces = $file-split"-"
    $start = $pieces.Count*-1
    $folder = $pieces[$Start..-2]-join" "
    $destination = "C:\convert\{0}" -f $folder

    if (Test-Path $destination -PathType Container)
    {
        Move-Item -Path $filename -Destination $destination
    }
}

3 个答案:

答案 0 :(得分:1)

试试这个

$dir = "C:\convert"

$filelist = @(Get-ChildItem $dir)

ForEach ($file in $filelist){
    # Gets the '123' part
    $folder = $file.Name.Split("-")[1] 

    #Test if folder exists.
    Set-Location ($dir+'\'+$folder)

    #If no folder, create folder.
    if(!$?){ mkdir ($dir+'\'+$folder) }

    #Move item keeping same name.
    Move-Item $file.FullName ($dir+'\'+$folder+'\'+$file.Name) 
  }
}

答案 1 :(得分:0)

使用正则表达式中的捕获组从文件名中提取数字:

Get-ChildItem $dir -File | Where-Object {
  $_.Name -match '-(\d+)-.pdf$'
} | ForEach-Object {
  Move-Item $_.FullName ('{0}\{1}' -f $dir, $matches[1])
}

或者像这样,因为Move-Item可以直接从管道中读取:

Get-ChildItem $dir -File | Where-Object {
  $_.Name -match '-(\d+)-.pdf$'
} | Move-Item -Destination {'{0}\{1}' -f $dir, $matches[1]}

答案 2 :(得分:0)

我喜欢Ansgars方法,如果仍然需要创建子文件夹:

Get-ChildItem -Path $dir -Filter "*-*-.PDF" | 
  Where-Object Name -match '-(\d+)-.pdf$' | 
  ForEach-Object {
    $DestDir = Join-Path $dir $matches[1]
    If (!(Test-Path $DestDir)) {mkdir $DestDir|Out-Null}
    $_|Move-Item -Destination $DestDir
}