Дата съемки
Вложений: 1
Возникло желание массово переименовать фотографии в соответствии с временем съемки оных, однако, выдрать этот параметр в какую-нибудь переменную я не нашел возможности. Было бы проще если он совпадал с датой создания или изменения или последнего обращения, но нет, эта дата совершенно независима от тех. Короче, нужно получить из файла дату съемки и переименовать по этой дате файл.
|
Код:
add-type -AssemblyName System.Drawing
$file = New-Object System.Drawing.Bitmap("123.JPG")
[System.Text.Encoding]::ASCII.GetString($file.GetPropertyItem(36867).Value)
|
Код:
PS D:\!test> add-type -AssemblyName System.Drawing
$file = New-Object System.Drawing.Bitmap("123.JPG")
[System.Text.Encoding]::ASCII.GetString($file.GetPropertyItem(36867).Value)
New-Object : Исключение при вызове ".ctor" с "1" аргументами: "Недопустимый параметр."
строка:2 знак:19
+ $file = New-Object <<<< System.Drawing.Bitmap("123.JPG")
+ CategoryInfo : InvalidOperation: (:) [New-Object], MethodInvocationException
+ FullyQualifiedErrorId : ConstructorInvokedThrowException,Microsoft.PowerShell.Commands.NewObjectCommand
Нельзя вызвать метод для выражения со значением NULL.
строка:3 знак:62
+ [System.Text.Encoding]::ASCII.GetString($file.GetPropertyItem <<<< (36867).Value)
+ CategoryInfo : InvalidOperation: (GetPropertyItem:String) [], RuntimeException
+ FullyQualifiedErrorId : InvokeMethodOnNull
|
Так укажите полный путь к файлу с фотографией.
|
Elven, посмотрите в любом редакторе, есть ли в данном изображении Exif, и есть ли в нём дата съёмки. Полагаю, что нет. Пардон, в свойствах файла у Вас указана…
|
Kazun, спасибо, стало понятнее. Просто запускал скрипт из папки где находился файл, полагал имени будет достаточно.
|
Теперь возник другой вопрос, наверное, глупый, но сходу как его решить я что-то не пойму: как изменить формат выводимой даты? выводится что-то вроде 2014:07:27 11:27:49 , а нужно 20140727 11_27_49. Или это просто так не решается и нужно строку потрошить?
|
Код:
PS (STA) > [datetime]::ParseExact("2014:07:27 11:27:49","yyyy:MM:dd HH:mm:ss",$Null).ToString('yyyyMM dd_HHmmss')
201407 27_112749
|
Kazun, аналогичным способом пробовал, но что-то я видно делаю не так:
Код:
add-type -AssemblyName System.Drawing
Get-ChildItem d:\test\*.jpg | ForEach-Object {
$file = New-Object System.Drawing.Bitmap($_.FullName)
$pdate = [System.Text.Encoding]::ASCII.GetString($file.GetPropertyItem(36867).Value)
[datetime]::ParseExact($pdate,"yyyy:MM:dd HH:mm:ss",$null).ToString('yyyyMMdd HH_mm_ss')
}
получаю такую ошибку
Код:
Исключение при вызове "ParseExact" с "3" аргументами: "Строка не распознана как действительное значение DateTime."
строка:5 знак:23
+ [datetime]::ParseExact <<<< ($pdate,"yyyy:MM:dd HH:mm:ss",$null).ToString('yyyyMMdd HH_mm_ss')
+ CategoryInfo : NotSpecified: (:) [], MethodInvocationException
+ FullyQualifiedErrorId : DotNetMethodException
|
Код:
[datetime]::ParseExact($pdate,"yyyy:MM:dd HH:mm:ss`0",$Null).ToString('yyyyMM dd_HHmmss')
|
Супер, самое то что нужно. А можно пояснить что это за `0 и почему он нужен?
|
Полагал, что переименование в таком скрипте будет самым простым делом, но похоже рано возрадовался:
Код:
add-type -AssemblyName System.Drawing
Get-ChildItem d:\test\*.jpg | ForEach-Object {
$file = New-Object System.Drawing.Bitmap($_.FullName)
$pdate = [System.Text.Encoding]::ASCII.GetString($file.GetPropertyItem(36867).Value)
$nfname = [datetime]::ParseExact($pdate,"yyyy:MM:dd HH:mm:ss`0",$null).ToString('yyyyMMdd HH_mm_ss')
Rename-Item -Path $_.FullName -NewName ($nfname + $_.Extension)
}
Либо я опять что-то делаю не так, либо скрипт цепляется за файл, ибо:
Код:
Rename-Item : Процесс не может получить доступ к файлу, так как этот файл занят другим процессом.
строка:6 знак:12
+ Rename-Item <<<< -Path $_.FullName -NewName ($nfname + $_.Extension)
+ CategoryInfo : WriteError: (D:\test\888601.jpg:String) [Rename-Item], IOException
+ FullyQualifiedErrorId : RenameItemIOError,Microsoft.PowerShell.Commands.RenameItemCommand
|
Вот теперь все супер. Финальная версия:
Код:
add-type -AssemblyName System.Drawing
Get-ChildItem d:\test\*.jpg | ForEach-Object {
$file = New-Object System.Drawing.Bitmap($_.FullName)
$pdate = [System.Text.Encoding]::ASCII.GetString($file.GetPropertyItem(36867).Value)
$npname = [datetime]::ParseExact($pdate,"yyyy:MM:dd HH:mm:ss`0",$null).ToString('yyyyMMdd HH_mm_ss')
$file.Dispose()
Rename-Item -Path $_.FullName -NewName ($npname + $_.Extension)
}
|
Неа ;). Финальная будет тогда, когда Вы начнёте учитывать возможность наличия одинакового даты/времения в Exif у нескольких файлов.
|
Iska, для конкретно этой задачи это финальная версия, здесь одинаковой даты-времени не было, так уж получилось, что это было известно заранее.
А может кто-нибудь объяснит, все же, что это за `0?
|
0x0132 DateTime ascii string 20 Date/Time of image . Data format is "YYYY:MM:DD HH:MM:SS"+0x00, total 20bytes.
|
Время: 17:10.
© OSzone.net 2001-