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

[文件操作] 批处理对每种格式的图片重命名并添加序号,webp格式总是多计数一次

写了一个根据图片的扩展名,对文件夹中每种格式的图片重命名并添加序号的小脚本,

运行后的文件名形如:

gif-001.gif,gif-002.gif, ......
jpg-001.jpg, jpg-002.jpg, ......
webp-001.webp, webp-002.webp, .......

运行以后发现:
对于GIF格式和JPG格式的图片,计数后重命名工作正常。

但是webp格式总是多计数一次,
如下图所示:


代码如下:
  1. @echo off
  2. cd /d G:\ZL\DownLoad\JD_Pics_Collection
  3. echo %cd%
  4. for %%i in (*.*) do (ren %%i head%%i)
  5. rem 为了调试方便,本次运行前,先把上次的运行结果前面加个“head”前缀
  6. ren headfile_type_list.txt file_type_list.txt
  7. setlocal enabledelayedexpansion
  8. for /f %%i in (file_type_list.txt) do (
  9.     echo %%i
  10.     set /a count=0
  11.     set file_type=%%i
  12.     for %%j in (*.!file_type!) do (
  13.     echo %%j
  14.     set /a count+=1
  15.     set cond1=ren "%%j" !file_type!-00!count!.!file_type! & echo "%%j" --^> !file_type!-00!count!.!file_type!
  16.     set cond2=ren "%%j" !file_type!-0!count!.!file_type! & echo "%%j" --^> !file_type!-0!count!.!file_type!
  17.     set cond3=ren "%%j" !file_type!-!count!.!file_type! & echo "%%j" --^> !file_type!-!count!.!file_type!
  18.     if !count! LSS 10 (!cond1!) else (if !count! LSS 100 (!cond2!) else (!cond3!))
  19.     )
  20. )
  21. PAUSE
复制代码
调试信息如下:
G:\ZL\DownLoad\JD_Pics_Collection
gif
headgif-001.gif
"headgif-001.gif" --> gif-001.gif
"headgif-001.gif" --> gif-01.gif
"headgif-001.gif" --> gif-1.gif
headgif-002.gif
"headgif-002.gif" --> gif-002.gif
"headgif-002.gif" --> gif-02.gif
"headgif-002.gif" --> gif-2.gif
headgif-003.gif
"headgif-003.gif" --> gif-003.gif
"headgif-003.gif" --> gif-03.gif
"headgif-003.gif" --> gif-3.gif
headgif-004.gif
"headgif-004.gif" --> gif-004.gif
"headgif-004.gif" --> gif-04.gif
"headgif-004.gif" --> gif-4.gif
headgif-005.gif
"headgif-005.gif" --> gif-005.gif
"headgif-005.gif" --> gif-05.gif
"headgif-005.gif" --> gif-5.gif
headgif-006.gif
"headgif-006.gif" --> gif-006.gif
"headgif-006.gif" --> gif-06.gif
"headgif-006.gif" --> gif-6.gif
headgif-007.gif
"headgif-007.gif" --> gif-007.gif
"headgif-007.gif" --> gif-07.gif
"headgif-007.gif" --> gif-7.gif
jpg
headjpg-001.jpg
"headjpg-001.jpg" --> jpg-001.jpg
"headjpg-001.jpg" --> jpg-01.jpg
"headjpg-001.jpg" --> jpg-1.jpg
headjpg-002.jpg
"headjpg-002.jpg" --> jpg-002.jpg
"headjpg-002.jpg" --> jpg-02.jpg
"headjpg-002.jpg" --> jpg-2.jpg
headjpg-003.jpg
"headjpg-003.jpg" --> jpg-003.jpg
"headjpg-003.jpg" --> jpg-03.jpg
"headjpg-003.jpg" --> jpg-3.jpg
headjpg-004.jpg
"headjpg-004.jpg" --> jpg-004.jpg
"headjpg-004.jpg" --> jpg-04.jpg
"headjpg-004.jpg" --> jpg-4.jpg
headjpg-005.jpg
"headjpg-005.jpg" --> jpg-005.jpg
"headjpg-005.jpg" --> jpg-05.jpg
"headjpg-005.jpg" --> jpg-5.jpg
headjpg-006.jpg
"headjpg-006.jpg" --> jpg-006.jpg
"headjpg-006.jpg" --> jpg-06.jpg
"headjpg-006.jpg" --> jpg-6.jpg
webp
headwebp-002.webp
"headwebp-002.webp" --> webp-001.webp
"headwebp-002.webp" --> webp-01.webp
"headwebp-002.webp" --> webp-1.webp
headwebp-003.webp
"headwebp-003.webp" --> webp-002.webp
"headwebp-003.webp" --> webp-02.webp
"headwebp-003.webp" --> webp-2.webp
headwebp-004.webp
"headwebp-004.webp" --> webp-003.webp
"headwebp-004.webp" --> webp-03.webp
"headwebp-004.webp" --> webp-3.webp
headwebp-005.webp
"headwebp-005.webp" --> webp-004.webp
"headwebp-005.webp" --> webp-04.webp
"headwebp-005.webp" --> webp-4.webp
webp-001.webp
"webp-001.webp" --> webp-005.webp
"webp-001.webp" --> webp-05.webp
"webp-001.webp" --> webp-5.webp

