|
gundam72
初级用户
积分 40
发帖 19
注册 2008-2-9
状态 离线
|
『楼 主』:
批量随机重命名与反重命名
因为特殊需要,现在需要一个这样的批量处理:
我有一些jpg文件,名称格式是A001,A002这样的
我希望通过批处理给这些文件随机命名,随机命名的格式没有要求,只要尽量不重复,看不出规律就行
然后,我希望随机命名的批处理能够记录下原文件名和其对应的随机名,并能够再次批处理这些随机命名后的文件使它们恢复原来的文件名
不知道我说的够不够清楚...我也是因为这个需要在网上查了各种资料才知道有批处理这种技术可以解决,不过我对批处理一窍不通,看了置顶的教程也不是很懂。希望有好心人能够帮我实现这个功能需求。我自己也会慢慢学习批处理,感觉批处理很有用。所以,就算只是一点点想法或是建议心得之类的,只要是能够实现这个功能的,请大家务必回个帖教教我,我会整理学习的。先谢谢大家了~
另外补充一点,这类文件有将近1000个需要重命名,所以随机数要大一点点,最好就是随机出一串字母的文件名,麻烦了~
[ Last edited by gundam72 on 2008-2-9 at 04:36 PM ]
|
|
2008-2-9 16:27 |
|
|
pinghu
中级用户
积分 307
发帖 130
注册 2008-2-1
状态 离线
|
『第
2 楼』:
你的这个问题我挺感兴趣的,用批处理可以解决,不过我需要时间!
耐心等待,我会给你满意的答案,
|
|
2008-2-9 17:55 |
|
|
gundam72
初级用户
积分 40
发帖 19
注册 2008-2-9
状态 离线
|
|
2008-2-9 18:03 |
|
|
pinghu
中级用户
积分 307
发帖 130
注册 2008-2-1
状态 离线
|
『第
4 楼』:
初步做了一个,里面有错误,有待大家完善
@echo on
setlocal enabledelayedexpansion
:choice
set /p aa=重命名X,恢复H:
if %aa%==x goto :renam
if %aa%==h (goto :resume)else goto :choice
goto :eof
:resume
for /f "tokens=1,2 delims= " %%c in (重命名列表.txt) do (ren %%d %%c)
pause
goto :eof
:renam
del 重命名列表.txt
for %%b in (*.bmp) do (
call :ranwd2
ren %%~nxb !filename!%%~xb
echo %%~nxb !filename!%%~xb >>重命名列表.txt
)
goto :eof
:ranwd2
set word=
for /l %%a in (1,1,8) do (call :ranwd1)
set filename=%word%
goto :eof
:ranwd1
call :ranltr
set word=%word%%letter%
goto :eof
:ranltr
set /a num=%random%%%26
echo %num%
if %num%==1 set letter=a
if %num%==2 set letter=b
if %num%==3 set letter=c
if %num%==4 set letter=d
if %num%==5 set letter=e
if %num%==6 set letter=f
if %num%==7 set letter=g
if %num%==8 set letter=h
if %num%==9 set letter=i
if %num%==10 set letter=j
if %num%==11 set letter=k
if %num%==12 set letter=l
if %num%==13 set letter=m
if %num%==14 set letter=n
if %num%==15 set letter=o
if %num%==16 set letter=p
if %num%==17 set letter=q
if %num%==18 set letter=r
if %num%==19 set letter=s
if %num%==20 set letter=t
if %num%==21 set letter=u
if %num%==22 set letter=v
if %num%==23 set letter=w
if %num%==24 set letter=x
if %num%==25 set letter=y
if %num%==0 set letter=z
goto :eof
|
|
2008-2-9 22:15 |
|
|
pinghu
中级用户
积分 307
发帖 130
注册 2008-2-1
状态 离线
|
『第
5 楼』:
关于重命名后没有检查文件夹里是否存在同名文件,本人正在修正,请不要轻易使用,会导致原文件名的丢失!
|
|
2008-2-9 22:19 |
|
|
slore
铂金会员
积分 5212
发帖 2478
注册 2007-2-8
状态 离线
|
『第
6 楼』:
:ranltr
部分利用set帮助里可以看到可以取某字符串的某位数……
定义一个变量abcde。。。xyz
然后
set /a num=%random%%%26
得到某位,取那位就可以了。。只要3行。。。
|
|
2008-2-9 22:54 |
|
|
pinghu
中级用户
积分 307
发帖 130
注册 2008-2-1
状态 离线
|
『第
7 楼』:
感谢slore的帮助,我一定好好学习set
主要问题是,在我的机器上测试,发现有的文件被重命名两次,却不是重复的文件名引起的,不知何故?
|
|
2008-2-9 23:07 |
|
|
slore
铂金会员
积分 5212
发帖 2478
注册 2007-2-8
状态 离线
|
|
2008-2-9 23:58 |
|
|
slore
铂金会员
积分 5212
发帖 2478
注册 2007-2-8
状态 离线
|
『第
9 楼』:
你不是有记录麽?你的重命名的文件不是要保留结果。
重命名列表.txt
里你看看那个文件被重命名2次了……原因自己一句一句分析
|
|
2008-2-9 23:59 |
|
|
gundam72
初级用户
积分 40
发帖 19
注册 2008-2-9
状态 离线
|
『第
10 楼』:
非常谢谢pinghu兄这么认真的帮我想办法,也感谢slore兄的帮助
不过我有点疑问,别介意
if %num%==1 set letter=a
if %num%==2 set letter=b
if %num%==3 set letter=c
if %num%==4 set letter=d
if %num%==5 set letter=e
if %num%==6 set letter=f
if %num%==7 set letter=g
if %num%==8 set letter=h
if %num%==9 set letter=i
if %num%==10 set letter=j
if %num%==11 set letter=k
if %num%==12 set letter=l
if %num%==13 set letter=m
if %num%==14 set letter=n
if %num%==15 set letter=o
if %num%==16 set letter=p
if %num%==17 set letter=q
if %num%==18 set letter=r
if %num%==19 set letter=s
if %num%==20 set letter=t
if %num%==21 set letter=u
if %num%==22 set letter=v
if %num%==23 set letter=w
if %num%==24 set letter=x
if %num%==25 set letter=y
if %num%==0 set letter=z
这个的意思是不是将字母替换前面的数字?比如用z替换0这样?
可能是我表述的不清,我希望的是能无规则的随机命名,上面的替换法还是很容易能找出规律的。也可能是pinghu兄目前在测试记录命名对应情况,不过我还是先清楚的说出来,怕pinghu兄到时候辛苦帮我做出来结果却不是我想要的。
再次感谢pinghu兄~
|
|
2008-2-10 00:18 |
|
|
slore
铂金会员
积分 5212
发帖 2478
注册 2007-2-8
状态 离线
|
『第
11 楼』:
这段是随机产生某个数
如果是1就是a字符……
也就是想随机产生字母的意思。
|
|
2008-2-10 01:40 |
|
|
terse
银牌会员
积分 2404
发帖 946
注册 2005-9-8
状态 离线
|
『第
12 楼』:
@echo off
:choice
set /p aa=重命名X 恢复H
if %aa%==x goto renam
if %aa%==h (goto resume) else goto :choice
goto :eof
:renam
del 重命名jpg.bat 2>nul
for /f "delims=" %%i in ('dir /b /a-d *.jpg') do (
call :loop "%%i"
)
pause
goto :eof
:loop
for /l %%i in (1,1,8) do (call :lp)
>>重命名jpg.bat echo ren "%var%.jpg" %1
ren %1 "%var%.jpg"
for %%i in (n var) do set %%i=
goto :eof
:lp
set str=jklzxcbnmqvopasdfwertyuigh
set/a s=%random%%%25
call set var=%var%%%str:~%s%,1%%
goto :eof
:resume
重命名jpg.bat
|
简单!简单!再简单! |
|
2008-2-10 02:23 |
|
|
pinghu
中级用户
积分 307
发帖 130
注册 2008-2-1
状态 离线
|
『第
13 楼』:
代码做了部分修正,如slore所说
@echo off
setlocal enabledelayedexpansion
:choice
set /p aa=重命名X,恢复H:
if %aa%==x goto :renam
if %aa%==h (goto :resume)else goto :choice
goto :eof
:resume
for /f "tokens=1,2 delims= " %%c in (重命名列表.txt) do (ren
%%d %%c)
pause
goto :eof
:renam
if exist 重命名列表.txt del 重命名列表.txt
for %%b in (*.bmp) do (
call :ranwd2
ren %%~nxb !filename!%%~xb
echo %%~nxb !filename!%%~xb >>重命名列表.txt
)
goto :eof
:ranwd2
set word=
for /l %%a in (1,1,4) do (call :ranwd1)
if not exist %word%.* (set filename=%word%) else call :ranwd2
goto :eof
:ranwd1
call :ranltr
set word=%word%%letter%
goto :eof
:ranltr
set
letter=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
set /a num=%random%%%52
call call set letter=!letter:~%num%,1!
goto :eof
|
|
2008-2-10 11:14 |
|
|
pinghu
中级用户
积分 307
发帖 130
注册 2008-2-1
状态 离线
|
『第
14 楼』:
以上我脚本中的不足
如果一次不能恢复的话就多恢复几次,一定能成功!目前这个脚本不适于多次重命名,当第二次运行重命名的时候原始的文件名记录就没有了!!
脚本第十八行的bmp改成*的话,就能实现批处理当前目录下的所有文件重命名
另外这个批处理用起来还挺麻烦的,还得放在要命名的文件夹里,我下一部的目标是把他做成鼠标右键调用型的,还有能实现多次重命名,并一次成功还原的!!
|
|
2008-2-10 11:27 |
|
|
pinghu
中级用户
积分 307
发帖 130
注册 2008-2-1
状态 离线
|
『第
15 楼』:
还有,你楼主要的随机字母的位数可以自己定
|
|
2008-2-10 11:29 |
|