我已经使用高级重命名器按日期重命名了我所有的照片,因此它们的名称都如下:
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命令来循环浏览每张图片。谁能建议一种方法来实现这一目标?谢谢!
看来您使用的Move-Item不正确。使用$_.FullName
作为-Path参数的参数。如所写,您反复尝试将整个源文件夹移到目标位置。
您的字符串比较操作错误。使用-eq
。
您的子字符串调用得到的字符太少。参数为index
和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\
}
}
几个问题:
也请确认文件夹存在或未添加#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
}
}