请按任意键继续. . .

从调试信息里面看,最后的这一段,
webp-001.webp
"webp-001.webp" --> webp-005.webp
"webp-001.webp" --> webp-05.webp
"webp-001.webp" --> webp-5.webp

webp-001.webp这个文件明明是重命名之后的结果,为啥还会被调用?
感觉很奇怪~

请各位大佬指点一下。
非常感谢!

把所有无参数的循环中存在ren命令的,全部改为for /f形式看看。
1

评分人数

TOP

RE: 根据图片的扩展名,对每种格式的图片重命名并添加序号,webp格式总是多计数一次

把所有无参数的循环中存在ren命令的,全部改为for /f形式看看。
qixiaobin0715 发表于 2023-5-19 10:04


啊哈哈~
谢谢大佬!
大佬牛B(破音)~

改成:

  1. for /f "delims=" %%j in ('dir /a-d-h /b *.!file_type!')
复制代码


以后就啥问题也没有了,
我以后还是用大佬推荐这种写法吧!



:loveliness: :loveliness: :loveliness:

TOP

感觉你写的代码有点乱,这样是不是要清楚一些:
  1. @echo off
  2. for %%i in (gif jpg webp) do (
  3.     setlocal enabledelayedexpansion
  4.     for /f "delims=" %%j in ('dir /b /a-d "*.%%i"') do (
  5.         set /a n+=1
  6.         set m=00!n!
  7.         set m=!m:~-3!
  8.         ren "%%j" "%%i-!m!.%%i"
  9.     )
  10.     endlocal
  11. )
  12. pause
复制代码
未测试,思路应当是这样的。
1

评分人数

TOP

回复 4# qixiaobin0715

大佬,
你这个写法好优雅啊~~
向大佬学习!

谢谢大佬!

TOP

回复 4# qixiaobin0715


再请教一下大佬,
您代码里面的“ endlocal”是干吗用的?不写这一句有啥影响?

小弟东一榔头西一棒槌,自学的批处理,
废了半天劲,
才知道只有用了setlocal enabledelayedexpansion才能让循环里面的值有变化……

TOP

本帖最后由 qixiaobin0715 于 2023-5-19 12:32 编辑

通俗的讲就是结束变量延迟,碰到endlocal后,以前在setlocal----endlocal之间设置的所有的变量均失效。
可以体会一下这段代码:
  1. @echo off
  2. setlocal enabledelayedexpansion
  3. set n=1
  4. echo,!n!
  5. setlocal enabledelayedexpansion
  6. set n=8
  7. echo,!n!
  8. endlocal
  9. echo,!n!
  10. pause
复制代码
1

评分人数

TOP

回复 7# qixiaobin0715

原来是这个意思呀!
懂了。

谢谢大佬!

TOP

返回列表