| 
 | 
 
  最近相机里的照片比较多,一般是连拍了好几天之后,才把相机里的照片一股脑放到硬盘里,并且是隔上一两个星期才整理一次。日子一长,照片就多了起来,都分不清是什么时候拍的了。网上搜索了很久,找到一款名为PhotosTool的软件,可以按拍摄日期来整理照片,正合我意,只可惜,这个不到1M的小软件,居然要另外安装20余M的.NET 2.0,一气之下,用P写了一个类似功能的脚本,发出来大家玩玩。- :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
 
 - :: 作者: namejm
 
 - :: 出处: bbs.bathome.cn
 
 - :: 编写日期: 2007-10-29~2008-9-3
 
 - :: 测试环境: CMD@WinXP SP2
 
 - :: 功能:按照exif信息归类照片
 
 - :: 详细介绍:
 
 - ::   本脚本通过获取jpg照片的exif信息归类图片,具备按照分辨率大小和日期两种
 
 - :: 方式归类,并自动重命名同名文件,同时统计已经处理的照片数量。另外,可以选
 
 - :: 择使用如下功能:
 
 - ::   1、批量修正当前目录下及所有子目录中jpg照片的修改日期为拍摄日期;
 
 - ::   2、能把所有子目录里的图片移动到父目录下并删除父目录下的所有空目录。
 
 - :: 注意:
 
 - ::   本脚本会读取照片的exif信息,在按日期整理照片时,自动修正照片的修改时间
 
 - :: 为照片的拍摄时间,时间精确到秒;没有exif信息的jpg图片,修改时间保持不变。
 
 - :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
 
 - @echo off
 
 - mode con lines=30
 
 - set TT=照片整理器1.4
 
 - color 1f
 
  
- :source
 
 - title %TT%     当前目录:"%cd%"
 
 - cls
 
 - echo                             ╭─────────╮
 
 - echo           ╭────────┤选择要整理的文件夹├─────────╮
 
 - echo           │                ╰─────────╯                  │
 
 - echo           │                                                        │
 
 - echo           │         本程序能把指定路径下的jpg格式照片按照分辨率    │
 
 - echo           │                                                        │
 
 - echo           │    大小或者拍摄日期整理到如下格式的文件夹中:          │
 
 - echo           │                                                        │
 
 - echo           │        1 分辨率大小 (如 800×600)                    │
 
 - echo           │                                                        │
 
 - echo           │      2 年-月-日(如 2007-01-01)                     │
 
 - echo           │                                                        │
 
 - echo           │        3 月\日期(如 01\2007-01-01)                   │
 
 - echo           │                                                        │
 
 - echo           │        4 年\日期(如 2007\2007-01-01)                 │
 
 - echo           │                                                        │
 
 - echo           │        5 年\月\日期 (如 2007\01\2007-01-01)          │
 
 - echo           │                                                        │
 
 - echo           │      注意:本脚本在按照日期归类照片时,会自动修正    │
 
 - echo           │                                                        │
 
 - echo           │    照片的创建时间为照片exif信息中的拍摄时间,精确到    │
 
 - echo           │                                                        │
 
 - echo           │    秒。没有exif信息的jpg图片,修改时间保持不变。       │
 
 - echo           │                                                        │
 
 - echo           ╰────────────────────────────╯
 
 - echo.
 
 - echo            处理当前目录请直接回车                          退出请按 0
 
 - echo           ──────────────────────────────
 
 - set Source=
 
 - set /p Source=              请把要处理的文件夹拖曳到本窗口:
 
 - if not defined Source set "Source=%cd%"
 
 - set "Source=%Source:"=%"
 
 - if "%Source%"=="0" exit
 
 - if not exist "%Source%" goto source
 
 - echo "%Source%"|find ":">nul 2>nul||set "Source=%cd%\%Source%"
 
 - title %TT%     正在处理目录:"%Source:"=%"
 
  
