批处理之家's Archiver

namejm 发表于 2007-11-5 21:35

批处理版照片整理器[2008-10-12]

[color=#000000][color=red]
[color=red]
____________________________版主提醒____________________________

  为了避免影响技术讨论、提高看帖的舒适性,请大家不要在此帖下跟
无实质内容的口水帖,特别是纯顶、纯支持、纯感谢、路过之类的帖子,
管理人员将不定期清理此类回帖,请大家多参与讨论少灌水,与人方便,
终将给自己带来方便,谢谢合作。
________________________________________________________________
[/color][/color][/color][color=red][/color]


  最近相机里的照片比较多,一般是连拍了好几天之后,才把相机里的照片一股脑放到硬盘里,并且是隔上一两个星期才整理一次。日子一长,照片就多了起来,都分不清是什么时候拍的了。网上搜索了很久,找到一款名为PhotosTool的软件,可以按拍摄日期来整理照片,正合我意,只可惜,这个不到1M的小软件,居然要另外安装20余M的.NET 2.0,一气之下,用P写了一个类似功能的脚本,发出来大家玩玩。

  曾经有一段时间,单位资料室的电脑中毒很深,保存有数十G工作照片的分区也惨遭毒手——那可是我们单位几年工作的心血啊!资料室的人不敢轻举妄动,请了数据恢复公司的人把系统重装,把数据恢复到了移动硬盘上,结果,照片目录和修改日期全部错乱,对比较依靠照片修改日期来整理照片的我们而言,这无疑是一个沉重的打击。幸好有部分照片做了备份,而绝大部分的照片大致拍摄日期都有文字记录,资料室不得不动用最原始的方式,集中了一些人手,把照片一张一张点开,通过ACDSee查看exif信息里的拍摄日期来重新归类。如此整理了数月,才基本把照片放回正确的文件夹,但是,照片的修改日期仍然没法修正。本人翻遍网络,终于觅到一款能通过读取照片exif信息来对照片进行修改操作的命令行程序。经过本机的数十次测试,通过此命令行程序,完全可以把错乱的日期修改为照片的拍摄日期,于是,就有了照片整理器1.3版及其后续版本,具体功能可以查看脚本说明及更新历史。

  经过将近1年时间的逐步完善,目前,此工具已经具备了按照片exif信息中的拍摄时间或者像素大小整理照片的功能,并可以把照片的修改时间改为照片的拍摄时间,方便后续整理工作,强烈推荐使用。

  [color=red]功能演示:[/color]

  注意:必须与附件中的 jhead.exe 一起使用。[code]:::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::::
:: 作者: 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[/code]更新历史:[code]更新历史:
2008.10.12
  经 fastslz 提醒,增加了对jpeg格式的支持。

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 初具雏形[/code]jhead.exe下载地址:
[url]http://bcn.bathome.net/s/tool/index.html?key=jhead[/url]

somebody 发表于 2007-11-5 21:57

好多代码,正如你所说,看别人代码N辛苦.................
是有点作用,不过我没能用上的机会.........
能用上的朋友可有福气了......
纯支持!

htysm 发表于 2007-11-6 08:01

不错,很喜欢,另外请教能不能写一个按照图片尺寸来分类的P处理,比如我只要1024x768的。WINDOWS的查找中没有这样的功能。

namejm 发表于 2007-11-6 20:38

  纯P是无法查询图片尺寸的,VBS应该可以办到,可惜我还不会。

smilediao 发表于 2007-11-7 22:50

:'(
相比之下我的代码真是太简单了,我的知识真是太少了!哎,我还是回家面壁去吧!
:Q

Frank 发表于 2008-1-5 15:45

晕,好强...  居然一出就是两个...CHM反编译器..

snowhack 发表于 2008-1-13 01:20

呵呵 你这东西是抄袭的吧?

[code]@echo off
:: Code by JM 2006-12-17 CMD@XP
:: 出处:
mode con lines=28
title 文件归类整理器-test

::===================================================================================
:: 目的:
::
::     对当前目录及其所有子目录下的文件进行归类。
::
:: 整理结果:
::
::   在当前目录及其子目录下,以该文件夹里的文件类型名为文件夹名,在该文件
:: 所在目录下建立形如 exe文件、rar文件 之类的文件夹,不同类型的文件移动到
:: 对应的文件夹下。
::   如果以后增添了新文件,再次运行本脚本时,若该位置已经存在对应的文件夹,
:: 将把新添的文件保存在该文件夹下;若不存在对应的文件夹,将新建文件夹以保存
:: 该文件。
::
:: 已发现的问题:
::   ① move 命令无法移动 系统 或 隐藏 属性的文件;
::   ② 不会整理无类型的文件。
::
:: 下一版将要实现的功能:
::
::   ① 对以当前目录为起点,指定层深的子目录进行整理;
::   ② 整理指定类型以外的文件。
::
:: 更新历史:
::
:: 06.12.17
::   修正了遇到无类型文件会自动退出的错误;更新了获取相对路径的代码,效率有所提升;
::
:: 06.12.16
::   增添了如下功能(V1.1):
::     ① 能指定要处理的文件夹以及保存路径;
::     ② 能指定要整理的类型;
::     ③ 跳过已经整理的文件;
::
:: 06.12.15
::   在只能整理当前目录下不同类型文件的基础上,写出了能对当前目录及其所有子目录下的
:: 不同类型文件进行操作的代码,此为V1.0;
::===================================================================================

:note
cls
title 文件归类整理器-说明

echo                               ╭────────╮
echo           ╭─────────┤  功 能 说  明  ├─────────╮
echo           │                  ╰────────╯                  │
echo           │                                                        │
echo           │        本程序能对当前目录及其所有子目录下的文件进行    │
echo           │                                                        │
echo           │    归类,具体效果如下:                                │
echo           │                                                        │
echo           │        在当前目录及其子目录下,以该文件夹里的文件      │
echo           │                                                        │
echo           │    类型名为文件夹名,在该文件所在目录下建立形如        │
echo           │                                                        │
echo           │    exe文件、rar文件 之类的文件夹,不同类型的文件移     │
echo           │                                                        │
echo           │    动到对应的文件夹下,以保持原来的文件夹结构不变。    │
echo           │                                                        │
echo           │        如果以后增添了新文件,再次运行本脚本时,若      │
echo           │                                                        │
echo           │    该位置已经存在对应的文件夹,将把新添的文件保存      │
echo           │                                                        │
echo           │    在该文件夹下;若不存在对应的文件夹,将新建文件      │
echo           │                                                        │
echo           │    夹以保存该文件。                                    │
echo           │                                                        │
echo           ╰────────────────────────────╯
echo.
echo                                                按任意键进入下一步...
pause>nul

:config
cls
title 文件归类整理器-参数设置
echo.
echo.
echo.
echo.
echo         请把要处理的文件夹拉到本窗口(直接回车将处理当前目录):
echo.
set "source_path=%cd%"
set /p source_path=                 
echo.
echo          请输入保存位置绝对路径(直接回车将保存在源文件夹下):
set destination_path=
set /p destination_path=                 
echo.
echo             请输入要处理的文件类型,多个类型以空格分隔
echo.
echo                (如:rar exe;直接回车将处理所有类型):
echo.
set type_included=
set /p type_included=                 

if exist "%source_path:"=%" (
    set "source_path=%source_path:"=%\"
) else goto config
set "source_dir=%source_path:"=%"

