基于元数据在 foreach 循环中复制项目

Copy-item in foreach loop based off metadata

在这个脚本中,我确定了一组图片的元数据,然后 运行 if 语句在 foreach 循环中复制一个文件夹中具有特定日期的所有图片到具有该日期的新目录。

我的问题是 Copy-Item,我想是这样。如果我使用变量 $file$ 它只是将另一个目录放置在前一个目录中。我拥有它的方式不只是将所有图片复制到该目录中,尽管它包含在 if 声明中。

$fol = "C:"

foreach ($file in $fol) {

    $data1 = Get-FileMetaData "C:"
    $data2 = $data1 | Select-Object 'Date taken'

    if ($data2 -like '*2006*') {

        if(!(Test-Path "C:06")) {
            New-Item -ItemType Directory -Path "C:06"
        }

        Copy-Item  "C:\*" "C:06"         
        echo $data2
    } else {
        echo 'no'
    }
}

echo $data2 显示:

为什么使用元数据来确定创建日期。您可以使用创建时间

试试这个

#if you want move for specific year
$destination="c:\destination16"
New-Item -ItemType Directory $destination -Force
Get-ChildItem "c:\temp\" -Recurse -File -Filter "*.png" | Where {$_.CreationTime.Year -eq 2016} | %{Copy-Item $_.FullName "$destination$($_.Name)" }

#if you want copy all image png by year of creation
$destination="c:\destination"

Get-ChildItem "c:\temp\" -Recurse -File -Filter "*.png" | group {$_.CreationTime.Year} | 
%{
$DirYear="$destination$($_.Name)"
New-Item -ItemType Directory $DirYear -Force
$_.Group | %{Copy-Item $_.FullName "$DirYear$($_.Name)" }
}

其他解决方案

#explicite version
Get-ChildItem "c:\temp\" -Recurse -File -Filter "*.png" |
    ForEach-Object {Copy-Item $_.FullName (New-Item -ItemType Directory "$destination$($_.CreationTime.Year)" -Force).FullName}

#short version
gci "c:\temp\" -R -File -Fi "*.png" |
    % {cpi $_.FullName (ni -I Directory "$destination$($_.CreationTime.Year)" -Force).FullName}