在cn-dos发过,现在cn-dos暂时xx,还好我有原稿~ 整理一下发过来
主要话题:
不小心发现,好多 BatchRename (批量重命名) 代码 都有的一个bug ~ dir会把名字排序并列出,但是...
Assume(假设) 存在 0.jpg 1.jpg a.jpg ...
dir得到第一个文件 0.jpg ,按编号会把0.jpg 重命名为 1.jpg 但是1.jpg已经存在了,就会矛盾。
这种矛盾多一些的话,就全乱了。
前传-简洁代码出错
首先,谈谈经典的一句话批量重命名
@echo off
for %%a in (*.jpg) do (set /a n+=1 &call ren %%a %%n%%.jpg)
代码是短,就是ren的时候好多编号都大了一些
我ren 001-099 这些文件,结果出现了100以上的编号,百思不得其解
于是往代码加echo ,看了以后郁闷,那句for居然可以把Ren过的文件再次抓进集合...好先进的功能
先进列表如下
001.jpg - 1
:
:
:
093.jpg - 93
094.jpg - 94
095.jpg - 95
096.jpg - 96
097.jpg - 97
098.jpg - 98
099.jpg - 99
1.jpg - 100 <<----把1.jpg又抓进来了
10.jpg - 101
11.jpg - 102
12.jpg - 103
13.jpg - 104
14.jpg - 105
15.jpg - 106
16.jpg - 107
:
:
而且一般该代码执行过一次以后再试一次,还会出问题的,编号混乱了,重复矛盾了......
改成 for /f "tokens=*" %%a in ('dir *.jpg /b') do ( 就不会出现重复重命名同一个文件的问题了
(这个故事告诉我们,精简的时候,该保留的,就得留着,别老为了“代码一句话”就猛缩代码。)
-----------------------------------------------------------------------
回到主要话题:
dir会把名字排序并列出,
但是存在类似 0.jpg 1.jpg 的情况时,执行第一句ren 0.jpg 1.jpg 就会矛盾.因为1.jpg已经存在
个人临时的解决方案是-
前面先 ren *.jpg *.jpg#
接下来挨个重命名 "xx.jpg#" 为 "编号.jpg" 就不会矛盾了. 只是jpg文件多的时候感觉开头停顿了一下下.
来个自己的代码,粗糙的。
- @echo off
- title code by 523066680 @ cn-dos.net
- if not exist *.jpg (echo,不存在jpg文件&pause>nul&exit)
- setlocal enabledelayedexpansion
- ::判断文件数位数,决定名字前面补0的最大个数.文件数不能多于9位数.
- for %%a in (*.jpg) do set /a a+=1
- set "a=%a%987654321" & set "o=0000000000"
- set /a k=0
- ::避免重命名同名冲突
- ren *jpg *.jpg#
- for /f "tokens=*" %%a in ('dir *.jpg# /b') do (
- set /a k+=1
- set name=%o%!k!
- ren "%%a" "0!name:~-%a:~9,1%!.jpg"
- echo,0!name:~-%a:~9,1%!
- )
复制代码
[ 本帖最后由 523066680 于 2009-7-26 15:29 编辑 ] |