rem ======= 计算源文件夹的层深 =======
set source_layers=0
set "source_dir_tmp=%source_dir%"
:get_source_layers
set "source_dir_tmp=%source_dir_tmp:*\=%"
set /a source_layers+=1
if not "%source_dir_tmp%"=="" goto get_source_layers

if defined destination_path set destination=yes

for /f "delims=" %%i in ('dir /a-d /b /s /oe "%source_path%"') do (
    set "nx_name=%%~nxi"
    call :build_dir "%%~xi" "%%~dpi"
    set file_type=%%~xi
    set "source_path=%%~dpi"
)
goto :eof

rem ======= 按文件类型创建文件夹 =======
:build_dir
set include=
for %%i in (%type_included%) do if /i "%1"==".%%i" set include=yes
if defined type_included if not defined include goto :eof
set types=%1
if %types%=="" goto :eof
set types=%types:~2,-1%

if not defined destination set destination_path=%2

set "destination_path=%destination_path:"=%"
if not "%destination_path:~-1%"=="\" set "destination_path=%destination_path%\"

rem ======= 获取文件在源文件中的相对位置 =======
set source_sub_path=%2
set "source_sub_path=%source_sub_path:"=%"
set num=0
:get_source_sub_path
set "source_sub_path=%source_sub_path:*\=%"
set /a num+=1
if not %num% equ %source_layers% goto get_source_sub_path


