标题: [文件操作] [已解决]求好用的批处理照片按照拍摄日期归档——求人不如求己 [打印本页]
作者: jasonshaw 时间: 2014-8-15 22:28 标题: [已解决]求好用的批处理照片按照拍摄日期归档——求人不如求己
在坛上看到过大神做的批处理,发现是好久以前的了
我下载了之后打开报错
脚本内容如下:- :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
- :: 作者: namejm
- :: 出处: bbs.bathome.net
- :: 编写日期: 2007-10-29~2008-10-12
- :: 测试环境: CMD@WinXP SP2
- :: 功能:按照exif信息归类照片
- :: 详细介绍:
- :: 本脚本通过获取jpg或jpeg照片的exif信息归类图片,具备按照分辨率大小和
- :: 日期两种方式归类,并自动重命名同名文件,同时统计已经处理的照片数量。另外,
- :: 可以选择使用如下功能:
- :: 1、批量修正当前目录下及所有子目录中jpg或jpeg照片的修改日期为拍摄日期;
- :: 2、能把所有子目录里的图片移动到父目录下并删除父目录下的所有空目录。
- :: 注意:
- :: 本脚本会读取照片的exif信息,在按日期整理照片时,自动修正照片的修改时间
- :: 为照片的拍摄时间,时间精确到秒;没有exif信息的jpg或jpeg图片,修改时间保持
- :: 不变,此时,按照像素大小整理照片的功能不可正常使用,按照日期归类照片时依据
- :: 的是照片的最后修改日期。
- :::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
- @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%\*.jp*g">nul 2>nul
- for /f "delims=" %%i in ('dir /ad /b /s "%Source%" 2^>nul') do (
- jhead -ft "%%i\*.jp*g">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\*.jp*g" 2^>nul') do (
- set route=&set postfix=
- setlocal enabledelayedexpansion
- call :re_name "%%j" "%Source%" "%%~nj" "%%~xj"
- 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%\*.jp*g" 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" "%%~xi"
- move "%%j" "!Destination_1!">nul 2>nul
- ) else (
- call :re_name "%Source%\%%i" "%Destination%\!Y!\!M!\!str!" "%%~ni" "%%~xi"
- 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" "%%~xi"
- move "%%j" "!Destination_1!">nul 2>nul
- ) else (
- call :re_name "%Source%\%%i" "%Destination%\!Y!\!M!\!str!" "%%~ni" "%%~xi"
- 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\*.jp*g" 2^>nul^|findstr /i "name Resolution" 2^>nul') do (
- if "%%j"==":" (
- set "Source=%%k"&set "name=%%~nk"&set postfix=%%~xk
- 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!" "!postfix!"
- move "!Source!" "!Destination_1!">nul 2>nul
- ) else (
- call :re_name "!Source!" "!Destination!" "!name!" "!postfix!"
- 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"
- set postfix=%~4
- )
- :re_name_loop
- if not exist "%route%\%filename%%-num%%postfix%" (
- set "Destination_1=%route%\%filename%%-num%%postfix%"
- set -num=&set _num=0
- goto :eof
- ) else (
- set /a _num+=1
- call set "-num=-%%_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
-
- REM 更新历史:
- REM 2008.10.12
- REM 经 fastslz 提醒,增加了对jpeg格式的支持。
-
- REM 2008.9.3
- REM 添加了按照片分辨率大小归类的功能;为了避免重复整理,不再允许把整理后的
- REM 照片放到源文件所在目录下;精简了部分代码,使得效率有所提升;此为1.4版。
-
- REM 2008.8.29
- REM 修正了照片修改时间为拍摄时间时的一个错误:在处理其他路径下的照片时,不
- REM 能修改其他路径所有子目录下的照片修改时间,此错误是由于没有强制指定源文件路
- REM 径引起的。
-
- REM 2008.8.18
- REM 增添了通过读取照片exif信息修正照片的修改时间的功能,并且整理照片时,能
- REM 完全按照拍摄日期来归类照片,不再受照片最后修改时间的影响——前提是照片的
- REM exif信息没有丢失,代价是:使用了一个第三方命令行程序 jhead.exe。此为1.3版。
-
- REM 2008.4.15
- REM 修正了当程序位于A目录时不能把B目录下子目录中的照片移动到父目录的错误;
- REM 优化了一处处理流程;精简了少量代码;修改了部分提示信息;
-
- REM 2007.11.10
- REM 添加了按照 月\日期 格式整理照片的选项,调整了部分提示信息,此为1.2版
-
- REM 2007.11.7
- REM 对重名文件自动重命名,具体方式为在文件名后添加 -序号,例如:重命名
- REM 为 abc-1.jpg。此为1.1版。
-
- REM 2007.11.2
- REM 修正了不处理子目录时只创建文件夹而不复制/移动文件的错误,感谢somebody
- REM 的测试。
-
- REM 2007.11.1
- REM 美化了界面,修复了几处bug,增添了操作提示和移动照片后删除空文件夹的功能
-
- REM 2007.10.29
- REM 1.0 初具雏形
复制代码
保存到bat之后,运行之后结果是这样的:
似乎是乱码问题
但是我用everedit打开没有出现乱码啊
求高手指点,或者帮忙看看有没最新的合适的批处理
作者: jasonshaw 时间: 2014-8-15 22:43
回复 1# jasonshaw
就是这个 帖子里面的那个代码
http://www.bathome.net/thread-69-1-1.html
为何我复制下来运行就是 那些乱码呢?
作者: CrLf 时间: 2014-8-16 00:29
保存为 ansi 编码
作者: DAIC 时间: 2014-8-16 08:18
用记事本打开这个.bat脚本
文件
另存为
选择 ANSI 编码
作者: jasonshaw 时间: 2014-8-16 12:01
回复 3# CrLf
谢谢回复啊,真的是可以了
但是,在最后一步提示里面 显示- 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 ──────────────────────────────
复制代码
我选择d 结果就又返回需要再次选择,也就是选择d没有反应
而选择a b c 都可以,不知道这是为什么
还有就是我选择c,结果为何是 目录结构 年-年-月-日,多了一层年,求解答
作者: jasonshaw 时间: 2014-8-16 12:27
回复 4# DAIC
谢谢回复啊,真的是可以了
但是,在最后一步提示里面 显示- 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 ──────────────────────────────
复制代码
我选择d 结果就又返回需要再次选择,也就是选择d没有反应
而选择a b c 都可以,不知道这是为什么
还有就是我选择c,结果为何是 目录结构 年-年-月-日,多了一层年,求解答
作者: DAIC 时间: 2014-8-16 16:40
选c之后是 2007\2007-01-01 这样?
还是 2007-2007-01-01 这样?
作者: jasonshaw 时间: 2014-8-16 16:45
回复 7# DAIC
选择a b c 好像 年的目录都是两层
比如 2013\2013\02\09
多了一层,而且d好像没反应,就是循环回去
作者: wangchang 时间: 2022-7-26 14:11
如果分类到月份会不会好些,因为分类到每天,目录太多了。
欢迎光临 批处理之家 (http://www.bathome.net/) |
Powered by Discuz! 7.2 |