在 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
.
您的子字符串调用得到的字符太少了。参数为 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\
}
}
几个问题:
- 检索文件名时名称的子字符串,删除了该代码
- 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
}
}
我使用 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
.
您的子字符串调用得到的字符太少了。参数为 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\
}
}
几个问题:
- 检索文件名时名称的子字符串,删除了该代码
- 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
}
}