rem ======= 获取文件所在路径的目录名 =======
for /f "delims=" %%i in ("%destination_path:~0,-1%") do set "source_name=%%~nxi"

:: 通过对比文件类型名和文件所在路径的目录名来判断哪些文件已经整理过

if "%source_name%"=="%types%文件" goto :eof

:: 判断文件所在位置是否发生了变化
if %2=="%source_path%" (set chang_dir=) else set chang_dir=yes&set file_type=

:: 判断要处理的文件是不是批处理文件自身
if "%destination_path%%nx_name%"=="%~f0" (set file_self=yes) else set file_self=

:: 判断文件类型是否发生了变化

if /i "%1"=="%file_type%" (set same_type=yes) else set same_type=
if not defined destination set source_sub_path=

if not defined chang_dir (
    if not defined file_self if not defined same_type md "%destination_path%%source_sub_path%%types%文件" 2>nul
) else (
    if not defined file_self if not defined same_type md "%destination_path%%source_sub_path%%types%文件" 2>nul
)
if not defined file_self move /-y %2"%nx_name%" "%destination_path%%source_sub_path%%types%文件"
goto :eof

:: source_path:源文件夹路径
:: source_layers:源文件夹的层深
:: destination_path:目的文件夹路径
:: include:要排除的文件类型
:: destination:标志变量,用来判断是否指定目的文件夹路径
:: nx_name:源文件的文件名和后缀名组合
:: file_type:源文件的类型
:: source_sub_path:源文件相对于源文件夹的路径
:: source_path_tmp:源文件夹路径的临时变量
:: source_name:源文件名
:: source_name_tmp:源文件名临时变量
:: chang_dir:判断文件夹是否发生变化的标志
:: same_type:判断文件类型是否相同的变量
:: file_self:判断是不是批处理文件自身的变量
:: included:要处理的文件类型
:: type_included:决定是否处理当前文件类型的标志[/code]

你和这个批处理 异曲同工罢了

youxi01 发表于 2008-1-13 08:32

哈哈,namejm就是你抄袭JM的嘛!!!哈哈哈哈

namejm 发表于 2008-1-13 12:49

  在批处理代码的作者信息中,一般而言,JM==namejm^_^。

封印 发表于 2008-3-22 00:15

看到那么多代码,我都不想学了。。。。郁闷

每年达 发表于 2008-6-12 12:41

太强了,写了多长时间啊?佩服。。

杨风 发表于 2008-6-21 15:27

你真强!顶你!   
以后好好学习了
这样的东东还是要学习一下的

Clark2505 发表于 2008-8-5 23:43

我一看到for和高级变量应用就晕,哪里有详细的讲解??

黑血柳丁 发表于 2008-8-7 17:18

我是新人,还希望板主多指教!我非常喜欢BAT,因为我觉得在哪面有无穷无尽的奥秘!
我现在是一名网络管理员,所以有很多不懂的地方,还希望大家的帮助。先谢谢了!

namejm 发表于 2008-8-18 21:39

重大突破

2008.8.18
  增添了通过读取照片exif信息修正照片的修改时间的功能,并且整理照片时,能完全按照拍摄日期来归类照片,不再受照片最后修改时间的影响——前提是照片的exif信息没有丢失,代价是:使用了一个第三方命令行程序 jhead.exe 。

