当前位置: 首页 > 图文教程 > 脚本技术 > DOS/BAT > 批处理制作照片整理器

DOS/BAT
Bootcfg 配置、查询或更改 Boot.ini 文件设置
Assoc显示或修改文件名扩展关联
at计划在指定时间和日期在计算机上运行命令和程序
使用 atmadm 来显示 ATM 适配器上传入和传出呼叫的统计信息
Attrib 显示、设置或删除指派给文件或目录的只读、存档、系统以及隐藏属性
可以使用的批处理参数集合
批处理下使用筛选器的函数
Getmac返回计算机中所有网卡的媒体访问控制 (MAC) 地址以及每个地址的网络协议列表
Cacls 显示或修改任意访问控制列表 (DACL) 文件
Call 从一个批处理程序调用另一个批处理程序,并且不终止父批处理程序。
Chcp 显示活动控制台代码页数量,或更改该控制台的活动控制台代码页
Chdir (Cd) 显示当前目录的名称,或更改当前的文件夹
Chkntfs 显示或指定在启动计算机时计划的自动系统检查是否在 FAT、FAT32 或者 NTFS 卷上运行。
Cipher 在 NTFS 卷上显示或改变文件的加密
Cls 清除命令提示符窗口
Cmd 启动命令解释器 Cmd.exe 的新实例
Cmstp 安装或删除“连接管理器”服务配置文件
color 对于当前会话,更改命令提示窗口的前景和背景色
配置命令提示符的方法
Comp 逐字节地比较两个文件或几组文件的内容

DOS/BAT 中的 批处理制作照片整理器


出处:互联网   整理: 软晨网(RuanChen.com)   发布: 2009-09-11   浏览: 235 ::
收藏到网摘: n/a

最近相机里的照片比较多,一般是连拍了好几天之后,才把相机里的照片一股脑放到硬盘里,并且是隔上一两个星期才整理一次。日子一长,照片就多了起来,都分不清是什么时候拍的了。网上搜索了很久,找到一款名为PhotosTool的软件,可以按拍摄日期来整理照片,正合我意,只可惜,这个不到1M的小软件,居然要另外安装20余M的.NET 2.0,一气之下,用P写了一个类似功能的脚本,发出来大家玩玩。
  曾经有一段时间,单位资料室的电脑中毒很深,保存有数十G工作照片的分区也惨遭毒手——那可是我们单位几年工作的心血啊!资料室的人不敢轻举妄动,请了数据恢复公司的人把系统重装,把数据恢复到了移动硬盘上,结果,照片目录和修改日期全部错乱,对比较依靠照片修改日期来整理照片的我们而言,这无疑是一个沉重的打击。幸好有部分照片做了备份,而绝大部分的照片大致拍摄日期都有文字记录,资料室不得不动用最原始的方式,集中了一些人手,把照片一张一张点开,通过ACDSee查看exif信息里的拍摄日期来重新归类。如此整理了数月,才基本把照片放回正确的文件夹,但是,照片的修改日期仍然没法修正。本人翻遍网络,终于觅到一款能通过读取照片exif信息来对照片进行修改操作的命令行程序。经过本机的数十次测试,通过此命令行程序,完全可以把错乱的日期修改为照片的拍摄日期,于是,就有了照片整理器1.3版及其后续版本,具体功能可以查看脚本说明及更新历史。
  经过将近1年时间的逐步完善,目前,此工具已经具备了按照片exif信息中的拍摄时间或者像素大小整理照片的功能,并可以把照片的修改时间改为照片的拍摄时间,方便后续整理工作,强烈推荐使用。
注意:必须与附件中的 jhead.exe 一起使用。
更新历史:
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
:: 出处: 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://www.ruanchen.com/ofts/2148.html