Компьютерный форум OSzone.net  

Компьютерный форум OSzone.net (http://forum.oszone.net/index.php)
-   Скриптовые языки администрирования Windows (http://forum.oszone.net/forumdisplay.php?f=102)
-   -   [решено] Дата съемки (http://forum.oszone.net/showthread.php?t=319686)

Elven 12-10-2016 12:32 2677336

Дата съемки
 
Вложений: 1
Возникло желание массово переименовать фотографии в соответствии с временем съемки оных, однако, выдрать этот параметр в какую-нибудь переменную я не нашел возможности. Было бы проще если он совпадал с датой создания или изменения или последнего обращения, но нет, эта дата совершенно независима от тех. Короче, нужно получить из файла дату съемки и переименовать по этой дате файл.

Kazun 12-10-2016 12:39 2677338

Код:

add-type -AssemblyName System.Drawing
$file = New-Object System.Drawing.Bitmap("123.JPG")
[System.Text.Encoding]::ASCII.GetString($file.GetPropertyItem(36867).Value)


Elven 12-10-2016 13:08 2677348

Код:

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


Kazun 12-10-2016 13:37 2677362

Так укажите полный путь к файлу с фотографией.

Iska 12-10-2016 13:42 2677364

Elven, посмотрите в любом редакторе, есть ли в данном изображении Exif, и есть ли в нём дата съёмки. Полагаю, что нет. Пардон, в свойствах файла у Вас указана…

Elven 12-10-2016 14:48 2677386

Kazun, спасибо, стало понятнее. Просто запускал скрипт из папки где находился файл, полагал имени будет достаточно.

Elven 12-10-2016 15:36 2677408

Теперь возник другой вопрос, наверное, глупый, но сходу как его решить я что-то не пойму: как изменить формат выводимой даты? выводится что-то вроде 2014:07:27 11:27:49 , а нужно 20140727 11_27_49. Или это просто так не решается и нужно строку потрошить?

Kazun 12-10-2016 15:45 2677414

Код:

PS (STA) >  [datetime]::ParseExact("2014:07:27 11:27:49","yyyy:MM:dd HH:mm:ss",$Null).ToString('yyyyMM dd_HHmmss')
201407 27_112749


Elven 12-10-2016 15:53 2677417

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


Kazun 12-10-2016 16:10 2677423

Код:

[datetime]::ParseExact($pdate,"yyyy:MM:dd HH:mm:ss`0",$Null).ToString('yyyyMM dd_HHmmss')

Elven 12-10-2016 16:12 2677424

Супер, самое то что нужно. А можно пояснить что это за `0 и почему он нужен?

Elven 12-10-2016 16:57 2677435

Полагал, что переименование в таком скрипте будет самым простым делом, но похоже рано возрадовался:
Код:

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


Kazun 12-10-2016 16:58 2677437

Перед переименованием:
Код:

$file.Dispose()

Elven 12-10-2016 17:11 2677438

Вот теперь все супер. Финальная версия:
Код:

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)
}


Iska 12-10-2016 21:13 2677491

Цитата:

Цитата Elven
Финальная версия: »

Неа ;). Финальная будет тогда, когда Вы начнёте учитывать возможность наличия одинакового даты/времения в Exif у нескольких файлов.

Elven 13-10-2016 12:14 2677677

Iska, для конкретно этой задачи это финальная версия, здесь одинаковой даты-времени не было, так уж получилось, что это было известно заранее.
А может кто-нибудь объяснит, все же, что это за `0?

Kazun 13-10-2016 12:29 2677681

0x0132 DateTime ascii string 20 Date/Time of image . Data format is "YYYY:MM:DD HH:MM:SS"+0x00, total 20bytes.


Время: 17:10.

Время: 17:10.
© OSzone.net 2001-