标题: 批量随机重命名与反重命名
[打印本页]
作者: gundam72
时间: 2008-2-9 16:27
标题: 批量随机重命名与反重命名
因为特殊需要,现在需要一个这样的批量处理:
我有一些jpg文件,名称格式是A001,A002这样的
我希望通过批处理给这些文件随机命名,随机命名的格式没有要求,只要尽量不重复,看不出规律就行
然后,我希望随机命名的批处理能够记录下原文件名和其对应的随机名,并能够再次批处理这些随机命名后的文件使它们恢复原来的文件名
不知道我说的够不够清楚...我也是因为这个需要在网上查了各种资料才知道有批处理这种技术可以解决,不过我对批处理一窍不通,看了置顶的教程也不是很懂。希望有好心人能够帮我实现这个功能需求。我自己也会慢慢学习批处理,感觉批处理很有用。所以,就算只是一点点想法或是建议心得之类的,只要是能够实现这个功能的,请大家务必回个帖教教我,我会整理学习的。先谢谢大家了~
另外补充一点,这类文件有将近1000个需要重命名,所以随机数要大一点点,最好就是随机出一串字母的文件名,麻烦了~
Last edited by gundam72 on 2008-2-9 at 04:36 PM ]
作者: pinghu
时间: 2008-2-9 17:55
你的这个问题我挺感兴趣的,用批处理可以解决,不过我需要时间!
耐心等待,我会给你满意的答案,
作者: gundam72
时间: 2008-2-9 18:03
非常感谢,我会耐心等的
作者: pinghu
时间: 2008-2-9 22:15
标题: 初步做了一个,里面有错误,有待大家完善
@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
作者: pinghu
时间: 2008-2-9 22:19
关于重命名后没有检查文件夹里是否存在同名文件,本人正在修正,请不要轻易使用,会导致原文件名的丢失!
作者: slore
时间: 2008-2-9 22:54
:ranltr
部分利用set帮助里可以看到可以取某字符串的某位数……
定义一个变量abcde。。。xyz
然后
set /a num=%random%%%26
得到某位,取那位就可以了。。只要3行。。。
作者: pinghu
时间: 2008-2-9 23:07
感谢slore的帮助,我一定好好学习set
主要问题是,在我的机器上测试,发现有的文件被重命名两次,却不是重复的文件名引起的,不知何故?
作者: slore
时间: 2008-2-9 23:58
先echo看看。。。测试的时候
作者: slore
时间: 2008-2-9 23:59
你不是有记录麽?你的重命名的文件不是要保留结果。
重命名列表.txt
里你看看那个文件被重命名2次了……原因自己一句一句分析
作者: gundam72
时间: 2008-2-10 00:18
非常谢谢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兄~
作者: slore
时间: 2008-2-10 01:40
这段是随机产生某个数
如果是1就是a字符……
也就是想随机产生字母的意思。
作者: terse
时间: 2008-2-10 02:23
@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
作者: pinghu
时间: 2008-2-10 11:14
标题: 代码做了部分修正,如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
作者: pinghu
时间: 2008-2-10 11:27
标题: 以上我脚本中的不足
如果一次不能恢复的话就多恢复几次,一定能成功!目前这个脚本不适于多次重命名,当第二次运行重命名的时候原始的文件名记录就没有了!!
脚本第十八行的bmp改成*的话,就能实现批处理当前目录下的所有文件重命名
另外这个批处理用起来还挺麻烦的,还得放在要命名的文件夹里,我下一部的目标是把他做成鼠标右键调用型的,还有能实现多次重命名,并一次成功还原的!!
作者: pinghu
时间: 2008-2-10 11:29
还有,你楼主要的随机字母的位数可以自己定
作者: pinghu
时间: 2008-2-10 11:37
寻求一个能实现文本文件逐行倒序的批处理,具体是
最后一行变成第一行,倒数第二行变成第二行,依次类推
作者: gundam72
时间: 2008-2-10 12:45
terse兄提供的代码能够正常的随机命名和恢复原名,谢谢帮助~
另外你代码里的随机范围是小写字母,如果我想把大写字母和数字也添加到随机列表里应该怎么改?中文字能否作为随机数?
pinghu兄,你那段代码我复制到文本再改成.bat后可以运行,但是有点问题
比如我在某文件夹里有A001.bmp,A002.bmp,A003.bmp,A004.bmp这4个文件
运行你的bat后输入x然后只有第一个A001.bmp变成了.bmp其他的还是原名,运行了几次都是这样,重命名列表生成了,以下是里面的内容:
A001.bmp .bmp
A002.bmp .bmp
A003.bmp .bmp
A004.bmp .bmp
麻烦了~
作者: pinghu
时间: 2008-2-10 13:10
标题: 更新了程序
@echo off
setlocal enabledelayedexpansion
call :%* 2>nul || goto choice
goto :eof
:choice
set /p aa=安装右键菜单A,卸载右键菜单X:
if %aa%==a goto :install
if %aa%==x (goto :uninstall)else goto :choice
goto :eof
:resume
cd "%~1"
if not exist 重命名列表.txt (echo 这个文件夹里没有“重命名列表.txt”,无法恢复&pause&goto :eof)
for /f "tokens=1,2 delims= " %%c in (重命名列表.txt) do (ren %%d %%c)
goto :eof
:renam
cd "%~1"
if exist 重命名列表.txt echo 当前文件夹下已存在一个重命名列表,再次重命名会导致原文件名列表的丢失,如要重命名先手动删除这个文件夹下的“重命名列表.txt”,这样较为稳妥&pause&goto :eof
set /p nn=请输入随机字母的位数:
if exist 重命名列表.txt del 重命名列表.txt
for %%b in (*.*) do (
call :ranwd2
ren %%~nxb !filename!%%~xb
echo %%~nxb !filename!%%~xb >>重命名列表.txt
)
goto :eof
:ranwd2
set word=
for /l %%a in (1,1,%nn%) 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 set letter=!letter:~%num%,1!
goto :eof
:install
reg add "hkcr\directory\shell\文件夹内文件随机字母重命名\command" /f /t reg_sz /v "" /d "\"%~0\" renam \"%%1\""
reg add "hkcr\directory\shell\反重命名\command" /f /t reg_sz /v "" /d "\"%~0\" resume \"%%1\""
goto :eof
:uninstall
reg delete "hkcr\directory\shell\反重命名" /f
reg delete "hkcr\directory\shell\文件夹内文件随机字母重命名" /f
goto :eof
这个脚本做了如下更新:
调用右键菜单执行
重命名所选中文件夹下的所有文件
随机字母(包括大小写)的位数由你确定
增加了重命名校验
使用方法:
安装时先执行自身一次,再在选中的文件夹上调用鼠标右键,选择命令
卸载时在执行一次
注意: 不要把该批处理放到要执行的目标文件夹里,
如果安装后移动了该批处理,会出错,解决办法是重新安装一次
待解决的问题:
有时需要执行几次恢复,既恢复后如出现有的文件名没有被恢复的情况,再次执行恢复知道完全恢复为之
作者: pinghu
时间: 2008-2-10 13:12
标题: 修正了一个小bug,在发一遍
@echo off
setlocal enabledelayedexpansion
call :%* 2>nul || goto choice
goto :eof
:choice
set /p aa=安装右键菜单A,卸载右键菜单X:
if /a %aa%==a goto :install
if /a %aa%==x (goto :uninstall)else goto :choice
goto :eof
:resume
cd "%~1"
if not exist 重命名列表.txt (echo 这个文件夹里没有“重命名列表
.txt”,无法恢复&pause&goto :eof)
for /f "tokens=1,2 delims= " %%c in (重命名列表.txt) do (ren
%%d %%c)
goto :eof
:renam
cd "%~1"
if exist 重命名列表.txt echo 当前文件夹下已存在一个重命名列表
,再次重命名会导致原文件名列表的丢失,如要重命名先手动删除这个
文件夹下的“重命名列表.txt”,这样较为稳妥&pause&goto :eof
set /p nn=请输入随机字母的位数:
if exist 重命名列表.txt del 重命名列表.txt
for %%b in (*.*) do (
call :ranwd2
ren %%~nxb !filename!%%~xb
echo %%~nxb !filename!%%~xb >>重命名列表.txt
)
goto :eof
:ranwd2
set word=
for /l %%a in (1,1,%nn%) 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 set letter=!letter:~%num%,1!
goto :eof
:install
reg add "hkcr\directory\shell\文件夹内文件随机字母重命名
\command" /f /t reg_sz /v "" /d "\"%~0\" renam \"%%1\""
reg add "hkcr\directory\shell\反重命名\command" /f /t
reg_sz /v "" /d "\"%~0\" resume \"%%1\""
goto :eof
:uninstall
reg delete "hkcr\directory\shell\反重命名" /f
reg delete "hkcr\directory\shell\文件夹内文件随机字母重命
名" /f
goto :eof
作者: terse
时间: 2008-2-10 13:50
Originally posted by pinghu at 2008-2-10 11:37:
寻求一个能实现文本文件逐行倒序的批处理,具体是
最后一行变成第一行,倒数第二行变成第二行,依次类推
搜索 论坛有
作者: pinghu
时间: 2008-2-10 13:58
标题: 再次更新
@echo off
setlocal enabledelayedexpansion
call :%* 2>nul || goto choice
goto :eof
:choice
set /p aa=安装右键菜单A,卸载右键菜单X:
if %aa%==a goto :install
if %aa%==x (goto :uninstall)else goto :choice
goto :eof
:resume
cd "%~1"
if not exist 重命名列表.txt (echo 这个文件夹里没有“重命名列表.txt”,无法恢复&pause&goto :eof)
for /f "tokens=1,2 delims=^|" %%c in (重命名列表.txt) do (ren %%d %%c)
goto :eof
:renam
cd "%~1"
if exist 重命名列表.txt echo 当前文件夹下已存在一个重命名列表,再次重命名会导致原文件名列表的丢失,如要重命名先手动删除这个文件夹下的“重命名列表.txt”,这样较为稳妥&pause&goto :eof
set /p nn=请输入随机字母的位数:
if exist 重命名列表.txt del 重命名列表.txt
for %%b in (*.*) do (
call :ranwd2
ren %%~nxb !filename!%%~xb
echo %%~nxb^|!filename!%%~xb >>重命名列表.txt
)
goto :eof
:ranwd2
set word=
for /l %%a in (1,1,%nn%) 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=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
set /a num=%random%%%62
call set letter=!letter:~%num%,1!
goto :eof
:install
reg add "hkcr\directory\shell\文件夹内文件随机字母重命名\command" /f /t reg_sz /v "" /d "\"%~0\" renam \"%%1\""
reg add "hkcr\directory\shell\反重命名\command" /f /t reg_sz /v "" /d "\"%~0\" resume \"%%1\""
goto :eof
:uninstall
reg delete "hkcr\directory\shell\反重命名" /f
reg delete "hkcr\directory\shell\文件夹内文件随机字母重命名" /f
goto :eof
本次更新增加了随机数字
作者: pinghu
时间: 2008-2-10 14:00
说明一下,我的系统是Xp,在我的机器上调试成功,不知道是否支持其他的windows系统
作者: gundam72
时间: 2008-2-10 14:59
pinghu兄最新的这个代码已经很好的实现我需要的功能了,在功能方面已经没有什么更高的要求了,感谢感谢~
另外...还是要挑些毛病...原谅我...
需要执行几次才能恢复的问题确实存在,不过最后都能恢复。
另外还有一个问题,就是当文件夹内文件比较多时(我测试的是73个文件)进行重命名后文件夹内会出现2个文本,一个名为“重命名列表.txt”,里面的内容如下:重命名列表.txt|A95KDRBLz.txt
另外还有一个名为“A95KDRBLz.txt ”的文本
此时再对该文件夹进行反重命名无效,必须删除重命名列表.txt并将A95KDRBLz.txt 改名为重命名列表.txt才能进行反重命名,并能成功,一个小小的bug吧
个人认为是在对所有文件进行重命名后生成了重命名列表.txt并再一次对该txt文件进行了一次单独的重命名,希望pinghu兄修改一下
作者: pinghu
时间: 2008-2-10 15:28
我对200多个图片进行测试,结果跟你测试的结果一样,谢谢你的反馈!!
我会改正的,新的代码正在调试……
作者: gundam72
时间: 2008-2-10 15:38
pinghu兄这么认真的帮我解决问题,我只有认真的试用才能略表感谢之意
话说最近忙糊涂了,都忘了还在过年呢
pinghu兄鼠年快乐~
作者: pinghu
时间: 2008-2-10 15:54
标题: 修正了重命名列表被改名的问题
@echo off
setlocal enabledelayedexpansion
call :%* 2>nul || goto choice
goto :eof
:choice
set /p aa=安装右键菜单A,卸载右键菜单X:
if %aa%==a goto :install
if %aa%==x (goto :uninstall)else goto :choice
goto :eof
:resume
cd /d "%~1"
if not exist 重命名列表.txt (echo 这个文件夹里没有“重命名列表.txt”,无法恢复&pause&goto :eof)
for /f "tokens=1,2 delims=^|" %%c in (重命名列表.txt) do (ren %%d %%c)
goto :eof
:renam
cd /d "%~1"
if exist 重命名列表.txt echo 当前文件夹下已存在一个重命名列表,再次重命名会导致原文件名列表的丢失,如要重命名先手动删除这个文件夹下的“重命名列表.txt”,这样较为稳妥&pause&goto :eof
set /p nn=请输入随机字母的位数:
if exist 重命名列表.txt del 重命名列表.txt
for %%b in (*.*) do (
if "%%~nxb"=="重命名列表.txt" goto :eof
call :ranwd2
ren %%~nxb !filename!%%~xb
echo %%~nxb^|!filename!%%~xb >>重命名列表.txt
)
goto :eof
:ranwd2
set word=
for /l %%a in (1,1,%nn%) 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=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
set /a num=%random%%%62
call set letter=!letter:~%num%,1!
goto :eof
:install
reg add "hkcr\directory\shell\文件夹内文件随机字母重命名\command" /f /t reg_sz /v "" /d "\"%~0\" renam \"%%1\""
reg add "hkcr\directory\shell\反重命名\command" /f /t reg_sz /v "" /d "\"%~0\" resume \"%%1\""
goto :eof
:uninstall
reg delete "hkcr\directory\shell\反重命名" /f
reg delete "hkcr\directory\shell\文件夹内文件随机字母重命名" /f
goto :eof
最后一个问题仍然有待解决
需要多次恢复才行的问题,这个问题可能是由于计算机运算系统造成
我拿1200多个文件进行了试验,发现恢复需要一百多次,文件多的时候这是个不小的bug吧
同样祝你新年快乐,家人平安!!
作者: pinghu
时间: 2008-2-10 16:33
标题: 修正了不能一次恢复的漏洞
@echo off
setlocal enabledelayedexpansion
call :%* 2>nul || goto choice
goto :eof
:choice
set /p aa=安装右键菜单A,卸载右键菜单X:
if %aa%==a goto :install
if %aa%==x (goto :uninstall)else goto :choice
goto :eof
:resume
cd /d "%~1"
if not exist 重命名列表.txt (echo 这个文件夹里没有“重命名列表.txt”,无法恢复&pause&goto :eof)
del 临时.txt 2>nul
for /F "tokens=1* delims=:" %%i in ('findstr /n .* 重命名列表.txt') do set "line=%%i" &set "num%%i=%%j"
for /L %%i in (!line!,-1,1) do (>> 临时.txt echo.!num%%i!)
for /f "tokens=1,2 delims=^|" %%c in (临时.txt) do (ren %%d %%c)
del 临时.txt
goto :eof
:renam
cd /d "%~1"
if exist 重命名列表.txt echo 当前文件夹下已存在一个重命名列表,再次重命名会导致原文件名列表的丢失,如要重命名先手动删除这个文件夹下的“重命名列表.txt”,这样较为稳妥&pause&goto :eof
set /p nn=请输入随机字母的位数:
for %%b in (*.*) do (
if "%%~nxb"=="重命名列表.txt" goto :eof
call :ranwd2
ren %%~nxb !filename!%%~xb
echo %%~nxb^|!filename!%%~xb >>重命名列表.txt
)
goto :eof
:ranwd2
set word=
for /l %%a in (1,1,%nn%) 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=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
set /a num=%random%%%62
call set letter=!letter:~%num%,1!
goto :eof
:install
reg add "hkcr\directory\shell\文件夹内文件随机字母重命名\command" /f /t reg_sz /v "" /d "\"%~0\" renam \"%%1\""
reg add "hkcr\directory\shell\反重命名\command" /f /t reg_sz /v "" /d "\"%~0\" resume \"%%1\""
goto :eof
:uninstall
reg delete "hkcr\directory\shell\反重命名" /f
reg delete "hkcr\directory\shell\文件夹内文件随机字母重命名" /f
goto :eof
我对2000多个文件测试成功,不满意的话再回帖
作者: terse
时间: 2008-2-10 17:26
再上一个 没进行多文件测试
@echo off
for /f "delims=" %%i in ('dir /b /a-d "重命名*.bat" 2^>nul') do set n=%%~ni
set n=%n:重命名=%
if not exist 重命名.bat set fils=重命名.bat&&goto choice
set/a n+=1
set fils=重命名%n%.bat
:choice
set /p aa=重命名X 恢复H
if %aa%==x goto renam
if %aa%==h (goto resume) else goto :choice
goto :eof
:renam
for /f "delims=" %%i in ('dir /b /a-d *.jpg') do (
call :loop "%%i"
)
pause
goto :eof
:loop
for /l %%i in (1,1,10) do (call :lp)
>>%fils% echo ren "%var%.jpg" %1
ren %1 "%var%.jpg"
for %%i in (n var) do set %%i=
goto :eof
:lp
set str=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
set/a s=%random%%%62
call set var=%var%%%str:~%s%,1%%
goto :eof
:resume
if not exist 重命名.bat (echo 之前没有进行重命名操作 无法恢复&pause&goto :eof)
echo 之前共操作了%n%次重命名
set/p t=恢复之前第几次操作
set/a t-=1
if %n% equ 1 set fils=重命名.bat &&goto resume2
:hf
set/a n-=1
set fils=重命名%n%.bat
:resume2
if %n% equ 0 set fils=重命名.bat
call %fils%
del %fils%
if %n% equ %t% goto :eof
goto hf
作者: pinghu
时间: 2008-2-10 17:53
terse兄,我帮你测试了,提示我找不到文件!
作者: pinghu
时间: 2008-2-10 17:54
这个代码只能支持jpg文件的重命名,还需要改进一下
作者: pinghu
时间: 2008-2-10 18:00
30楼的话是对terse兄讲的,另外我的考虑:(对terse说)
将已经重命名为随机字符再次重命名为随机字符,可以实现倒是可以实现,是否有意义?
作者: gundam72
时间: 2008-2-10 18:02
pinghu兄和terse兄的两个我都测试了下
在功能上来说pinghu兄的要好些,能够设定重命名的位数并且集成在鼠标右键这点比较方便
在执行效率上来说terse兄的好,我对739个文件测试了下,terse兄的随机命名速度要快很多,不知道是不是随机策略不同呢?恢复原名的速度基本一样
这2个都已经能用了,非常感谢你们的帮助~
作者: gundam72
时间: 2008-2-10 18:07
另外补充一点,terse兄的随机重命名后有提示这点比较好,在对多文件进行重命名时比较重要,希望pinghu兄可以改进一下
作者: gundam72
时间: 2008-2-10 18:11
上面的这个建议有点问题
pinghu兄的随机重命名完成后是直接退出,也可以的
作者: pinghu
时间: 2008-2-10 18:12
看来terse兄的代码我还是没会用,教教我怎么用
作者: gundam72
时间: 2008-2-10 18:27
很奇怪,terse兄的我怎么越用越慢...可能我机子的问题
现在看来terse兄和pinghu兄的执行效率上还是差不多的,恢复方面pinghu兄的要快些
作者: gundam72
时间: 2008-2-10 18:31
pinghu兄和terse兄的2个代码都可以用,个人还是比较喜欢pinghu兄的,功能方面更完善些,terse兄的随机命名后生成的重命名.bat方便这些文件在别的机子上进行恢复,也不错
真的很谢谢你们的热心帮助
作者: gundam72
时间: 2008-2-10 18:37
批处理真的很神奇,2k不到的程序就能解决问题
呵呵,等有时间了一定也好好的学习批处理
作者: gundam72
时间: 2008-2-10 18:44
这个程序我觉得还有完善的空间
能否实现文件名位数在一定范围内变动,比如命名成a1,fb2sw,2ie这样呢?
作者: slore
时间: 2008-2-10 18:57
随机先生成一个位数……那么都写那么多,不难。呵呵
我是拿来主义~超懒……你们继续努力。
作者: terse
时间: 2008-2-10 19:35
Originally posted by pinghu at 2008-2-10 17:54:
这个代码只能支持jpg文件的重命名,还需要改进一下
修改了一下
Originally posted by pinghu at 2008-2-10 17:53:
terse兄,我帮你测试了,提示我找不到文件!
@echo off
for /f "delims=" %%i in ('dir /b /a-d "重命名*.bat" 2^>nul') do set n=%%~ni
set n=%n:重命名=%
if not exist 重命名.bat set fils=重命名.bat&&goto choice
set/a n+=1
set fils=重命名%n%.bat
:choice
set /p aa=重命名X 恢复H
if %aa%==x goto renam
if %aa%==h (goto resume) else goto :choice
goto :eof
:renam
set /p pt=请输入随机字母的位数:
for /f "delims=" %%i in ('dir /b /a-d *.*^|findstr /v "^重命名.*.bat$"') do (
set nx=%%~xi
if not "%%~fi" == "%~f0" call :loop "%%i"
)
>>%fils% echo del %%0
pause
goto :eof
:loop
for /l %%i in (1,1,%pt%) do (call :lp)
>>%fils% echo ren "%var%%nx%" %1
ren %1 "%var%%nx%"
for %%i in (n var) do set %%i=
goto :eof
:lp
set str=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
set/a s=%random%%%62
call set var=%var%%%str:~%s%,1%%
goto :eof
:resume
if not exist 重命名.bat (echo 之前没有进行重命名操作 无法恢复&pause&goto :eof)
echo 之前共操作了%n%次重命名
set/p t=恢复之前第几次操作
set/a t-=1
if %n% equ 1 set fils=重命名.bat &&goto resume2
:hf
set/a n-=1
set fils=重命名%n%.bat
:resume2
if %n% equ 0 set fils=重命名.bat
call %fils%
if %n% equ %t% goto :eof
goto hf
作者: pinghu
时间: 2008-2-10 19:38
我认为文件名长度一样的比较好看,随机的长度也是很容易实现的
作者: gundam72
时间: 2008-2-10 19:46
因为我需要将一些比较大的资源做成伪图片格式上传的163相册保存,但是网易最近在封杀文件名有规律的图片,所以我才想到要随机命名,如果能实现文件名长度在一定范围内随机的话就最好了
作者: pinghu
时间: 2008-2-10 20:02
标题: 修正了只能手动删除文件名列表的bug
@echo off
setlocal enabledelayedexpansion
call :%* 2>nul || goto choice
goto :eof
:choice
set /p aa=安装右键菜单A,卸载右键菜单X:
if %aa%==a goto :install
if %aa%==x (goto :uninstall)else goto :choice
goto :eof
:resume
cd /d "%~1"
if not exist 重命名列表.txt (echo 这个文件夹里没有“重命名列表.txt”,无法恢复&pause&goto :eof)
del 临时.txt 2>nul
for /F "tokens=1* delims=:" %%i in ('findstr /n .* 重命名列表.txt') do set "line=%%i" &set "num%%i=%%j"
for /L %%i in (!line!,-1,1) do (>> 临时.txt echo.!num%%i!)
for /f "tokens=1,2 delims=^|" %%c in (临时.txt) do (ren %%d %%c)
del 临时.txt
goto :eof
:renam
cd /d "%~1"
if exist 重命名列表.txt set /p cc=当前文件夹下已存在一个重命名列表,再次重命名会导致原始文件名列表的丢失,如要继续请按A:
if /i %cc%==a (goto :next) else goto :eof
:next
del 重命名列表.txt
set /p nn=请输入随机字母的位数:
for %%b in (*.*) do (
if "%%~nxb"=="重命名列表.txt" goto :eof
call :ranwd2
ren %%~nxb !filename!%%~xb
echo %%~nxb^|!filename!%%~xb >>重命名列表.txt
)
goto :eof
:ranwd2
set word=
for /l %%a in (1,1,%nn%) 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=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
set /a num=%random%%%62
call set letter=!letter:~%num%,1!
goto :eof
:install
reg add "hkcr\directory\shell\文件夹内文件随机字母重命名\command" /f /t reg_sz /v "" /d "\"%~0\" renam \"%%1\""
reg add "hkcr\directory\shell\反重命名\command" /f /t reg_sz /v "" /d "\"%~0\" resume \"%%1\""
goto :eof
:uninstall
reg delete "hkcr\directory\shell\反重命名" /f
reg delete "hkcr\directory\shell\文件夹内文件随机字母重命名" /f
goto :eof
作者: pinghu
时间: 2008-2-10 20:06
问一下楼主:你用这个批处理做什么呢,管理网站吗?
作者: gundam72
时间: 2008-2-10 20:52
是这样的,网易放出这样的话说,网易旗下的163相册将永久保存用户上传的图片,每张图片限制为10mb
于是有人就想办法将大文件分割成很多小的文件再伪装成图片格式上传到163相册进行永久保存,一般这种方式得到的伪图都是按一定的顺序命名的
因为这种方法得到了广泛的流转,以这种方式上传大文件到163的人多了,网易的服务器可能有点承担不了,所以网易现在开始封杀这类命名太规律化的图片
可是网易的服务器真的是很强悍,对国内所有的网络都能很好的支持,所以我就在想通过随机命名来避免网易的封杀,只要网易不按流量封杀,现在这种随机命名方式应该可以避免网易的封杀了
作者: gundam72
时间: 2008-2-10 20:57
pinghu兄,你最新给的那个代码无法命名,一运行就没了
作者: gundam72
时间: 2008-2-10 20:58
如果位数随机也比较好实现的话,请pinghu兄也帮我实现一下吧
作者: pinghu
时间: 2008-2-10 21:19
标题: 我又做了一个随机位数的
@echo off
setlocal enabledelayedexpansion
call :%* 2>nul || goto choice
goto :eof
:choice
set /p aa=安装右键菜单A,卸载右键菜单X:
if %aa%==a goto :install
if %aa%==x (goto :uninstall)else goto :choice
goto :eof
:resume
cd /d "%~1"
if not exist 重命名列表.txt (echo 这个文件夹里没有“重命名列表.txt”,无法恢复&pause&goto :eof)
del 临时.txt 2>nul
for /F "tokens=1* delims=:" %%i in ('findstr /n .* 重命名列表.txt') do set "line=%%i" &set "num%%i=%%j"
for /L %%i in (!line!,-1,1) do (>> 临时.txt echo.!num%%i!)
for /f "tokens=1,2 delims=^|" %%c in (临时.txt) do (ren %%d %%c)
del 临时.txt
goto :eof
:renam
cd /d "%~1"
if not exist 重命名列表.txt goto :next
if exist 重命名列表.txt set /p cc=当前文件夹下已存在一个重命名列表,再次重命名会导致原始文件名列表的丢失,如要继续请按A:
if /i %cc%==a (goto :next) else goto :eof
:next
del 重命名列表.txt
set /p mm=请输入随机字母位数的上限值:
for %%b in (*.*) do (
if "%%~nxb"=="重命名列表.txt" goto :eof
call :ranwd2
ren %%~nxb !filename!%%~xb
echo %%~nxb^|!filename!%%~xb >>重命名列表.txt
)
goto :eof
:ranwd2
set word=
set /a nn=%random%%%%mm%+1
for /l %%a in (1,1,%nn%) 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=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
set /a num=%random%%%62
call set letter=!letter:~%num%,1!
goto :eof
:install
reg add "hkcr\directory\shell\文件夹内文件随机字母重命名\command" /f /t reg_sz /v "" /d "\"%~0\" renam \"%%1\""
reg add "hkcr\directory\shell\反重命名\command" /f /t reg_sz /v "" /d "\"%~0\" resume \"%%1\""
goto :eof
:uninstall
reg delete "hkcr\directory\shell\反重命名" /f
reg delete "hkcr\directory\shell\文件夹内文件随机字母重命名" /f
goto :eof
上个版本有个bug:
,如果源文件夹中没有重命名列表.txt文件,直接退出
现在已修复
作者: gundam72
时间: 2008-2-10 21:30
这个版本很好用,虽然说了很多遍了,不过还是要感谢pinghu兄这2天对我的帮助,辛苦了
作者: pinghu
时间: 2008-2-10 21:51
只要楼主满意我比什么都高兴,我在写程序的过程中也学到了不少东西,不懂的时候我还发帖提问,比如:不知道你注意没有,今天我发帖子求一个文本逐行倒序的批处理,主要是要解决一次恢复的问题,如果那个帖子我没得到答案的话,这个批处理就不会成功!是terse兄给了我很大的帮助,我在这里要感谢terse!!
作者: pinghu
时间: 2008-2-11 12:01
标题: 这次更新精简了代码,提高了运算速度
@echo off
setlocal enabledelayedexpansion
call :%* 2>nul || goto choice
goto :eof
:choice
set /p aa=安装右键菜单A,卸载右键菜单X:
if %aa%==a goto :install
if %aa%==x (goto :uninstall)else goto :choice
goto :eof
:resume
cd /d "%~1"
if not exist 重命名列表.txt (echo 这个文件夹里没有“重命名列表
.txt”,无法恢复&pause&goto :eof)
del 临时.txt 2>nul
for /F "tokens=1* delims=:" %%i in ('findstr /n .* 重命名列
表.txt') do set "line=%%i" &set "num%%i=%%j"
for /L %%i in (!line!,-1,1) do (>> 临时.txt echo.!num%%i!)
for /f "tokens=1,2 delims=^|" %%c in (临时.txt) do (ren %%d %
%c)
del 临时.txt
goto :eof
:renam
cd /d "%~1"
if not exist 重命名列表.txt goto :next
if exist 重命名列表.txt set /p aa=当前文件夹下已存在一个重命名
列表,再次重命名会导致原始文件名列表的丢失,如要继续请按A,如要
退出请按任意键:
if /i %aa%==a (goto :next) else goto :eof
:next
del 重命名列表.txt
set /p mm=请输入随机字母位数的上限值:
for %%b in (*.*) do (
if "%%~nxb"=="重命名列表.txt" goto :eof
call :ranwrd
if not exist %word%.* call :ranwrd
ren %%~nxb !word!%%~xb
echo %%~nxb^|!word!%%~xb >>重命名列表.txt
)
goto :eof
:ranwrd
set word=
set /a nn=%random%%%%mm%+1
for /l %%a in (1,1,%nn%) do (call :ranltr)
goto :eof
:ranltr
set
letter=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRS
TUVWXYZ
set /a num=%random%%%62
call set letter=!letter:~%num%,1!
set word=%word%%letter%
goto :eof
:install
reg add "hkcr\directory\shell\文件夹内文件随机字母重命名
\command" /f /t reg_sz /v "" /d "\"%~0\" renam \"%%1\""
reg add "hkcr\directory\shell\反重命名\command" /f /t
reg_sz /v "" /d "\"%~0\" resume \"%%1\""
goto :eof
:uninstall
reg delete "hkcr\directory\shell\反重命名" /f
reg delete "hkcr\directory\shell\文件夹内文件随机字母重命
名" /f
goto :eof
作者: pinghu
时间: 2008-2-11 12:58
标题: 加入了上限数字校验
@echo off
setlocal enabledelayedexpansion
color 0a
call :%* 2>nul || goto choice
goto :eof
:choice
set /p aa=安装右键菜单A,卸载右键菜单X:
if %aa%==a goto :install
if %aa%==x (goto :uninstall)else goto :choice
goto :eof
:resume
cd /d "%~1"
if not exist 重命名列表.txt (echo 这个文件夹里没有“重命名列表.txt”,无法恢复&pause&goto :eof)
del 临时.txt 2>nul
for /F "tokens=1* delims=:" %%i in ('findstr /n .* 重命名列表.txt') do set "line=%%i" &set "num%%i=%%j"
for /L %%i in (!line!,-1,1) do (>> 临时.txt echo.!num%%i!)
for /f "tokens=1,2 delims=^|" %%c in (临时.txt) do (ren %%d %%c)
del 临时.txt
goto :eof
:renam
cd /d "%~1"
if not exist 重命名列表.txt goto :next
if exist 重命名列表.txt set /p aa=当前文件夹下已存在一个重命名列表,再次重命名会导致原始文件名列表的丢失,如要继续请按A,如要退出请按任意键:
if /i %aa%==a (goto :next) else goto :eof
:next
del 重命名列表.txt
:rector
set /p mm=请输入随机字母位数的上限值:
echo %mm%|findstr "^[0-9]*$">nul || echo 上限值不能包含字符:&&goto :rector
if %mm% equ 0 echo 上限值不能为零&&goto :rector
for %%b in (*.*) do (
if "%%~nxb"=="重命名列表.txt" goto :eof
call :ranwrd
if not exist %word%.* call :ranwrd
ren %%~nxb !word!%%~xb
echo %%~nxb^|!word!%%~xb >>重命名列表.txt
)
goto :eof
:ranwrd
set word=
set /a nn=%random%%%%mm%+1
for /l %%a in (1,1,%nn%) do (call :ranltr)
goto :eof
:ranltr
set letter=0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ
set /a num=%random%%%62
call set word=%word%%%letter:~%num%,1%%
goto :eof
:install
reg add "hkcr\directory\shell\文件夹内文件随机字母重命名\command" /f /t reg_sz /v "" /d "\"%~0\" renam \"%%1\""
reg add "hkcr\directory\shell\反重命名\command" /f /t reg_sz /v "" /d "\"%~0\" resume \"%%1\""
goto :eof
:uninstall
reg delete "hkcr\directory\shell\反重命名" /f
reg delete "hkcr\directory\shell\文件夹内文件随机字母重命名" /f
goto :eof
作者: gundam72
时间: 2008-2-11 13:17
最新的字体颜色我很喜欢,上限数字校验是隐含操作,用户不可见的么?
速度有了提高~
作者: pinghu
时间: 2008-2-11 15:35
当你把字符输入是会提示不能输入字符,当你输入0时提示你上限不能为0,输入正确时则不提示!!