在 powershell 中根据名称对照片进行排序

Sort photos based on name in powershell

我使用 Advanced Renamer 按日期重命名了我所有的照片,因此它们的名称都如下:

2017-Oct-14_8;39_kyd.jpg

其中“8;39”是时间,"kyd"是三个随机字符组成的字符串,以减少消除重名。我想编写一个 powershell 脚本将它们全部分类到文件夹中,例如:

C:\Pictures17\Oct

第一个目录是年份,第二个目录是月份。如果照片没有拍摄日期元数据,则其名称为:

"--_;_kyd.jpg"

我想将其分类到位于 C:\Pictures 的 "MANUAL_SORT" 文件夹中。我正在尝试使用 powershell 来执行此操作,这是我目前所拥有的:

$SourceFolder = 'C:\Pictures\Test'
$DestinationFolder = 'C:\Pictures\Test_Output'

Get-ChildItem -Path $SourceFolder -Filter *.jpg | ForEach-Object
{
$filename = $_.Name.Substring(0,7);
if ($filename.Substring(0,3) = "--_;")
{
    Move-Item -Path $SourceFolder -Destination "$DestinationFolder\MAUNAL_SORT"
}
else
{
$Year = $filename.Substring(0,3)
$Month = $filename.Substring(5,7)
Move-Item -Path $SourceFolder -Destination $DestinationFolder$Year$Month
}
}

但我不知道如何使用 ForEach-Object 命令循环遍历每张图片。任何人都可以建议一种方法来完成这个吗?谢谢!

您似乎错误地使用了 Move-Item。使用 $_.FullName 作为 -Path 参数的参数。正如所写,您反复尝试将整个源文件夹移动到目标文件夹中。

你的字符串比较操作有误。使用 -eq.

您的子字符串调用得到的字符太少了。参数为 indexcount。索引当然是从零开始的,但是计数是你想要的实际字符数。

此外,$filename 变量仅完成对 Substring() 的额外调用,在脚本的其余部分没有用处。

gci $SourceFolder -Filter *.jpg | foreach {
  $YYYY = $_.Name.Substring(0,4)
  if ($YYYY -eq '--_;') {
    mv $_.FullName $DestinationFolder\MANUAL_SORT\
  } else {
    $MM = $_.Name.Substring(5,3)
    mv $_.FullName $DestinationFolder$YYYY$MM\
  }
}

几个问题:

  • 检索文件名时名称的子字符串,删除了该代码
  • if 条件比较 - 应该是 '-eq'

另请验证文件夹是否存在或未添加#TODO

Get-ChildItem -Path $SourceFolder -Filter *.jpg | ForEach-Object {
    $filename = $_.Name;

    if ($filename.Substring(0,3) -eq "--_")
    {


        Move-Item -Path $_.FullName -Destination "$DestinationFolder\MAUNAL_SORT\"
    }
    else
    {
    $Year = $filename.Substring(0,3)
    $Month = $filename.Substring(5,7)
    #TODO: test path if directory exists else create it
    Move-Item -Path $_.FullName  -Destination $DestinationFolder$Year$Month
    }
}