Board logo

标题: [文本处理] 【已解决】批处理怎样根据原文件名中的数字大小重命名图片? [打印本页]

作者: wpy4206    时间: 2011-11-10 11:54     标题: 【已解决】批处理怎样根据原文件名中的数字大小重命名图片?

本帖最后由 pcl_test 于 2017-6-6 19:05 编辑

转换前                                        转换后                                       
一级目录        二级目录        图片名称                        一级目录        二级目录        图片名称                       
aaa                                        aaa                                       
        42                                        42                               
                4201#0.1.jpg        ——>>>        有变化                        4201#4.jpg                       
                4201#0.2.jpg        ——>>>        有变化                        4201#5.jpg                       
                4201#1.jpg        ——>>>                                4201#1.jpg                       
                4201#2.jpg        ——>>>                                4201#2.jpg                       
                4201#3.jpg        ——>>>                                4201#3.jpg                       
                4201#4.jpg        ——>>>                                4201#4.jpg                       
                ……        ——>>>                                                       
        42                ——>>>                        42                               
                4202#0.1.jpg        ——>>>        有变化                        4202#7.jpg                       
                4202#1.jpg        ——>>>                                4202#1.jpg                       
                4202#2.jpg        ——>>>                                4202#2.jpg                       
                4202#3.jpg        ——>>>                                4202#3.jpg                       
                4202#3.1.jpg        ——>>>        有变化                        4202#4.jpg                       
                4202#3.2.jpg        ——>>>        有变化                        4202#5.jpg                       
                4202#4.jpg        ——>>>        有变化                        4202#6.jpg                       
                ……        ——>>>                                                       
        42                ——>>>                        42                               
                4203#0.jpg        ——>>>        有变化                        4203#6.jpg                       
                4203#1.jpg        ——>>>                                4203#1.jpg                       
                4203#2.jpg        ——>>>                                4203#2.jpg                       
                4203#3.jpg        ——>>>                                4203#3.jpg                       
                4203#4.jpg        ——>>>                                4203#4.jpg                       
                4203#5.jpg        ——>>>                                4203#5.jpg                       
                ……        ——>>>                                                       
        42                ——>>>                        42                               
                4204#1.jpg        ——>>>                                4204#1.jpg                       
                4204#2.jpg        ——>>>                                4204#2.jpg                       
                4204#3.jpg        ——>>>                                4204#3.jpg                       
                4204#4.jpg        ——>>>                                4204#4.jpg                       
                ……        ——>>>                                ……                       

说明:
1、文件的名称基本由大于1的数字和小于1的数字组成。                                    
2、排序的原则大于1的顺排,比如原来4202中的1还是1,原来的3.1变成了4等依次顺排。  
3、小于1的依次顺排,比如原来的4201中的0.1变成了4,0.2变成了5。
4、这都是文件的实际名称,带有#符号
作者: chinatree    时间: 2011-11-10 13:40

菜鸟的我表示还不会.
作者: 小胖狐狸    时间: 2011-11-10 15:09

本帖最后由 小胖狐狸 于 2011-11-10 16:40 编辑

回复 1# wpy4206


    新手练手,我的失败过程也没有删掉,我的检验代码也都留在里面,仅供参考 (我的filelist.txt)是楼主贴出内容中手动删除了一些行后,每行都是旧文件名、新文件名这样子

我的想法是先将文件名#后面的数字小于等于0的,前面加点东西,让他排到1,2,3,4……的后面去,方便之后的顺序重命名
首先我想的是0.1加到1000.1,结果发现1000.1虽然在1的后面,却排在2的前面,遂更改为加字母:0.1 → a0.1,实现了默认排序满足楼主需求
然后就是比较文件名中#前的部分后后面的部分了

