Board logo

标题: [已解决]求大侠写一批量重命名代码 [打印本页]

作者: hulongzhuo     时间: 2008-3-28 12:04    标题: [已解决]求大侠写一批量重命名代码

求高手写一P处理: 批量重命名

现有文件夹A,该文件夹下全为.JPG格式图像文件,其名字格式均为:

0_6870-7912_071109_173933_2734.jpg
0_6870-7912_071109_173935_2735.jpg
0_6870-7912_071109_173938_2736.jpg
......|                   |           |        |
      |                   |           |        |
      |                   |           |        |
    1                    2           3       4


现要求将竖线指明的第3列数字加1,同样的第4列数字也加1,前面的第1. 2列保持不变,
如将文件        0_6870-7912_071109_173933_2734.jpg
重命名后变为: 0_6870-7912_071109_173934_2735.jpg

依此类推,将全部文件重命名.
望大侠贴个代码,在此先谢过了!!!!!

不好意思,本人的确忽略了一个很重要的问题,忘了说明了,还存在有以0开头的那种,
比如:
0_6870-7912_071109_085109_0273.jpg
0_6870-7912_071109_085112_0274.jpg
0_6870-7912_071109_085115_0275.jpg

这样的情况,第3和第4列是以0开头的了,那么运行就会出错了,说进制不对,该怎么办呢?
并且要改名以后位数不能变动哦,比如最后是4位就得是4位!!

以下是BAT代码:
===============================================
@echo off
for /f "tokens=1-5 delims=._" %%a in ('dir /b *.jpg') do (call :111 %%a %%b %%c %%d %%e)
ren *.jpp *.jpg
pause
exit
:111
set d=%4
set e=%5
:222
if %d:~0,1%==0 (set d=%d:~1% &goto 222)
set /a d+=1
set d=000000%d%
set d=%d:~-6%
:333
if %e:~0,1%==0 (set e=%e:~1% &goto 333)
set /a e+=1
set e=0000%e%
set e=%e:~-4%
ren %1_%2_%3_%4_%5.jpg %1_%2_%3_%d%_%e%.jpp

==============================================

以下是VBS代码:
==============================================
Dim fso, f, fd, arr, path
path="."
Set fso = CreateObject("Scripting.FileSystemObject")
Set fd = fso.GetFolder(path)
for each f in fd.files
    if lcase(right(f,3))="jpg" then
         arr=split(fso.getbasename(f),"_")
         len3=len(arr(3)):len4=len(arr(4))
         arr(3)=arr(3)+1:arr(3)="0000"&arr(3)
         arr(4)=arr(4)+1:arr(4)="0000"&arr(4)
         f.name = arr(0)&"_"&arr(1)&"_"&arr(2)&"_"&right(arr(3),len3)&"_"&right(arr(4),len4)&".jpg"
     end if
next
set fd = nothing
set fso = nothing
==============================================

[ Last edited by hulongzhuo on 2008-3-28 at 05:07 PM ]
作者: hulongzhuo     时间: 2008-3-28 12:09
自已先顶一下了~~~~

在线求答!!
作者: huahua0919     时间: 2008-3-28 12:24

@echo off&&setlocal enabledelayedexpansion
for /f "delims=" %%i in ('dir/b *.jpg') do (
for /f "delims=_. tokens=1,2,3,4,5" %%a in ("%%i") do (
set x=%%d
set y=%%e
set/a x+=1
set/a y+=1
ren %%i %%a_%%b_%%c_!x!_!y!.jpg)
)

作者: hulongzhuo     时间: 2008-3-28 12:37
先谢过3楼的大侠!

另外,我怎么指明路径啊?
比如将A文件夹放在 D:\A ,要怎么加入上面的代码啊?
作者: huahua0919     时间: 2008-3-28 12:39
'dir/b d:\A\*.jpg'
作者: hulongzhuo     时间: 2008-3-28 12:47
回复huahua0919

                  代码没有成功执行, 闪了一下就没反应了,是什么原因呢???