- :fixtime
 
 - cls
 
 - echo                             ╭─────────╮
 
 - echo           ╭────────┤修正照片的修改日期├─────────╮
 
 - echo           │                ╰─────────╯                  │
 
 - echo           │                                                        │
 
 - echo           │         照片的拍摄时间包含在exif信息中,反映在原始     │
 
 - echo           │                                                        │
 
 - echo           │    照片文件中,就是照片的修改时间。                    │
 
 - echo           │                                                        │
 
 - echo           │      很不幸的是,照片的修改时间有时候并不是和exif    │
 
 - echo           │                                                        │
 
 - echo           │    信息中的拍摄时间完全吻合,比如:照片被编辑后、数    │
 
 - echo           │                                                        │
 
 - echo           │    据恢复后等等,从而导致在查看照片的修改时间时,难    │
 
 - echo           │                                                        │
 
 - echo           │    以判定照片的拍摄时间,在一些需要按照拍摄时间把资    │
 
 - echo           │                                                        │
 
 - echo           │    料归档的场合,这样的情形无疑是一种灾难。            │
 
 - echo           │                                                        │
 
 - echo           │      本功能可以把指定目录及其所有子目录下的照片修    │
 
 - echo           │                                                        │
 
 - echo           │    改时间重新设置为照片的拍摄时间——只要照片的exif    │
 
 - echo           │                                                        │
 
 - echo           │    信息没有被破坏掉。                                  │
 
 - echo           │                                                        │
 
 - echo           ╰────────────────────────────╯
 
 - echo.
 
 - echo            返回上一步请按 1                               退出请按 0
 
 - echo           ──────────────────────────────
 
 - set FixTime=
 
 - set /p FixTime=   是否修正照片的修改时间为拍摄时间(是=Y 否=其他任意键):
 
 - if not defined FixTime goto movesub
 
 - set "FixTime=%FixTime:"=%"
 
 - if "%FixTime%"=="0" exit
 
 - if "%FixTime%"=="1" goto source
 
 - if /i "%FixTime%"=="y" (
 
 -     jhead -ft "%Source%\*.jpg">nul 2>nul
 
 -     for /f "delims=" %%i in ('dir /ad /b /s "%Source%" 2^>nul') do (
 
 -         jhead -ft "%%i\*.jpg">nul 2>nul
 
 -         title %TT%     正在处理目录:"%%i"
 
 -     )
 
 - )
 
  
- :movesub
 
 - cls
 
 - echo.&echo.&echo.
 
 - echo                             ╭─────────╮
 
 - echo           ╭────────┤   预处理子目录   ├─────────╮
 
 - echo           │                ╰─────────╯                  │
 
 - echo           │                                                        │
 
 - echo           │         如果当前目录的子目录中存在照片,而你需要把     │
 
 - echo           │                                                        │
 
 - echo           │    它们都放到父目录下,并删除父目录及其所有子目录下    │
 
 - echo           │                                                        │
 
 - echo           │    的空文件夹,那么,这个功能将是非常有用的。          │
 
 - echo           │                                                        │
 
 - echo           │      注意:此处的空文件夹是指删除父目录及其所有子    │
 
 - echo           │                                                        │
 
 - echo           │    目录下的Thumbs.db和*.ctg文件后形成的空文件夹,以    │
 
 - echo           │                                                        │
 
 - echo           │    及原本就存在的空文件夹。                            │
 
 - echo           │                                                        │
 
 - echo           ╰────────────────────────────╯
 
 - echo.
 
 - echo            返回上一步请按 1                                退出请按 0
 
 - echo           ──────────────────────────────
 
 - echo. 
 
 - set MoveSub=
 
 - set /p MoveSub=            是否把照片移动到父目录下并删除空目录(是=Y 否=N):
 
 - if not defined MoveSub goto movesub
 
 - set "MoveSub=%MoveSub:"=%"
 
 - if not defined MoveSub goto movesub
 
 - if "%MoveSub%"=="0" exit
 
 - if "%MoveSub%"=="1" goto source
 
 - if /i "%MoveSub%"=="y" (
 
 -     set num=0
 
 -     set WhetherMove=M
 
 -     for /f "delims=" %%i in ('dir /ad /b /s "%Source%" 2^>nul') do (
 
 -         for /f "delims=" %%j in ('dir /a-d /b /s "%%i\*.jpg" 2^>nul') do (
 
 -             set route=&set postfix=
 
 -             setlocal enabledelayedexpansion
 
 -             call :re_name "%%j" "%Source%" "%%~nj"
 
 -             move "%%j" "!Destination_1!">nul 2>nul
 
 -             endlocal
 
 -             set /a num+=1
 
 -         )
 
 -         title %TT%     正在处理文件:"%%i"
 
 -     )
 
 -     del /a /f /q /s "%Source%\Thumbs.db">nul 2>nul
 
 -     del /a /f /q /s "%Source%\*.ctg">nul 2>nul
 
 -     for /f "delims=" %%i in ('dir /ad /b /s "%Source%"^|sort /r') do (
 
 -         rd /q "%%i" 2>nul&title %TT%     处理文件:"%%i"
 
 -     )
 
 -     title %TT%     正在处理的目录:"%Source%"
 
 -     echo.&call echo                 共处理了 %%num%% 张照片,按任意键继续...
 
 -     pause>nul
 
 - ) else if /i not "%MoveSub%"=="n" goto movesub
 
  
