gre_vit
|
Posted: Mon Jan 25, 2010 00:26 Post subject: |
|
|
Вот и решил поставленный автором вопрос. Может и коряво, но все же. Решение реализовано на основе моего скрипта из предыдущего поста и примера с получением поля контекстного плагина с помощью 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 |
|