Показать полную графическую версию : [решено] Вопрос как работать с тегами/ключевыми словами в файлах jpg ?
dark-------13
29-10-2012, 21:24
А как установить taglib-sharp ?
Foreigner
29-10-2012, 21:57
А как установить taglib-sharp ? »
Распаковать архив, куда удобно. В скрипте подгрузить dll и создать экземпляр taglib:
[void][reflection.assembly]::loadfile("c:\taglib-sharp\taglib-sharp.dll")
$file = gi $args[0]
$tags = [taglib.file]::create($file)
# $tags | gm # посмотреть доступные методы и свойства
$tags.tag.keywords # выдаст "солнце" в твоем случае
Вызывать "script.ps1 .\file.jpg"
dark-------13
29-10-2012, 22:16
Хочу отфильтровать фотки по keywords и не получается делаю так, что я не правильно делаю ? Пробовал ставить так get-image | get-exif | тоже не получается .
import-module image
$in="e:\test\in"
$out="e:\test\out"
$ExifIDKeywords="40094"
Get-ChildItem $in -include *.jpg -Recurse | get-image | Add-exifFilter -passThru -ExifID $ExifIDKeywords -string "робот" | copy-Item -Destination $out
Get-ChildItem $in -include *.jpg -Recurse | Get-Exif | Where {$_.Keywords -eq "робот"} | Foreach {Copy $_.Path -Destination $out}
dark-------13
30-10-2012, 13:10
Спасибо за помощь уважаемые Kazun и Foreigner.
Подскажите пожалуйста, что я делаю неправильно в следующем скрипте:
Как заставить скрипт искать все фотки с заданным параметром exif "небо" и копировать в указанный каталог $dest, с переименованием одинаковых файлов если встретятся ?
Делал и так ? {!$_.path} и вот так ? {$_.path} значение не передается copy-item
import-module image
$Path="c:\test\in"
$dest="c:\test\out"
Get-ChildItem $path -include *.jpg -Recurse | Get-Exif | Where {$_.Keywords -eq "небо"} | ? {!$_.path} | copy-Item -Destination {
$folder = "$dest"
md $folder -Force | Out-Null
$fpath = Join-Path $folder $_.Name
$i = 1
while($true) {
if (Test-Path $fpath) {
$fpath = "{0}\{1}_{2}{3}" -f $folder,$_.basename,$i,$_.extension
$i++
}
else {
$fpath
break
}
}
}
Get-ChildItem $path -include *.jpg -Recurse | Get-Exif | Where {$_.Keywords -eq "небо"} | Foreach {Get-Item $_.path | copy-Item -Destination {
$folder = "$dest"
md $folder -Force | Out-Null
$fpath = Join-Path $folder $_.Name
$i = 1
while($true) {
if (Test-Path $fpath) {
$fpath = "{0}\{1}_{2}{3}" -f $folder,$_.basename,$i,$_.extension
$i++
}
else {
$fpath
break
}
}
}
}
dark-------13
30-10-2012, 20:48
Спасибо за помощь уважаемым Kazun(у), и Foreigner(у) в создании данного скрипта
Почуть переделал часть скрипта {$_.Keywords -eq "небо"}, теперь скрипт выглядит вот так - см. ниже, может быть данный скрипт будет еще кому-то полезным:
#Чтобы скрипт работал нужно скачать и установить модуль ( Image-module powershell ), кратко называется image
#подгружаем установленный модуль командой import-modul
#ДЛЯ СОРТИРОВКИ МОЖНО ИСПОЛЬЗОВАТЬ следующие конструкции Where {($_.Keywords -like "*всп*") -or ($_.Keywords -like "*tot*")}
# Where {($_.Keywords -eq "робот") -or ($_.Keywords -like "total")}
# -or ($_.StarRating -eq "4")}
#если скрипт файлы не переносит значит повторно выполняется команда import-module, а она должна выполняться только один раз после запуска powershell
import-module image
$Path="e:\test\in"
$dest="e:\test\out"
Get-ChildItem $path -include *.jpg -Recurse | Get-Exif | Where {($_.Keywords -like "*стоя*") -or ($_.Keywords -like "*роб*")} | Foreach {Get-Item $_.path | copy-Item -Destination {
$folder = "$dest"
md $folder -Force | Out-Null
$fpath = Join-Path $folder $_.Name
$i = 1
while($true) {
if (Test-Path $fpath) {
$fpath = "{0}\{1}_{2}{3}" -f $folder,$_.basename,$i,$_.extension
$i++
}
else {
$fpath
break
}
}
}
}
dark-------13
30-10-2012, 23:40
Подскажите пожалуйста почему выдается ошибка при обработке некоторых фотографий ?
Get-ExifItem : Не удается обработать преобразование аргументов для параметра "image". Не удается преобразовать значение "G:\pics\2009\3\02[1]__56610.jpg" типа "Sy
stem.String" в тип "System.__ComObject".
C:\Users\User_1\Documents\WindowsPowerShell\Modules\image\Get-exif.ps1:146 знак:31
+ $dt = (get-ExifItem -image <<<< $image -ExifID $ExifIDDateTimeTaken)
+ CategoryInfo : InvalidData: (:) [Get-ExifItem], ParameterBindin...mationException
+ FullyQualifiedErrorId : ParameterArgumentTransformationError,Get-ExifItem
Get-ExifItem : Не удается обработать преобразование аргументов для параметра "image". Не удается преобразовать значение "G:\pics\2009\27\ff_03[1]__49189.jpg" типа "Sy
stem.String" в тип "System.__ComObject".
C:\Users\User_1\Documents\WindowsPowerShell\Modules\image\Get-exif.ps1:142 знак:34
+ $altref = get-ExifItem -image <<<< $image -ExifID $ExifIDGPSAltRef
+ CategoryInfo : InvalidData: (:) [Get-ExifItem], ParameterBindin...mationException
+ FullyQualifiedErrorId : ParameterArgumentTransformationError,Get-ExifItem
Foreigner
31-10-2012, 00:09
Видимо причина в названии файлов -- квадратные скобки. Попробуй добавить -LiteralPath в Get-Childitem.
dark-------13
31-10-2012, 00:27
Не помогло :(
В скрипте Get-Image.ps1 поправьте строчку:
[ValidateScript({Test-path -LiteralPath $_ })][string]$Path)
и
foreach ($file in (resolve-path -LiteralPath $path) ) {
dark-------13
31-10-2012, 17:42
Не помогло, ошибки перестал выдавать, а файл [sun].jpg не переносит :(
Get-ChildItem $path -include *.jpg -Recurse | Get-Exif | Where {($_.Keywords -like "*стоя*") -or ($_.Keywords -like "*роб*")} | Foreach {Get-Item -LiteralPath $_.path | copy-Item -Destination {
$folder = "$dest"
md $folder -Force | Out-Null
$fpath = Join-Path $folder $_.Name
$i = 1
while($true) {
if (Test-Path -LiteralPath $fpath) {
$fpath = "{0}\{1}_{2}{3}" -f $folder,$_.basename,$i,$_.extension
$i++
}
else {
$fpath
break
}
}
}
}
dark-------13
31-10-2012, 20:57
Спасибо вам уважаемый Kazun все заработало
Вот последняя версия скрипта - выкладываю все в одной форме, может пригодится кому
#Чтобы скрипт работал нужно скачать и установить модуль ( Image-module powershell ), кратко называется image
#подгружаем установленный модуль командой import-modul
#ДЛЯ СОРТИРОВКИ МОЖНО ИСПОЛЬЗОВАТЬ следующие конструкции Where {($_.Keywords -like "*всп*") -or ($_.Keywords -like "*tot*")}
# Where {($_.Keywords -eq "робот") -or ($_.Keywords -like "total")}
# -or ($_.StarRating -eq "4")}
#если скрипт файлы не переносит значит повторно выполняется команда import-module, а она должна выполняться только один раз после запуска powershell
#чтобы работать с файлами в названии которых присутствуют символы [ или ] используем второй вариат скрипта и измененный файл Get-Image.ps1 из комплекта Image-module powershell
#в файле Get-Image.ps1 были исправлены следующие строки
# [ValidateScript({Test-path -LiteralPath $_ })][string]$Path)
#
# и
#
# foreach ($file in (resolve-path -LiteralPath $path) ) {
<#
# Вариант 1
import-module image
$Path="e:\test\in"
$dest="e:\test\out"
Get-ChildItem $path -include *.jpg -Recurse | Get-Exif | Where {($_.Keywords -like "*ро*") -or ($_.Keywords -like "*recall*")} | Foreach {Get-Item $_.path | copy-Item -Destination {
$folder = "$dest"
md $folder -Force | Out-Null
$fpath = Join-Path $folder $_.Name
$i = 1
while($true) {
if (Test-Path $fpath) {
$fpath = "{0}\{1}_{2}{3}" -f $folder,$_.basename,$i,$_.extension
$i++
}
else {
$fpath
break
}
}
}
}
#>
# Вариант 2
import-module image
$Path="e:\test\in"
$dest="e:\test\out"
Get-ChildItem $path -include *.jpg -Recurse | Get-Exif | Where {($_.Keywords -like "*стоя*") -or ($_.Keywords -like "*роб*")} | Foreach {Get-Item -LiteralPath $_.path | copy-Item -Destination {
$folder = "$dest"
md $folder -Force | Out-Null
$fpath = Join-Path $folder $_.Name
$i = 1
while($true) {
if (Test-Path -LiteralPath $fpath) {
$fpath = "{0}\{1}_{2}{3}" -f $folder,$_.basename,$i,$_.extension
$i++
}
else {
$fpath
break
}
}
}
}
© OSzone.net 2001-2012
vBulletin v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.