523066680 发表于 2008-8-18 21:45

[quote]原帖由 [i]snowhack[/i] 于 2008-1-13 01:20 发表 [url=http://bbs.bathome.net/redirect.php?goto=findpost&pid=1849&ptid=69][img]http://bbs.bathome.net/images/common/back.gif[/img][/url]
@echo off
:: Code by [color=red]JM[/color] 2006-12-17 [email=CMD@XP]CMD@XP[/email]
... [/quote]

namejm的原作更新版……谁敢说抄袭,抓出来。种番薯!

SmallK 发表于 2008-8-26 10:58

其实人家说jm抄袭也是情有可原的啊,谁让jm的名字全是字母呢!我的就好多了~哈哈;P……

namejm 发表于 2008-8-29 10:06

修正一处错误

2008.8.29
  修正了照片修改时间为拍摄时间时的一个错误:在处理其他路径下的照片时,不
能修改其他路径所有子目录下的照片修改时间,此错误是由于没有强制指定源文件路
径引起的。请重新下载。

namejm 发表于 2008-9-3 17:48

增添了按照分辨率大小整理照片的功能

  考虑到一些摄影人士的特殊需求,增添了按照分辨率大小整理照片的功能。这次更新细节如下:

2008.9.3
  添加了按照片分辨率大小归类的功能;为了避免重复整理,不再允许把整理后的
照片放到源文件所在目录下;精简了部分代码,使得效率有所提升;此为1.4版。

sambodhi 发表于 2008-9-12 09:17

有个绿色小软叫NameExif也不错!

wolongx 发表于 2008-9-13 00:47

在cnBeta上看到了,就过来了,确实是个很牛B的东东。

vlongrong 发表于 2008-9-15 17:34

一直很喜欢批处理,这样的好贴怎能不顶,已经在用,很方便

yyyxlxq 发表于 2008-9-21 21:21

怎么回事?

测  试  无  效  ?  !

namejm 发表于 2008-9-21 22:34

  测试无效是什么样的状况?照片没有整理?整理出错?

  请注意使用的条件:
  1、必须是jpg格式的照片,不是jpg格式的图片无法整理,不是数码相机拍摄的照片整理会出错;
  2、如果使用的是1.2之后的版本,必须和jhead.exe一起使用,并且,jhead.exe必须和批处理文件位于同一目录下。

xunaco 发表于 2008-9-27 12:21

看代码有个小问题

请问这个代码里
set "Source=%Source:"=%"
是什么意思

youaiwuzhui 发表于 2008-10-2 14:25

支持楼主,现在准备把自己电脑里的照片也整理一下子

受教者 发表于 2008-10-3 22:53

不加密的原创,支持
学习中。。。。

受教者 发表于 2008-10-3 23:03

回复 53楼 的帖子

假设
set source= " bbs"
set "Source=%Source:"=%"
运行后得出来就是
source为bbs
也就是set "Source=%Source:"=%把source中的"这个去掉
又如@echo off
set a=bbs.verybat.cn
echo 替换前的值: "%a%"
set var=%a:.=伤脑筋%
echo 替换后的值: "%var%"
pause

解释set var=%a:.=伤脑筋%
    set命令 var变量名 字a是要进行字符替换的变量的值,"."为要替换的值,
"伤脑筋"为替换后的值!
执行后就会把变量%a%里面的"."全部替换为"伤脑筋"

406317577 发表于 2008-10-4 04:34

for命令太深奥了...其他的懂一点点

yylogo 发表于 2008-10-7 23:31

难得的良师益友

昨天注册,你给我一瓢冷水,让我肃立。
今天参观,你给我一盏明灯,让我仰望。
明天的明天,希望有人超过你。青出于蓝而胜于蓝,愿带一个小徒弟吗?

页: [1] 2 3 4

Powered by Discuz! Archiver 7.2  © 2001-2009 Comsenz Inc.