- :whethermove
 
 - cls
 
 - echo.
 
 - echo                             ╭─────────╮
 
 - echo           ╭────────┤   照片处理方式   ├─────────╮
 
 - echo           │                ╰─────────╯                  │
 
 - echo           │                                                        │
 
 - echo           │         如果不想删除要处理文件夹下的照片,请选择复     │
 
 - echo           │                                                        │
 
 - echo           │    制功能;如果不保留原有的照片,请选择移动文件。      │
 
 - echo           │                                                        │
 
 - echo           │      注意:移动文件后,将会删除父目录下的所有空文    │
 
 - echo           │                                                        │
 
 - echo           │    件夹。此处的空文件夹是指删除父目录及其所有子目录    │
 
 - echo           │                                                        │
 
 - echo           │    下的Thumbs.db和*.ctg文件后形成的空文件夹,以及原    │
 
 - echo           │                                                        │
 
 - echo           │    本就存在的空文件夹。                                │
 
 - echo           │                                                        │
 
 - echo           │        另:同名文件将作重命名处理,具体方式为:在文    │
 
 - echo           │                                                        │
 
 - echo           │    件名后添加 -序号 。比如重命名为 abc-1.jpg          │
 
 - echo           │                                                        │
 
 - echo           ╰────────────────────────────╯
 
 - echo.
 
 - echo            返回上一步请按 1                                退出请按 0
 
 - echo           ──────────────────────────────
 
 - echo. 
 
 - set WhetherMove=
 
 - set /p WhetherMove=                   移动文件还是复制文件(移动=M  复制=C):
 
 - if not defined WhetherMove goto whethermove
 
 - set "WhetherMove=%WhetherMove:"=%"
 
 - if "%WhetherMove%"=="0" exit
 
 - if "%WhetherMove%"=="1" goto movesub
 
 - set flag=
 
 - if /i "%WhetherMove%"=="M" set flag=1
 
 - if /i "%WhetherMove%"=="C" set flag=1
 
 - if not defined flag goto whethermove
 
 - if /i "%MoveSub%"=="y" goto destination
 
  
- :whethersub
 
 - echo.
 
 - set WhetherSub=
 
 - set /p WhetherSub=                   是否处理子目录(是=Y 否=N):
 
 - if not defined WhetherSub goto whethersub
 
 - set "WhetherSub=%WhetherSub:"=%"
 
 - if /i "%WhetherSub%"=="0" exit
 
 - if /i "%WhetherSub%"=="1" goto whethermove
 
 - if /i "%WhetherSub%"=="y" (
 
 -     set WhetherSub=/s
 
 -     goto destination
 
 - )
 
 - if /i "%WhetherSub%"=="n" (
 
 -     set WhetherSub=
 
 -     goto destination
 
 - )
 
 - goto whethersub
 
  