作者: huahua0919     时间: 2008-3-28 12:53
闪过后,看文件有没改掉
作者: hulongzhuo     时间: 2008-3-28 13:01
没有改变,

'dir/b d:\A\*.jpg'   这句话好像不行哦
作者: huahua0919     时间: 2008-3-28 13:05
检查你路径有没空格 有的话 加dir/b "d:\A\*.jpg"
作者: hulongzhuo     时间: 2008-3-28 13:12
@echo off&&setlocal enabledelayedexpansion
d:
cd a
for /f "delims=" %%i in ('dir /b "d:\a\*.jpg"') do (
for /f "delims=_. tokens=1,2,3,4,5" %%a in ("%%i") do (
set x=%%d
set y=%%e
set/a x+=1
set/a y+=1
ren %%i %%a_%%b_%%c_!x!_!y!.jpg)
)


执行后是有反应了,但是第3.4列没有按要求去变化,位数都变得不对了,很乱,好像是没有正确计算一样的..

[ Last edited by hulongzhuo on 2008-3-28 at 03:16 PM ]
作者: bat-zw     时间: 2008-3-28 13:30    标题: 试了下,还只能分两次来:

假设有10个这样的文件
@echo off
for /l %%a in (0,1,9) do call :ren1 %%a
for /l %%a in (0,1,9) do call :ren2 %%a
del a.txt&goto :eof
:ren1
dir /b | more +%1 >a.txt
set /p b=<a.txt
ren %b% %b:0_6870-7912_071109_17393=0_68170-7912_0711109_173913%&goto :eof
:ren2
dir /b | more +%1 >a.txt
set /p b=<a.txt
ren %b% %b:273=2713%&goto :eof
[ Last edited by zw19750516 on 2008-3-28 at 01:37 PM ]
作者: bat-zw     时间: 2008-3-28 13:35
晕,我理解错了,不好意思
作者: 26933062     时间: 2008-3-28 13:52

@echo off&&setlocal enabledelayedexpansion
:: 这里是路径。
set "lj=d:\a"
for /f "delims=" %%i in ('dir/b "%lj%\*.jpg"') do (
  for /f "tokens=1-5 delims=_." %%a in ("%%i") do (
    set /a x=%%d+1,y=%%e+1
    ren "%lj%\%%~nxi" "%%a_%%b_%%c_!x!_!y!.jpg"
))
pause

作者: bat-zw     时间: 2008-3-28 14:03    标题: 也可直接进入路径:

在前面加上:
cd\
d:
cd a
作者: hulongzhuo     时间: 2008-3-28 14:41
13楼的兄弟,,执行后这样的提示:

无效数字。数字常数只能是十进制(17),十六位进制(0x11)或
八进制(021)。
系统找不到指定的文件。

[ Last edited by hulongzhuo on 2008-3-28 at 03:11 PM ]
作者: hulongzhuo     时间: 2008-3-28 14:50
楼上的,提示命令语法不正确,这玩意还真难了~~
作者: hulongzhuo     时间: 2008-3-28 15:01
仍然是失败的,多谢大家的热情帮助了.......................
作者: huajinghua     时间: 2008-3-28 15:13
这么简单都不会
作者: hulongzhuo     时间: 2008-3-28 15:17


  Quote:
Originally posted by huajinghua at 2008-3-28 03:13 PM:
这么简单都不会

你编个试试看?
作者: balinger     时间: 2008-3-28 15:18
@echo off
SETLOCAL ENABLEDELAYEDEXPANSION
for /f "tokens=1-5 delims=._" %%a in ('dir /b *.jpg') do (
set /a sd=1+%%d
set /a se=1+%%e
ren %%a_%%b_%%c_%%d_%%e.jpg %%a_%%b_%%c_!sd!_!se!.jpp)
ren *.jpp *.jpg
pause
作者: abcd     时间: 2008-3-28 15:22
13楼的绝对可以的