如果看得乱,请自行删除rem开头的行,哈哈 :)
  1. @echo off&setlocal enabledelayedexpansion
  2. rem 清除001下所有文件
  3. del .\filelist1\001\*.* /Q
  4. rem 通过文件列表filelist1.txt,在001下新建模拟文件待重命名
  5. for /f "tokens=1 delims= " %%i in (filelist1.txt) do echo.>.\filelist1\001\%%i
  6. pause
  7. cls
  8. set name=
  9. set num=0
  10. rem 将文件名#后面部分数值小于等于0的全部加1000后重命名,方便总体更名排序
  11. rem 上一行所提方案有误:1000会排在1的后面,2的前面,汗~
  12. rem 新方案:修改将文件名#后面部分数值小于等于0的全部前加字母a后重命名
  13. for /f "delims=j# tokens=1,2" %%i in ('dir .\filelist1\001\ /B^|find "#0."') do (
  14. rem for /f "delims=j# tokens=1,2" %%i in ('dir .\filelist1\001\ /B^|find "#1000."') do ( 方案有误,前加1000排序乱了,此行修改
  15. set name1=%%i
  16. set name2=%%j
  17. rem ren .\filelist1\001\!name1!#!name2!jpg !name1!#a!name2:~3!jpg 方案有误,前加1000排序乱了,此行修改
  18. ren .\filelist1\001\!name1!#!name2!jpg !name1!#a!name2!jpg
  19. )
  20. pause
  21. rem 开始整体更名,由于更名3.1.jpg为3.jpg时遇到重名导致3.1和3.2失败,但是3.jpg被成功更名为5.jpg顺序无误,遂整体执行两次后完成修改
  22. call :beginren
  23. call :beginren
  24. goto :eof
  25. :beginren
  26. for /f "delims=j# tokens=1,2" %%i in ('dir .\filelist1\001\ /B') do (
  27. set name1=%%i
  28. set name2=%%j
  29. set shortname=!name2:~,-1!
  30. set /a num+=1
  31. echo !name1! !name2:~,-1! !shortname!
  32. if not !name1!==!name! (echo 前面不等于&set num=1&ren .\filelist1\001\!name1!#!name2!jpg !name1!#!num!.jpg&set name=!name1!) else (echo 前面等于&if not !shortname!==!num! echo 后面不等于&ren .\filelist1\001\!name1!#!name2!jpg !name1!#!num!.jpg&set name=!name1!)
  33. echo !num! !!name!!
  34. )
  35. goto :eof
复制代码

作者: CrLf    时间: 2011-11-10 16:03

# 后的那个数字会出现大于 9 的情况吗?如果能保证小于 10 (或者小于 100)那就好办了
作者: wpy4206    时间: 2011-11-10 18:09

回复 4# CrLf


  恩,基本上都是小于10,有一些文件夹中大于10,不过很少。写脚本的话,小于100就可以了。
作者: CrLf    时间: 2011-11-10 18:26

噢,看错题意,当我没说...
佩服 3 楼的毅力
作者: yyykkkyyyy    时间: 2011-11-10 23:28

在3楼基础上也练手试试,这问题技术上说不上难,但对我等水平来说还是不容易的
  1. @echo off
  2. rem  批处理放一级目录下、二级目录并排位置运行
  3. echo 正在处理...
  4. for /d %%i in (*)do (
  5.    cd "%%i" &echo         %%i\ :
  6. rem =====将文件名赋以固定10位的变量名===========
  7.    setlocal enabledelayedexpansion
  8.    for /f "tokens=1-3* delims=#." %%a in ('dir/b/a-d ????#*.jpg')do (
  9.       set h1=0%%b
  10.       set h1=!h1:~-2!
  11.       if "!h1!"=="00" set "h1=a0"
  12.       if "%%d"=="" (
  13.          set "fn=%%a#%%b.%%c"
  14.          set "h2= 0"
  15.       )else (
  16.          set "fn=%%a#%%b.%%c.%%d"
  17.          set h2=00%%c
  18.          set h2=!h2:~-2!
  19.       )
  20.       set "#%%a#!h1!!h2!=!fn!"  
  21.     )
  22. rem =====排序并重命名==========
  23.     for /f "tokens=1,2* delims=#=" %%a in ('set #')do (
  24.       if not defined ##%%a set ##%%a=y&set/a n=0
  25.       set/a n+=1
  26.       ren %%c %%a#!n!.jpg 2>nul||ren %%c %%a#!n!.jpg.yky
  27.     )
  28.     ren *.yky *. 2>nul
  29.     endlocal
  30.     cd..
  31. )
  32. pause
复制代码





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