- :destination
 
 - echo.
 
 - title %TT%     程序所在目录:"%cd%"
 
 - set Destination=
 
 - set /p Destination=          请输入保存路径(保存在程序所在目录下请直接回车):
 
 - if not defined Destination set "Destination=%cd%"
 
 - set "Destination=%Destination:"=%"
 
 - if "%Destination%"=="0" exit
 
 - if "%Destination%"=="1" goto whethermove
 
 - echo "%Destination%"|find ":">nul 2>nul||set "Destination=%cd%\%Destination%"
 
 - echo "%Destination%"|find /i "%Source%">nul 2>nul&&(
 
 -     cls
 
 -     for /l %%i in (1,1,7) do echo.
 
 -     echo      为了不重复处理照片,不允许把保存路径设置到源文件所在目录下
 
 -     echo.&echo                            请重新设置保存路径
 
 -     echo.&echo.
 
 -     goto destination
 
 - )
 
 - md "%Destination%" 2>nul
 
  
- :wise
 
 - cls
 
 - echo.&echo.&echo.&echo.&echo.
 
 - echo                               ╭────────╮
 
 - echo           ╭─────────┤  选择整理方式  ├─────────╮
 
 - echo           │                  ╰────────╯                  │
 
 - echo           │                                                        │
 
 - echo           │         有两种整理方式可供选择:                       │
 
 - echo           │                                                        │
 
 - echo           │         a  按文件尺寸整理 (如800×600)               │
 
 - echo           │                                                        │
 
 - echo           │         b  按照拍摄日期整理(如2008-01-01)            │
 
 - echo           │                                                        │
 
 - echo           ╰────────────────────────────╯
 
 - echo.
 
 - echo            返回上一步请按 1                                退出请按 0
 
 - echo           ──────────────────────────────
 
 - echo.
 
 - set Wise=
 
 - set /p Wise=                                 请选择(a/b):
 
 - if not defined Wise goto wise
 
 - set "Wise=%Wise:"=%"
 
 - if not defined Wise goto wise
 
 - if "%Wise%"=="0" exit
 
 - if "%Wise%"=="1" goto whethermove
 
 - if /i "%Wise%"=="a" goto folders_dimesion
 
 - if /i "%Wise%"=="b" goto folders_date
 
 - goto wise
 
  
- :folders_dimesion
 
 - cls
 
 - for /l %%i in (1,1,10) do echo.
 
 - echo                                正在处理中,请稍候...
 
 - set num=0
 
 - call :dimesion "%Source%"
 
 - if defined WhetherSub (
 
 -     for /f "delims=" %%i in ('dir /ad /b /s "%Source%" 2^>nul') do call :dimesion "%%i"
 
 - )
 
 - call :del_blank
 
 - pause>nul&goto source
 
  
