Advertisement
muc-izhnet

EXIF-renametoDTO-FMD.cmd

May 26th, 2016
377
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. @echo off
  2. rem Froz 14.02.2016
  3. set ex="%~dp0bin\exiv2.exe"
  4. if not exist %ex% echo Для работы скрипта необходим %ex% и libexpat.dll & pause & goto e
  5. set extag=Exif.Photo.DateTimeOriginal
  6. if -%1==- goto hlp
  7. title Переименование файлов в формат "ГГГГ-ММ-ДД_имя.ext"...
  8. set counter=0
  9. set dtoall=0
  10. set nodto=0
  11. echo.
  12.  
  13. :getfile
  14. if -%1==- goto e
  15. set atr=%~a1
  16. set datr=%atr:~0,1%
  17. if /I "%datr%"=="d" goto folder
  18. call :work %1
  19. goto shft
  20.  
  21. :folder
  22. echo.
  23. echo Обрабатываем папку "%~n1" с подпапками:
  24. echo ----------------------------------------------------------------
  25. for /r %1 %%i in (*) do call :work "%%i"
  26. goto shft
  27.  
  28. :shft
  29. shift /1
  30. goto getfile
  31.  
  32. :work
  33. set fskip=0
  34. set dto=
  35. set ymd=
  36. if -%~x1==- echo "%~nx1" - без расширения, пропускаем. & exit/b
  37. if not exist %1 echo "%~nx1" отсутствует, пропускаем. & exit/b
  38. if /i %~x1==.jpg (call :jpgchk %1) else call :extractfmd %1
  39. if %fskip%==1 echo Дата не введена, "%~nx1" пропущен. & exit/b
  40. rem Check if rename done before and YYYYMMDD_ (Samsung phone) name
  41. for %%n in (%1) do set nm=%%~nn
  42. set ynm=%nm:~0,4%
  43. set mnm=%nm:~5,2%
  44. set dnm=%nm:~8,2%
  45. set solidmm=%nm:~4,2%
  46. set soliddd=%nm:~6,2%
  47. for %%x in (%1) do set nx=%%~nxx
  48. set sldnmtail=%nx:~8%
  49. set nameymd=%ynm%-%mnm%-%dnm%
  50. set sldnmymd=%ynm%-%solidmm%-%soliddd%
  51. if "%ymd%"=="%nameymd%" echo "%~nx1" обработан ранее, пропускаем.& exit/b
  52. if "%ymd%"=="%sldnmymd%" (
  53.   ren %1 "%sldnmymd%%sldnmtail%"
  54.   set/a counter=%counter%+1
  55.   echo "%~nx1" -^> "%sldnmymd%%sldnmtail%"
  56.   exit/b
  57. )
  58. ren %1 "%ymd%_%~nx1"
  59. set/a counter=%counter%+1
  60. echo "%~nx1" -^> "%ymd%_%~nx1"
  61. exit/b
  62.  
  63. :extractfmd
  64. rem Extract FileModifyDate
  65. for %%f in (%1) do set dt=%%~tf
  66. set d=%dt:~0,2%
  67. set m=%dt:~3,2%
  68. set y=%dt:~6,4%
  69. set ymd=%y%-%m%-%d%
  70. exit/b
  71.  
  72. :jpgchk
  73. rem Check if file contains ')' and temporary rename them to '_'
  74. set fn=%~nx1
  75. set tmpn=$tmp$%fn:)=_%
  76. if "%tmpn%"=="$tmp$%~nx1" (call :grepdto %1) else (
  77.   rem Rename source file name to tempname
  78.   ren %1 "%tmpn%"
  79.   call :grepdto "%tmpn%"
  80.   ren "%~dp1%tmpn%" "%~nx1%"
  81.   )
  82. rem If DateTimeOriginal tag not found
  83. if %nodto%==1 call :grepdlm %1
  84. exit/b
  85.  
  86. :grepdto
  87. rem Extract JPEG DateTimeOriginal EXIF tag:
  88. pushd "%~dp1"
  89. for /f "tokens=1" %%e in ('"%ex% -q -g %extag% -Pv %1"') do set dto=%%e
  90. popd
  91. if -%dto%==- (set nodto=1) else call :grepdtosets
  92. exit/b
  93.  
  94. :grepdtosets
  95. set y=%dto:~0,4%
  96. set m=%dto:~5,2%
  97. set d=%dto:~8,2%
  98. set ymd=%y%-%m%-%d%
  99. exit/b
  100.  
  101. :grepdlm
  102. rem Extract DateLastModified system tag
  103. set tv="%temp%\$%~n1$.vbs"
  104. set tv2="%temp%\$%~n1$.txt"
  105. echo Wscript.Echo CreateObject("Scripting.FileSystemObject").GetFile(WScript.Arguments.Item(0)).DateLastModified>%tv%
  106. pushd "%~dp1"
  107. for /f "delims=" %%t in ('"cscript //nologo %tv% "%~nx1""') do set dt=%%t
  108. popd
  109. del %tv%
  110. echo %dt%>%tv2%
  111. for %%a in (%tv2%) do set dlmsize=%%~za
  112. del %tv2%
  113. rem Check if file creation time is 'before 10 hours (one-digit hour)':
  114. if %dlmsize%==20 (call :earlybird) else call :dlmsets
  115. set fdto=%y%-%m%-%d% %hh%:%mm%:%ss%
  116. if %dtoall%==0 (call :inputdto) else set dto=%fdto%
  117. if %fskip%==1 exit/b
  118. %ex% -k -M"add %extag% %dto%" %1
  119. echo Тег %extag%=%dto% добавлен.
  120. set nodto=0
  121. call :grepdtosets
  122. exit/b
  123.  
  124. :earlybird
  125. rem If file creation time is 'before 10 hours':
  126. set d=%dt:~0,2%
  127. set m=%dt:~3,2%
  128. set y=%dt:~6,4%
  129. set hhe=%dt:~11,1%
  130. set hh=0%hhe%
  131. set mm=%dt:~13,2%
  132. set ss=%dt:~16,2%
  133. exit /b
  134.  
  135. :dlmsets
  136. rem Sets for DateLastModified system tag
  137. set d=%dt:~0,2%
  138. set m=%dt:~3,2%
  139. set y=%dt:~6,4%
  140. set hh=%dt:~11,2%
  141. set mm=%dt:~14,2%
  142. set ss=%dt:~17,2%
  143. exit /b
  144.  
  145. :inputdto
  146. rem Hand input of EXIF DateTimeOriginal tag:
  147. echo ---
  148. echo "%~nx1": не найден тэг %extag% (DTO)
  149. echo Создадим вручную / применим FileModifyDate (FMD) / пропустим файл(ы).
  150. echo Время последнего изменения файла: %fdto%
  151. echo.
  152. echo Введите добавляемую в EXIF дату в формате ГГГГ-ММ-ДД ЧЧ:ММ:СС
  153. echo Либо: "f" для записи FMD в DTO, Enter для пропуска файла,
  154. echo "fa" для записи FMD в DTO во все .jpg-файлы без DTO.
  155. set /p dto=
  156. if -"%dto%"==-"" set fskip=1 & exit/b
  157. if -"%dto%"==-"f" set dto=%fdto% & echo Записываем FMD в DTO.
  158. if -"%dto%"==-"fa" set dto=%fdto% & set dtoall=1 & echo Записываем FMD в DTO во все .jpg-файлы.
  159. exit/b
  160.  
  161. :hlp
  162. rem Helpfile text
  163. set msg="Задайте файлы/папки через пробел для переименования файлов в формат 'ГГГГ-ММ-ДД_имя.ext' (FileModifyDate), для JPG берётся %extag% (exiv2)."
  164. set h="%~dp0bin\hlpexif"
  165. set hv="%temp%\$%~n0-hlp$.vbs"
  166. chcp 1251 >nul
  167. echo MsgBox CreateObject("Scripting.FileSystemObject").OpenTextFile(%h%).ReadAll^&vbCrLf^&vbCrLf^&"'%~nx0':"^&vbCrLf^&%msg%,,"%~nx0">%hv%
  168. chcp 866 >nul
  169. %hv% & del %hv%
  170. goto eof
  171.  
  172. :e
  173. echo.
  174. echo Переименовано %counter% файл(ов).
  175. pause
  176.  
  177. :eof
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement