【问题标题】:Sort photos based on name in powershell在powershell中根据名称对照片进行排序
【发布时间】:2019-12-10 12:59:52
【问题描述】:

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

2017-Oct-14_8;39_kyd.jpg

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

C:\图片\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


    【解决方案1】:

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

    您的字符串比较操作错误。使用-eq

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

    另外,$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\
      }
    }
    

    【讨论】:

    • 还有其他的bug,比如$Year = $filename.Substring(0,3)只拉取201
    • 有效!是的,我知道我的代码会充满问题。主要是为了传达我正在尝试做的事情的概念。感谢您的帮助!
    【解决方案2】:

    几个问题:

    • 检索文件名时名称的子字符串,删除了该代码
    • 如果条件比较-应该是'-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
        }
    }
    

    【讨论】:

    • 嘿!有用!谢谢!我知道我的代码会充满错误,我对 powershell 的使用还很陌生。感谢您抽出宝贵时间帮助我。
    猜你喜欢
    • 2014-04-10
    • 2020-12-15
    • 1970-01-01
    • 2019-01-04
    • 1970-01-01
    • 2015-07-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多