[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[其他] 【已解决】BAT脚本批量修改某目录下几千个文件名

我的目录下有几千个文件,文件顺序是1-1.jpg,1-2.jpg,1-3.jpg,2-1.jpg,2-2.jpg,2-3.jpg……
我想通过批处理,让这些文件名全部修改为如下顺序:
Shot00000.jpg
Shot00001.jpg
Shot00002.jpg
Shot00003.jpg
Shot00004.jpg
Shot00005.jpg

相当于让1-1.jpg改成了Shot00000.jpg。1-2.jpg改成了Shot00001.jpg……2-3.jpg改成了Shot00005.jpg
感谢各位大佬。
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

本帖最后由 ppll2030 于 2024-9-4 23:38 编辑
  1. @echo off&setlocal enabledelayedexpansion
  2. (for /f "tokens=1-3 delims=-." %%a in ('dir /b /a-d *.jpg') do (
  3. set a=00000%%a&set b=00000%%b
  4. echo !a:~-5!-!b:~-5!=%%a-%%b.%%c
  5. ))>$
  6. set n=0
  7. for /f "tokens=2 delims==" %%i in ('sort $') do (
  8. set m=0000!n!
  9. rem 确认无误再去除echo
  10. echo ren "%%i" "Shot!m:~-5!"%%~xi
  11. set/a n+=1
  12. )
  13. del /q $ &pause
复制代码

TOP

回复 1# zhengwei007

如果文件名编号没有位数对齐,可能出现 1-1.jpg,1-2.jpg,...,1-10.jpg,... 被 dir /b *.jpg 错位列表的结果,如下
...
1-1.jpg
1-10.jpg
...
1-2.jpg
...

须楼主确认。

TOP

回复 3# aloha20200628

如果出现1-10.jpg,1-11.jpg,那么需要按照这个顺序去改变文件名。不能是1-1.jpg,1-10.jpg,1-2.jpg这样的顺序。

TOP

  1. @echo off
  2. cd /d "%~dp0"
  3. setlocal enabledelayedexpansion
  4. for /f "tokens=1-3 delims=-." %%a in ('dir /b /a-d *.jpg') do (
  5. set a=00000%%a
  6. set b=00000%%b
  7. set _!a:~-5!_!b:~-5!=%%a-%%b.%%c
  8. )
  9. set n=-1
  10. for /f "tokens=2 delims==" %%a in ('set _') do (
  11. set /a n+=1
  12. set m=00000!n!
  13. ren "%%a" "Shot!m:~-5!.jpg"
  14. )
  15. endlocal
  16. pause
复制代码
bat小白,请多指教!谢谢!

TOP

本帖最后由 aloha20200628 于 2024-9-5 12:22 编辑

回复 4# zhengwei007

须从本坛下载 sort.exe v7.6 (http://bcn.bathome.net/tool/7.6/sort.exe)以下批处代码中采用的 sort76.exe 即为此版,与批处脚本放在同目录...
采用 sort76.exe 以便确保 dir/b *.jpg 列表能被处理成楼主所要的排序,例如:

1-1.jpg
1-2.jpg
...
1-10.jpg
...
2-1.jpg
...
11-1.jpg
...

  1. @echo off &setlocal enabledelayedexpansion &set "n=0"
  2. for /f "delims=" %%F in ('dir /b/a-d *.jpg^|sort76 -t "-" -n -k1 -k2') do (
  3. set "nF=0000!n!" &set "nF=!nF:~-5!"
  4. ren "%%F" "Shot!nF!.jpg"
  5. set/a "n+=1"
  6. )
  7. pause&exit/b
复制代码

TOP

已经搞定,谢谢楼上所有的朋友。

TOP

本帖最后由 qixiaobin0715 于 2024-9-5 11:39 编辑

不使用临时文件,不预设变量(或者说设置极少数变量x1/x2/z1/z2/n),不使用第3方:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set /a z1=z2=0
  4. for /f "tokens=1* delims=-" %%i in ('dir /b /a-d *-*.jpg') do (
  5.     set /a x1=%%i,x2=%%~nj
  6.     if !x1! gtr !z1! set /a z1=x1
  7.     if !x2! gtr !z2! set /a z2=x2
  8. )
  9. set n=99999
  10. for /l %%i in (1,1,!z1!) do (
  11.     for /l %%j in (1,1,!z2!) do (
  12.         if exist %%i-%%j.jpg (
  13.             set /a n+=1
  14.             ren %%i-%%j.jpg Shot!n:~1!.jpg
  15.         )
  16.     )
  17. )
  18. pause
复制代码

TOP

本帖最后由 aloha20200628 于 2024-9-5 12:20 编辑


用纯P的goto/call方法确实能自力更生(代码如下),不用 sort76.exe 外援,关键是可以实现动态循环(能够实时修改循环条件及变量),这是 for /L 静态循环的 ‘痛点’,但代价是有可能比6楼代码效率低...
  1. @echo off &setlocal enabledelayedexpansion &set "c=-1"
  2. :abc
  3. set/a "a+=1"
  4. if not exist "!a!-1.jpg" endlocal&pause&exit/b
  5. call :xyz
  6. :xyz
  7. set/a "b+=1,c+=1" &set "sF=!a!-!b!.jpg" &set "nF=0000!c!" &set "nF=!nF:~-5!"
  8. if exist "!sF!" ren "!sF!" "shot!nF!.jpg" & goto :xyz
  9. set "b=" &set/a "c-=1" &goto :abc
复制代码

TOP

本帖最后由 qixiaobin0715 于 2024-9-5 13:25 编辑

就本题来说goto/call虽然能够避免for /l 的空转现象,但goto/call带标签的循环实际效率也是有待商榷的,要进行比较测试有一定的难度,因为测试素材不同对两者的影响差别很大。不必妄下断言,还是存疑吧。另外楼上代码第4行“!a!-1.jpg”最好改为“!a!-*.jpg” 防止出现源文件中缺失“-1”而存在“-2、-3...”的情况而误判。


:xyz下面的代码好像也有问题,比如数值不连续会出问题,比如只有:1-1.jpg 1-3.jpg 1-5.jpg...


不大使用goto和call,但是我觉得上面改为“!a!-*.jpg”也是有问题的,如果是这样... 10-*,11-*,13-*...,不知是否会出问题。

TOP

本帖最后由 aloha20200628 于 2024-9-5 14:46 编辑


谢谢10楼关注 6楼代码和9楼代码只是示例一下两极版本,或者把全部排序交给 sort76.exe 一气呵成,实现高效率,或者假设两个字段的排序均是自然连续的,能用纯P代码尽量简化...

TOP

本帖最后由 qixiaobin0715 于 2024-9-5 15:17 编辑

goto/call这两个命令我用的极少,不是太熟悉。感觉9楼修改修改2个exist判断语句也能实现:
第1句修改为: *-*.jpg;
保留第2句前面部分;从&处另起一行,增加一个exist判断,看看是否存在!a!-*.jpg,存在就goto :xyz,否则就goto :abc;
只是提供个思路,具体修改细节不知,我对这2个命令有点晕。但是这样的话就不那么纯动态了。

TOP

if 到底
  1. @echo off
  2. cd /d "%~dp0"
  3. set /a a=b=1,n=0
  4. :loop
  5. set m=00000%n%
  6. if exist "*-*.jpg" (
  7. if exist "%a%-*.jpg" (
  8. if exist "%a%-%b%.jpg" (
  9. ren "%a%-%b%.jpg" "Shot%m:~-5%.jpg"
  10. set /a n+=1
  11. )
  12. set /a b+=1
  13. ) else (
  14. set /a a+=1,b=1
  15. )
  16. goto :loop
  17. )
  18. pause
复制代码
bat小白,请多指教!谢谢!

TOP

本帖最后由 77七 于 2024-9-5 16:25 编辑
  1. 测试文件
  2. for /l %%l in (1,1,100) do (
  3.         for /l %%m in (1,1,50) do (
  4.                 cd.>%%l-%%m.jpg
  5.         )
  6. )
  7. 2楼
  8. 15:48:19.79
  9. 15:48:25.44
  10. 5楼
  11. 15:49:02.77
  12. 15:49:14.39
  13. 6楼
  14. 15:50:20.02
  15. 15:50:25.33
  16. 8楼
  17. 15:51:17.52
  18. 15:51:23.19
  19. 9楼
  20. 15:52:11.89
  21. 15:52:22.04
  22. 13楼
  23. 15:53:28.72
  24. 15:53:39.69
  25. 测试文件
  26. for /l %%l in (1,3,300) do (
  27.         for /l %%m in (1,3,150) do (
  28.                 cd.>%%l-%%m.jpg
  29.         )
  30. )
  31. 2楼
  32. 15:56:02.20
  33. 15:56:08.06
  34. 5楼
  35. 15:56:41.69
  36. 15:56:57.64
  37. 6楼
  38. 15:57:54.50
  39. 15:57:59.04
  40. 8楼
  41. 15:58:36.08
  42. 15:58:43.98
  43. 9楼
  44. 失败
  45. 13楼
  46. 16:02:56.72
  47. 16:03:49.45
复制代码
仅测试一轮

文件序号连续时,2、6、8楼耗时5-7秒左右,5、9、13楼耗时11-12秒左右
文件序号不连续时,5楼16秒,9楼失败,13楼55秒,其余变化不大
bat小白,请多指教!谢谢!

TOP

本帖最后由 qixiaobin0715 于 2024-9-6 11:20 编辑

回复 13# 77七
既然这么喜欢if,给你找个素材练练手,大概是两三年前的一个帖子,由于关注度不大,原贴未找到。一个大佬用迭代法解决的,在这里设定就用“if到底”求解,文本如下:
  1. 1,8
  2. 2,-8
  3. 3,5
  4. 4,0
  5. 5,25
  6. 6,30
  7. 7,18
  8. 8,50
  9. 9,-12
  10. 10,-22
  11. 11,-5
  12. 12,4
  13. 13,11
  14. 14,20
  15. 15,55
  16. 16,33
  17. 17,-22
  18. 18,-10
  19. 19,-3
  20. 20,10
  21. 21,9
  22. 22,5
  23. 23,0
  24. 24,-5
  25. 25,14
  26. 26,22
  27. 27,50
  28. 28,89
  29. 29,-9
  30. 30,-33
  31. 31,-12
  32. 32,-66
  33. 33,8
  34. 34,-9
  35. 35,8
复制代码
前面是序号,后面是数值。
找出连续3个数值小于等于6;接着连续4个数大于等于10;再接着连续3个数小于等于-2,共10个连续数值。不止一组数值符合以上条件啊,重叠也算。找到后显示序号比如10-19。
要注意第一个条件的数值包含第三个条件的数值。
原贴都是连续3个数值,记得我当时是取巧解决的,这里第二个条件是连续4个数值,增加了一些难度。
没什么实际用处,只是练练手,博得一笑而已,别当回事。

TOP

返回列表