问题不在代码,应该是楼主自己的原因
作者: hulongzhuo     时间: 2008-3-28 15:24
运行楼上的提示:

无效数字。数字常数只能是十进制(17),十六位进制(0x11)或
八进制(021)。
作者: hulongzhuo     时间: 2008-3-28 15:29


  Quote:
Originally posted by abcd at 2008-3-28 03:22 PM:
13楼的绝对可以的

问题不在代码,应该是楼主自己的原因

不可以的,提示:
无效数字。数字常数只能是十进制(17),十六位进制(0x11)或
八进制(021)。
存在一个重名文件,或是找不到文件。

好像计算不正确.或是进制不对什么的..........
作者: abcd     时间: 2008-3-28 15:36
如果楼主的图片中 如:0_6870-7912_071109_173933_2734.jpg

有类似0_6870-7912_071109_173933_00002734.jpg等的,就会出现楼主说的错误
作者: hulongzhuo     时间: 2008-3-28 15:42


  Quote:
Originally posted by abcd at 2008-3-28 03:36 PM:
如果楼主的图片中 如:0_6870-7912_071109_173933_2734.jpg

有类似0_6870-7912_071109_173933_00002734.jpg等的,就会出现楼主说的错误

不好意思,本人的确忽略了一个很重要的问题,忘了说明了,还存在有以0开头的那种,
比如:
0_6870-7912_071109_085109_0273.jpg
0_6870-7912_071109_085112_0274.jpg
0_6870-7912_071109_085115_0275.jpg

这样的情况,第3和第4列是以0开头的了,那么运行就会出错了,说进制不对,该怎么办呢?
并且要改名以后位数不能变动哦,比如最后是4位就得是4位!!

[ Last edited by hulongzhuo on 2008-3-28 at 04:07 PM ]
作者: balinger     时间: 2008-3-28 15:43
0开头代表八进制,而八进制数里不能有8、9。
作者: hulongzhuo     时间: 2008-3-28 15:47
我想必须先要取得第3列的文本,然后把文本转换成数值才可以相加,就不会出错,然后再把这数值转成文本,替换掉第三列,第4列亦同.
功底不行,所以只得求助于高人了~~~
作者: huajinghua     时间: 2008-3-28 15:53    标题: 绝对行,把他保存为BAT放在和图片同一目录下。呵呵

@echo off
echo made by 公孙轩辕 QQ:327828994.
setlocal enabledelayedexpansion
for /r  %%i in (*.jpg) do (
set b=%%~ni
for /f "delims=_  tokens=1,2,3,4,5" %%i in ("!b!") do (
set n3=%%l
set n4=%%m
set /a n3=!!n3!+1!
set /a n4=!!n4!+1!
set newname=%%i_%%j_%%k_!n3!_!n4!
)
ren "!b!.jpg"  "!newname!.bmp"
)
ren *.bmp *.jpg
pause
echo 修改成功!


=============
上段代码的*.bmp可以任意换成其他的格式,我改名是怕他在修改后有其他文件重名,所以改掉了

也可以将代码改为:
@echo off
echo made by 公孙轩辕 QQ:327828994.
setlocal enabledelayedexpansion
for /r  %%i in (*.jpg) do (
set b=%%~ni
for /f "delims=_  tokens=1,2,3,4,5" %%i in ("!b!") do (
set n3=%%l
set n4=%%m
set /a n3=!!n3!+1!
set /a n4=!!n4!+1!
set newname=%%i_%%j_%%k_!n3!_!n4!
)
ren "!b!.jpg"  "!newname!.aaa"
)
ren *.aaa *.jpg
pause
echo 修改成功!

