根据Powershell中的名称对照片进行排序

问题描述 投票:0回答:2

我已经使用高级重命名器按日期重命名了我所有的照片,因此它们的名称都如下:

2017年10月14_8; 39_kyd.jpg

其中“ 8; 39”是时间,“ kyd”是由三个随机字符组成的字符串,以减少重复的名称。我想编写一个powershell脚本将它们全部排序到以下文件夹中:]

C:\ Pictures \ 2017 \ 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命令来循环浏览每张图片。谁能建议一种方法来实现这一目标?谢谢!

powershell photo
2个回答
2
投票

看来您使用的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\
  }
}

-1
投票

几个问题:

  • 检索文件名时名称的子字符串,删除了该代码
  • 如果条件比较-应该为'-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
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.