- :folders_date
 
 - cls
 
 - echo.&echo.&echo.
 
 - echo                             ╭─────────╮
 
 - echo           ╭────────┤  选择目录树格式  ├─────────╮
 
 - echo           │                ╰─────────╯                  │
 
 - echo           │                                                        │
 
 - echo           │         在保存路径下,将建立以照片拍摄日期为名的文     │
 
 - echo           │                                                        │
 
 - echo           │    件夹,这些文件夹的目录树结构如下:                  │
 
 - echo           │                                                        │
 
 - echo           │      a 年-月-日(如 2007-01-01)                     │
 
 - echo           │                                                        │
 
 - echo           │        b 月\日期(如 01\2007-01-01)                   │
 
 - echo           │                                                        │
 
 - echo           │        c 年\日期(如 2007\2007-01-01)                 │
 
 - echo           │                                                        │
 
 - echo           │        d 年\月\日期 (如 2007\01\2007-01-01)          │
 
 - echo           │                                                        │
 
 - echo           ╰────────────────────────────╯
 
 - echo.
 
 - echo            返回上一步请按 1                                退出请按 0
 
 - echo           ──────────────────────────────
 
 - echo.
 
 - set FoldersTree=
 
 - set /p  FoldersTree=                                 请选择(a/b/c/d):
 
 - if not defined FoldersTree goto folders_date
 
 - set "FoldersTree=%FoldersTree:"=%"
 
 - if "%FoldersTree%"=="0" exit
 
 - if "%FoldersTree%"=="1" goto whethermove
 
 - set choice=
 
 - for %%i in (a b c) do if /i "%FoldersTree%"=="%%i" set choice=1
 
 - if not defined choice goto folders_date
 
 - cls
 
 - for /l %%i in (1,1,10) do echo.
 
 - echo                                正在处理中,请稍候...
 
 - set num=0
 
 - for /f "delims=" %%i in ('dir /a-d /b %WhetherSub% "%Source%\*.jpg" 2^>nul') do (
 
 -     set /a num+=1
 
 -     jhead -ft "%%i">nul 2>nul
 
 -     if defined WhetherSub (
 
 -         for /f "delims=" %%j in ("%%i") do (
 
 -             set str=%%~tj
 
 -             set route=&set postfix=
 
 -             setlocal enabledelayedexpansion
 
 -             set str=!str:~0,10!
 
 -             set Y=!str:~0,4!&set M=!str:~5,2!&set D=!str:~8,2!
 
 -             if /i "%FoldersTree%"=="a" set Y=&set M=
 
 -             if /i "%FoldersTree%"=="b" set Y=
 
 -             if /i "%FoldersTree%"=="c" set M=
 
 -             md "%Destination%\!Y!\!M!\!str!" 2>nul
 
 -             if /i "%WhetherMove%"=="M" (
 
 -                 call :re_name "%Source%\%%i" "%Destination%\!Y!\!M!\!str!" "%%~ni"
 
 -                 move "%%j" "!Destination_1!">nul 2>nul
 
 -             ) else (
 
 -                 call :re_name "%Source%\%%i" "%Destination%\!Y!\!M!\!str!" "%%~ni"
 
 -                 copy "%%j" "!Destination_1!">nul 2>nul
 
 -             )
 
 -             title %TT%     正在处理文件:"%%i"
 
 -             endlocal
 
 -         )
 
 -     ) else (
 
 -         for /f "delims=" %%j in ("%Source%\%%i") do (
 
 -             set str=%%~tj
 
 -             set route=&set postfix=
 
 -             setlocal enabledelayedexpansion
 
 -             set str=!str:~0,10!
 
 -             set Y=!str:~0,4!&set M=!str:~5,2!&set D=!str:~8,2!
 
 -             if /i "%FoldersTree%"=="a" set Y=&set M=
 
 -             if /i "%FoldersTree%"=="b" set Y=
 
 -             if /i "%FoldersTree%"=="c" set M=
 
 -             md "%Destination%\!Y!\!M!\!str!" 2>nul
 
 -             if /i "%WhetherMove%"=="M" (
 
 -                 call :re_name "%Source%\%%i" "%Destination%\!Y!\!M!\!str!" "%%~ni"
 
 -                 move "%%j" "!Destination_1!">nul 2>nul
 
 -             ) else (
 
 -                 call :re_name "%Source%\%%i" "%Destination%\!Y!\!M!\!str!" "%%~ni"
 
 -                 copy "%%j" "!Destination_1!">nul 2>nul
 
 -             )
 
 -             title %TT%     正在处理文件:"%Source%\%%~nxi"
 
 -             endlocal
 
 -         )
 
 -     )
 
 - )
 
 - call :del_blank
 
 - pause>nul&goto source
 
  
