将具有特定扩展名的文件移动到更高层次的文件夹

时间:2017-08-09 12:56:53

标签: powershell move get-childitem

我的所有文件都在特定的文件夹中:

17\1\1\PRO
17\1\2\PRO
17\2\1\PRO
xx\xx\xx\PRO
  • 17年(明年18岁)
  • 第一个是指定案例编号的文件夹(最多可以为100个)。
  • 第二个1是案件编号上的子部分。

最后一个文件夹中有一个文件夹PRO,其中包含所有数据。

我们需要移动这些文件,但文件需要保留在各自的“PRO”文件夹中。

例如:

  • 17\1\1\pro\xxx\www\中的文件需要转到17\1\1\pro\movies
  • 17\2\2\pro\xxdfsdf\eeee\中的文件需要转到17\2\2\pro\movies

如果有要移动的文件,则应创建电影文件夹。

我需要获取文件全名的一部分,然后将文件移到“movie”文件夹中。问题是我不知道如何分割全名,添加\电影并将文件移动到那里。

到目前为止,这是我的代码:

Get-ChildItem -Path $mypath -Recurse -File -Filter $extension | select $_Fullname |
Move-Item -Force -Destination ($_Fullname.Split("pro"))

3 个答案:

答案 0 :(得分:2)

如果目标始终是“文件目录的祖父目录的电影子目录”,则可以构建相对于文件位置的目标路径:

Get-ChildItem ... | ForEach-Object {
    $dst = Join-Path $_.Directory '..\..\movies'
    if (-not (Test-Path -LiteralPath $dst -PathType Container)) {
        New-Item -Type Directory -Path $dst | Out-Null
    }
    Move-Item $_.FullName -Destination $dst
}

如果PRO目录是您的锚点,您可以使用这样的正则表达式替换:

Get-ChildItem ... | ForEach-Object {
    $dst = $_.Directory -replace '^(.*\\\d+\\\d+\\\d+\\PRO)\\.*', '$1\movies'
    if (-not (Test-Path -LiteralPath $dst -PathType Container)) {
        New-Item -Type Directory -Path $dst | Out-Null
    }
    Move-Item $_.FullName -Destination $dst
}

答案 1 :(得分:1)

如果您不知道有多少目录,我会这样做:

Get-ChildItem -Path $mypath -Recurse -File -Filter $extension | ForEach-Object {
    if ($_.FullName.IndexOf('\PRO\') -gt 0) {
        $Destination = Join-Path -Path $_.FullName.Substring(0,$_.FullName.IndexOf('\PRO\') + 5) -ChildPath 'movies';
        New-Item $Destination -ItemType Directory -ea Ignore;
        $_ | Move-Item -Destination $Destination;
    } else {
        throw ("\PRO\ path not found in '$($_.FullName)'");
    }
}

只要您的路径只有\pro\一次,这样就可以正常工作。如果他们多次使用customer\pro\17\pro\17\1\1\pro\xx\yy\zz\www并且您需要最后一个索引,那么请使用$_.FullName.LastIndexOf('\pro\')

如果在\pro\所在的目录之前和之后都有.\pro\movies\个目录,那么,您遇到了麻烦。您可能需要找到不同的参考点。

答案 2 :(得分:0)

使用一组文件夹

17\1\1\PRO
17\1\2\PRO
17\2\1\PRO

您可以尝试以下

$RootPaths = Get-ChildItem -Path C:\folder\*\*\*\pro

$RootPaths将包含上面提到的所有3个路径,下面的代码会将所有文件移动到相应的目录。

ForEach( $Path in $RootPaths)
{
    $Movies = Join-Path $Path -Child "Movies"
    If( -not (Test-Path $Movies ) ) { New-Item -Path $Movies -ItemType Directory }

    Get-ChildItem -Path $Path -Recurse -File -Filter $Extension | 
        Move-Item -Path $_.FullName -Destination "$( $Path )\Movies"
}

这样,文件的级别有多少并不重要。它们总是被移动到同一目录。