Board logo

标题: [文件操作] 批处理如何给数码相机里的照片、视频按日期分类存放 [打印本页]

作者: 小胖狐狸    时间: 2012-11-5 15:02     标题: 批处理如何给数码相机里的照片、视频按日期分类存放

本帖最后由 小胖狐狸 于 2012-11-5 15:13 编辑

相机驱动丢失导致自带软件无法使用,想通过读卡器+批处理的方式自动对相机SD卡中文件进行处理:

SD卡根目录下DCIM文件夹,该文件夹中会自动生成名为100RICOH的文件夹,该文件夹下存放的是不同日期拍摄的照片和视频,当达到一定数量时,相机会在DCIM下生成101ricoh文件夹继续存放
如下所示
DCIM
-100RICOH
   -IMG001.JPG
   -IMG002.JPG
   ......
-101RICOH
   -IMG003.JPG
   -AVI004.AVI
   ......

我想在SD卡根目录下放一个批处理,跟DCIM并列
  1. @echo off
  2. :: 获取DCIM下的目录名
  3. dir .\DCIM\ /B /AD>C:\RICOH_dir.TXT
  4. for /f %%I in (c:\RICOH_dir.TXT) do (
  5. dir .\DCIM\%%I\ /N /A-D>C:\%%I.TXT
  6. :: 获取文件的修改日期后创建以日期为名的文件夹,并move文件到该文件夹中
  7. for /f "skip=5 tokens=1-3,6 delims=-/ " %%i in (c:\%%I.txt) do (
  8. if not exist .\DCIM\%%i%%j%%k md .\DCIM\%%i%%j%%k
  9. move .\DCIM\%%I\%%l .\DCIM\%%i%%j%%k\
  10. pause
  11. )
  12. )
复制代码
该批处理主要功能达到了,但是由于分析文本文件RICOH_dir.TXT时,最后两行文字会对for的新建文件夹产生影响,生成不需要的文件夹,不知如何可以让其不产生呢?
5 个文件      7,764,576 字节
0 个目录    494,206,976 可用字节
  1. 驱动器 G 中的卷没有标签。
  2. 卷的序列号是 0EAE-DA68
  3. G:\DCIM\100RICOH 的目录
  4. 2012-09-01  21:13           290,568 R0013415.AVI
  5. 2012-08-25  09:18         1,952,653 R0013394.JPG
  6. 2012-09-01  16:40         1,875,363 R0013413.JPG
  7. 2012-09-22  08:55         1,841,520 R0013429.JPG
  8. 2012-10-17  21:44         1,804,472 R0013457.JPG
  9.                5 个文件      7,764,576 字节
  10.                0 个目录    494,206,976 可用字节
复制代码
for里用eol可以忽略特定字符开头的行,但是如果在for里用eol=,是不是得把这个参数写在""中的最后,那么 delims就没办法使用空格做分隔符了,学艺不精,很苦恼
作者: apang    时间: 2012-11-5 19:05

本帖最后由 apang 于 2012-11-5 19:09 编辑

其实,for变量%%~ta就是扩展到文件的修改时间。
揣摩了下楼主的意图,以下代码也许能满足要求:
  1. @echo off
  2. pushd "DCIM\"
  3. for /f "delims=" %%b in ('dir /a-d /b /s') do (
  4.   set "Name=%%b"
  5.   set "T=%%~tb"
  6.   setlocal enabledelayedexpansion
  7.   set "T=!T:~,4!!T:~5,2!!T:~8,2!"
  8.   if not exist "!T!\" md "!T!"
  9.   move "!Name!" "!T!\"
  10.   endlocal
  11. )
  12. pause
复制代码

作者: light.ming    时间: 2012-11-5 19:06

本帖最后由 light.ming 于 2012-11-5 20:55 编辑
  1. @echo off
  2. color 0a
  3. :: 获取DCIM下的目录名
  4. dir /B /AD>RICOH_dir.TXT
  5. for /f %%I in (RICOH_dir.TXT) do (
  6. for /f %%j in ('dir .\%%I\ /a-d /b /s ') do (
  7. echo %%~tj %%~nxj >>%%I.txt
  8. :: 获取文件的修改日期后创建以日期为名的文件夹,并move文件到该文件夹中
  9. for /f "tokens=1-3,5 delims=-/ " %%i in (%%I.txt) do (
  10. if not exist .\%%I\%%i%%j%%k md .\%%I\%%i%%j%%k
  11. if exist .\%%I\%%l move .\%%I\%%l .\%%I\%%i%%j%%k\
  12. )
  13. )
  14. if exist %%I.txt del /q %%I.txt
  15. )
  16. if exist RICOH_dir.TXT del /q RICOH_dir.TXT
  17. echo.
  18. echo 分类移动完成!按任意键退出。
  19. echo.
  20. pause>nul
复制代码

作者: wc726842270    时间: 2012-11-6 03:13

如果仅是修改的时间,可以考虑一下XCOPY /D
作者: 小胖狐狸    时间: 2012-11-6 09:11

本帖最后由 小胖狐狸 于 2012-11-6 09:22 编辑

回复 2# apang

代码简洁高效,感谢!等会要好好学习下你写的这段代码

batman 提示我使用%%~tb 这么个日期时间扩展参数,我用了后也考虑过截取日期
但是刚好我两台电脑的时间格式不相同,很容易看出差别:万一年份是两位数,那这种截取方法就可能导致文件夹名紊乱了
    set "T=!T:~,4!!T:~5,2!!T:~8,2!"
作者: 小胖狐狸    时间: 2012-11-6 09:13

回复 3# light.ming


    看了别人的方法,我的思路确实有些麻烦了,不过很感谢这位朋友按照我的思路,把我的问题解决,学习了!感谢 :)
作者: apang    时间: 2012-11-6 11:58

回复 5# 小胖狐狸
  1. @echo off
  2. pushd "DCIM\"
  3. for /f "delims=" %%a in ('dir /a-d /b /s') do (
  4.   for /f "tokens=1-3 delims=-/. " %%b in ("%%~ta") do (
  5.     if not exist "%%b%%c%%d\" md "%%b%%c%%d"
  6.     move "%%a" "%%b%%c%%d\"
  7.   )
  8. )
  9. pause
复制代码
试试
作者: ny350101    时间: 2012-11-7 23:36

本帖最后由 ny350101 于 2012-11-7 23:46 编辑
  1. @echo off
  2. echo ****************************************
  3. echo *****      照片按日期分类       ********
  4. echo ****************************************
  5. dir /OD /X|find /I ".jpg" > filelist.txt
  6. dir /OD /X|find /I ".avi" >> filelist.txt
  7. dir /OD /X|find /I ".mov" >> filelist.txt
  8. echo 分类中,请稍等.............
  9. for /F "tokens=1-5" %%a in (filelist.txt) do md %%a 1>nul 2>nul & move %%d %%a
  10. del filelist.txt
  11. echo 分类成功结束 !
  12. pause
复制代码
批处理和照片放在一个文件夹里
http://www.bathome.net/thread-19994-1-1.html




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2