Total Commander Forum Index Total Commander
Форум поддержки пользователей Total Commander
Сайты: Все о Total Commander | Totalcmd.net | Ghisler.com | RU.TCKB
 
 RulesRules   SearchSearch   FAQFAQ   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Single Post  Topic: Копирование фотографий с сортировкой по дате 
Author Message
gre_vit



PostPosted: Mon Jan 25, 2010 00:26    Post subject: Reply with quote

Вот и решил поставленный автором вопрос. Может и коряво, но все же. Решение реализовано на основе моего скрипта из предыдущего поста и примера с получением поля контекстного плагина с помощью wdxtest.exe.
Ну и плюс добавил, на всякий случай обработку, если отсутствует exif-информация в файле (не изображения) - берется дата последней модификации файла.

Кто будет пользоваться: поправьте для себя пути для exif-плагина и wdxtest.exe

Code:

if WScript.Arguments.Count = 0 Then
MsgBox "Не указаны параметры!", vbOKOnly + vbError, "Внимание!"
Wscript.Quit
End If

' определяем регулярное выражение для поиска
' даты снимка из exif данных: в плагине поле Date
Dim re
Set re = New RegExp
re.Global = True
re.IgnoreCase = True
re.MultiLine = False
re.Pattern = "4: Date: .*" ' 4-е поле, возвращаемое плагином

Dim TempFile, FSO, SelFile, wdxtest, wdxplug, WshShell, DateFolder, c, res, n_month, n_day, n_year
Set FSO = CreateObject("Scripting.FileSystemObject")
Set WshShell = CreateObject("WScript.Shell")
Set TempFile = FSO.OpenTextFile(WScript.Arguments(0), 1)

wdxtest="h:\PRG\TotalCommander\Scripts\wdxtest\wdxtest.exe"'путь к wdxtest.exe
wdxplug="h:\PRG\TotalCommander\Plugins\wdx\wdx_exif\Exif.wdx"'путь к Exif плагину

' основной цикл для перебора всех выделенных файлов и переданных в скрипт
Do While Not TempFile.AtEndOfStream
   Set SelFile = FSO.GetFile(TempFile.ReadLine) 'путь к файлу, инфу о котором получаем
' запускаем wdxtext.exe с соответствующими параметрами
   Set res = WshShell.Exec(wdxtest & " " & wdxplug & " " & SelFile)
   c = res.StdOut.ReadAll
   Set field=re.Execute(c)

   FileName = FSO.GetBaseName(SelFile)

' проверка на условие корректного ответа;
' при несоответствии файла критериям плагина (отсутствует EXIF-информация)
' плагин в каждое поле возвращает ошибку, которая начинается с символов --,
' тогда за имя создаваемого каталога берется дата последней модификации файла
' (обычно соотвествует дате создания)
   If InStr(field(0).Value,"--")>0 Then
      DateFolder = Left(SelFile.DateLastModified, 10)
   Else
      DateFolder = Replace(Mid(field(0).Value,10,10),"/",".")
' приведение даты к виду dd.mm.yyyy
      n_year = Left(DateFolder,4)
      n_month = Mid(DateFolder,6,2)
      n_day = Right (DateFolder,2)
      DateFolder = n_day & "." & n_month & "." & n_year
   End If
   FilePath = SelFile.ParentFolder
   If WScript.Arguments.Count > 1 Then
      NewFilePath = WScript.Arguments(1) & DateFolder
   Else
      NewFilePath = FilePath & "\" & DateFolder
   End If
   If Not FSO.FolderExists(NewFilePath) Then
      FSO.CreateFolder(NewFilePath)
   End If
   If Not FSO.FileExists(NewFilePath & "\" & FileName) Then
      FSO.MoveFile SelFile, NewFilePath & "\"
   Else
      MsgBox "Уже существует файл " & FileName & " в папке " & NewFilePath, vbOKOnly + vbExclamation, "Внимание!"
   End If
Loop


В данном случае я использую 4-е поле Date контекстного плагина exif.wdx. Вообще можно переделать под любое поле с датой.
Достаточно в строке
Code:
re.Pattern = "4: Date: .*"

Поменять 4: Date: на название соответствующего поля. Сами поля, возвращаемые плагином (для примера) :

0: Width: 1024
1: Height: 768
2: Colordepth: -- ft_fieldempty: Field valid, but empty
3: DateTimeStr: '2008:11:30 22:12:17'
4: Date: 2008/11/30
5: Time: 22:12:17
6: DateOriginal: 2008/11/30
7: TimeOriginal: 22:12:17
8: DateDigitized: 2008/11/30
9: TimeDigitized: 22:12:17
10: ComponentsConfiguration: 'YCbCr'
11: CompressedBitsPerPixel: 5
12: ExifVersion: '0220'
13: ExposureBiasValue: 0
14: ExposureProgram: -- ft_fieldempty: Field valid, but empty
15: ExposureTimeFraction: '1/40'
16: ExposureTimeNr: 0.025
17: Flash: forced off
18: FNumber: 2.8
19: FocalLength: 5.8
20: ISO: 800
21: LightSource: -- ft_fieldempty: Field valid, but empty
22: Make: 'Canon'
23: ApertureValue: '2.8'
24: MaxApertureValue: '2.8'
25: MeteringMode: multi-segment
26: Model: 'Canon PowerShot A720 IS'
27: Orientation: Top left
View user's profile Send private message


Powered by phpBB © 2001, 2005 phpBB Group