- :dimesion
 
 - :: 按照像素值在目的路径下建立文件夹
 
 - for /f "tokens=2,3*" %%i in ('jhead -cs nul "%~1\*.jpg" 2^>nul^|findstr /i "name Resolution" 2^>nul') do (
 
 -     if "%%j"==":" (
 
 -         set "Source=%%k"&set "name=%%~nk"
 
 -         title %TT%     正在处理文件:"%%k"
 
 -     ) else (
 
 -         setlocal enabledelayedexpansion
 
 -         set "dimesion=%%j%%k"
 
 -         set "dimesion=!dimesion:x =×!"
 
 -         set "Destination=%Destination%\!dimesion!"
 
 -         md "!Destination!" 2>nul
 
 -         set route=&set postfix=
 
 -         if /i "%WhetherMove%"=="M" (
 
 -             call :re_name "!Source!" "!Destination!" "!name!"
 
 -             move "!Source!" "!Destination_1!">nul 2>nul
 
 -         ) else (
 
 -             call :re_name "!Source!" "!Destination!" "!name!"
 
 -             copy "!Source!" "!Destination_1!">nul 2>nul
 
 -         )
 
 -         endlocal
 
 -         set /a num+=1
 
 -     )
 
 - )
 
 - goto :eof
 
  
- :re_name
 
 - if not defined route (
 
 -     set "route=%~2"
 
 -     set "filename=%~3"
 
 - )
 
 - :re_name_loop
 
 - if not exist "%route%\%filename%%postfix%.jpg" (
 
 -     set "Destination_1=%route%\%filename%%postfix%.jpg"
 
 -     set _num=0
 
 -     goto :eof
 
 - ) else (
 
 -     set /a _num+=1
 
 -     call set "postfix=-%%_num%%"
 
 -     goto re_name_loop
 
 - )
 
 - goto :eof
 
  
- :del_blank
 
 - if /i "%WhetherMove%"=="M" (
 
 -     del /a /f /q /s "%Source%\Thumbs.db">nul 2>nul
 
 -     del /a /f /q /s "%Source%\*.ctg">nul 2>nul
 
 -     for /f "delims=" %%i in ('dir /ad /b /s "%Source%"^|sort /r') do (rd /q "%%i" 2>nul)
 
 -     rd /q "%Source%" 2>nul
 
 - )
 
 - title %TT%     当前目录:"%cd%"
 
 - echo.&echo.&echo                        共处理了 %num% 张照片,按任意键继续...
 
 - goto :eof
 
  复制代码   更新历史(此处今后将不再更新,需要使用最新版本的,请到此处查看:http://bbs.bathome.cn/viewthread.php?tid=69): 
- 更新历史:
 
  
- 2008.9.3
 
 -   添加了按照片分辨率大小归类的功能;为了避免重复整理,不再允许把整理后的
 
 - 照片放到源文件所在目录下;精简了部分代码,使得效率有所提升;此为1.4版。
 
  
- 2008.8.29
 
 -   修正了照片修改时间为拍摄时间时的一个错误:在处理其他路径下的照片时,不
 
 - 能修改其他路径所有子目录下的照片修改时间,此错误是由于没有强制指定源文件路
 
 - 径引起的。
 
  
- 2008.8.18
 
 -   增添了通过读取照片exif信息修正照片的修改时间的功能,并且整理照片时,能
 
 - 完全按照拍摄日期来归类照片,不再受照片最后修改时间的影响——前提是照片的
 
 - exif信息没有丢失,代价是:使用了一个第三方命令行程序 jhead.exe。此为1.3版。
 
  
- 2008.4.15
 
 -   修正了当程序位于A目录时不能把B目录下子目录中的照片移动到父目录的错误;
 
 - 优化了一处处理流程;精简了少量代码;修改了部分提示信息;
 
  
- 2007.11.10
 
 -   添加了按照 月\日期 格式整理照片的选项,调整了部分提示信息,此为1.2版
 
  
- 2007.11.7
 
 -   对重名文件自动重命名,具体方式为在文件名后添加 -序号,例如:重命名
 
 - 为 abc-1.jpg。此为1.1版。
 
  
- 2007.11.2
 
 -   修正了不处理子目录时只创建文件夹而不复制/移动文件的错误,感谢somebody
 
 - 的测试。
 
  
- 2007.11.1
 
 -   美化了界面,修复了几处bug,增添了操作提示和移动照片后删除空文件夹的功能
 
  
- 2007.10.29
 
 -   1.0 初具雏形
 
  复制代码 
 
[ 本帖最后由 namejm 于 2008-9-11 10:11 编辑 ] |   
 
 
 
 |