[ Last edited by huajinghua on 2008-3-27 at 07:58 PM ]
作者: huajinghua     时间: 2008-3-28 15:54
说了很简单的嘛还不相信
作者: hulongzhuo     时间: 2008-3-28 16:04
不好意思,本人的确忽略了一个很重要的问题,忘了说明了,还存在有以0开头的那种,
比如:
0_6870-7912_071109_085109_0273.jpg
0_6870-7912_071109_085112_0274.jpg
0_6870-7912_071109_085115_0275.jpg

这样的情况,第3和第4列是以0开头的了,那么运行就会出错了,说进制不对,该怎么办呢?
并且要改名以后位数不能变动哦,比如最后是4位就得是4位!!
作者: balinger     时间: 2008-3-28 16:06
@echo off
for /f "tokens=1-5 delims=._" %%a in ('dir /b *.jpg') do (call :111 %%a %%b %%c %%d %%e)
ren *.jpp *.jpg
pause
exit
:111
set d=%4
set e=%5
:222
if %d:~0,1%==0 (set d=%d:~1% &goto 222)
set /a d+=1
set d=000000%d%
set d=%d:~-6%
:333
if %e:~0,1%==0 (set e=%e:~1% &goto 333)
set /a e+=1
set e=0000%e%
set e=%e:~-4%
ren %1_%2_%3_%4_%5.jpg %1_%2_%3_%d%_%e%.jpp
作者: huajinghua     时间: 2008-3-28 16:09
按照那种格式在我的电脑上试了一下可以的用我的代码
作者: bat-zw     时间: 2008-3-28 16:13    标题: 使用通配符:

@echo off&&setlocal enabledelayedexpansion
for /f "delims=_. tokens=4,5" %%b in ('dir /b') do (
    set x=%%b
    set y=%%c
    set /a x+=1
    set /a y+=1   
    ren *%%b_%%c.jpg *!x!_!y!.jpg
    )
作者: hulongzhuo     时间: 2008-3-28 16:15
严重感谢33楼 以及所有为此给予帮助,给予代码,给予提示的大侠们,再次谢谢你们了,问题解决了!!!

高兴中~~~~~~

不知什么时候我才能达到这种水准!!  ~~~~
作者: hulongzhuo     时间: 2008-3-28 16:49
abcd的代码我更是看不懂了,连路径放哪都不知道了,完全摸不着门了~~~
作者: terse     时间: 2008-3-28 17:13
我看变更3楼的就可以解决0开头问题
@echo off
for /f "delims=" %%i in ('dir /b /a-d D:\A\*.jpg') do (
    for /f "delims=_. tokens=1-5" %%a in ("%%i") do (
      set x=%%d
      set y=%%e
      call set/a x=1%%x%%+1
      call set/a y=1%%Y%%+1
      call set x=%%x:~1%%
      call set y=%%y:~1%%
      call ren "%%i" "%%a_%%b_%%c_%%x%%_%%y%%.jpg"
   )
)
pause

[ Last edited by terse on 2008-3-28 at 05:18 PM ]
作者: hulongzhuo     时间: 2008-3-28 17:23


  Quote:
Originally posted by terse at 2008-3-28 05:13 PM:
我看变更3楼的就可以解决0开头问题
@echo off
for /f "delims=" %%i in ('dir /b /a-d D:\A\*.jpg') do (
    for /f "delims=_. tokens=1-5" %%a in ("%%i") d ...

的确是可行的.呵呵~~~
作者: 26933062     时间: 2008-3-28 18:17
哈,还有这么个插曲。
@echo off&&setlocal enabledelayedexpansion
:: 这里是路径。
set "lj=d:\a"
for /f "delims=" %%i in ('dir/b "%lj%\*.jpg"') do (
  for /f "tokens=1-5 delims=_." %%a in ("%%i") do (
    set /a x=1%%d+1,y=1%%e+1
    ren "%lj%\%%~nxi" "%%a_%%b_%%c_!x:~1!_!y:~1!.jpg"
))
pause

作者: dslz666     时间: 2008-3-28 18:46
厉害呀。好多都看不懂,要努力学习。,