Board logo

标题: [结贴]关于ACDSee的重命名算法 [打印本页]

作者: obsolete     时间: 2008-7-28 20:59    标题: [结贴]关于ACDSee的重命名算法
比如说设置了模板:Head_???_Body_?_Tail,从1递增到1001,应该产生以下的命名: Head_001_Body_1_Tail Head_002_Body_2_Tail Head_003_Body_3_Tail ... Head_010_Body_10_Tail Head_011_Body_11_Tail ... Head_1000_Body_1000_Tail Head_1001_Body_1001_Tail 目的不在实用,主要是锻炼一下。模板由用户自定义,模板中可能连续出现多达255个通配符"?",比如???????????Head?????????????Body??Tail? 思考了1天在效率上没有突破,请大家帮忙,谢谢!! 在此感谢bat-zw和523066680的热情帮助 [ Last edited by obsolete on 2008-7-31 at 10:30 PM ]

作者: obsolete     时间: 2008-7-28 21:01
程序可能会比较啰嗦,如果写起来麻烦,可以只说一下思路。谢谢!

作者: 523066680     时间: 2008-7-28 21:25
大致符合题意有待改进…… 不过,大家看到这类帖都会比较…… 毕竟太多人问批量重命名的事儿了,我觉得题目吸引人很重要。 rem 这一版本的编辑if_exist hi.baidu.com/523066680 @echo off&setlocal enabledelayedexpansion set /a i=0,j=0,k=0,l=0 for /f "tokens=*" %%a in ('dir *.jpg /b') do ( set /a l+=1 if !l! equ 10 (set k=) if !l! equ 100 (set j=) if !l! equ 1000 (set i=) ren %%a Head_!i!!j!!k!!l!_Body_!l!_Tail.jpg >nul 2>nul ) =--------------------------以下代码应该能够完全符合------------------- rem 这一版本的编辑if_exist hi.baidu.com/523066680 @echo off&setlocal enabledelayedexpansion set /a j=0,k=0,l=0 for /f "tokens=*" %%a in ('dir *.jpg /b') do ( set /a l+=1 if !l! equ 10 (set k=) if !l! equ 100 (set j=) ren %%a Head_!j!!k!!l!_Body_!l!_Tail.jpg >nul 2>nul ) =--------------------------------------------------------------------------- 不过在页面浏览的时候,001-099在前面,1000-????在中间 100-999在后面……没办法,电脑是按开头的字符排的…… 我一开始看的时候还以为漏了什么。 [ Last edited by 523066680 on 2008-7-28 at 10:15 PM ]

作者: obsolete     时间: 2008-7-28 21:38
谢谢楼上。 效率很高,我一天都没想到这种方法TT, 问题是不够通用,模板是用户自己设的,可能最后这个字符串拼起来会很吃力

作者: 523066680     时间: 2008-7-28 21:45
觉得好就加加分!那我谢谢你啦!等下改改 ,看能否完全符合题意 以下内容并非代表本人立场 欢迎来到 hat前辈建立的群 61377162 [ Last edited by 523066680 on 2008-7-28 at 09:52 PM ]

作者: obsolete     时间: 2008-7-28 22:49
下面这段代码效率很低,先贴上来吧
@echo off
setlocal enabledelayedexpansion

set wildchars=?
for /l %%i in (1,1,8) do (
	set wildchars=!wildchars!!wildchars!
)

set zeroes=!wildchars:?=0!
set template=?a??b???c????d?????e??????f???????g????????h?????????i??????????j???????????k????????????l?????????????m??????????????n???????????????o????????????????p?????????????????q??????????????????r???????????????????s????????????????????t?????????????????????u??????????????????????

set tpl=%template%
for /l %%i in (255,-1,1) do (
	set wcs=!wildchars:~0,%%i!
	call,set temp=%%tpl:!wcs!=%%
	if not "!tpl!"=="!temp!" (set occr=!occr! %%i & set tpl=!temp!)
)

for /l %%a in (1,1,1001) do (
	set num=%%a
	set str=%zeroes%%%a
	set file=%template%
	for %%b in (!occr!) do (
		set wcs=!wildchars:~0,%%b!
		set temp=!num:~%%b!
		if defined temp (set n=%%a) else set n=!str:~-%%b!
		call,set file=%%file:!wcs!=!n!%%
	)
	echo !file!
	echo.
)

pause
[ Last edited by obsolete on 2008-7-28 at 11:20 PM ]

作者: obsolete     时间: 2008-7-28 23:03
上面代码在文件名长度不超过255的前提下,最坏情况的模板是: ?a??b???c????d?????e??????f???????g????????h?????????i??????????j???????????k????????????l?????????????m??????????????n???????????????o????????????????p?????????????????q??????????????????r???????????????????s????????????????????t?????????????????????u?????????????????????? 也就是通配符从1~22都出现了,可以这样近似计算: x*(x+1)/2 + x-1=255

作者: 523066680     时间: 2008-7-29 10:12
汗……不知道你在说啥……数学 批处理……我的娘~ (最讨厌数学了!但是没法,我也爱数学,有爱就有恨……)

作者: obsolete     时间: 2008-7-29 22:03
6楼算法中最耗时的部分是call,set,算法改进的目的就是去除这个。 改善的算法:
@echo off
setlocal enabledelayedexpansion

set template=?a??b???c????d?????e??????f???????g????????h?????????i??????????j???????????k????????????l?????????????m??????????????n???????????????o????????????????p?????????????????q??????????????????r???????????????????s????????????????????t?????????????????????u??????????????????????

set template=!template:?=:?!
set template=!template:?:=/!
set template=!template::=!

set colons=:::::::::

for /l %%a in (1,1,1001) do (
	set file=%template%
	set n=0
	set num=%%a
	for /l %%b in (1,1,9) do (
		set /a "num=num/10"
		if not !num!==0 set /a "n+=1"
	)
	
	call,set rep=%%colons:~0,!n!%%%%a
	call,set file=%%file:?=!rep!%%
	for /l %%i in (1,1,9) do (
		set file=!file:/:=!
	)
	set file=!file:/=0!
	set file=!file::=!
        echo !file!
        echo.
)

pause
[ Last edited by obsolete on 2008-7-30 at 10:05 PM ]

作者: obsolete     时间: 2008-7-29 22:04
9楼算法还利用了一个前提是:整形的最大值在21亿左右,也就是10位。 超过10位的无法处理(因为for循环不支持) [ Last edited by obsolete on 2008-7-29 at 10:08 PM ]

作者: 523066680     时间: 2008-7-30 09:49
哎就是重命名嘛 要求那么高干什么 …… 我写了一个多选择的重命名批处理 :: 这一版本的编辑if_exist hi.baidu.com/523066680 @echo off :write-geshi set /p geshi="请输入将被重命名的文件格式,如jpg:" if not exist *.%geshi% echo.不存在该格式 &goto write-geshi if "%geshi%"=="" echo.不存在该格式 &goto write-geshi cls :write-left echo.给文件名输入特征部分,输入a-则命名为a-001,a-002…… echo.直接enter则名字直接为序号 echo.不要输入特殊字符 set /p tezheng=":" :write-lei set /p lei="选择类型,输入 001 或1 :" if "%lei%" == "001" (goto :001) if "%lei%" == "1" (goto :1) else (echo.输入错误 &goto :write-lei) :001 setlocal enabledelayedexpansion set /a i=0,j=0,k=0 for /f "tokens=*" %%a in ('dir *.%geshi% /b') do ( set /a k+=1 if !k! equ 10 (set j=) if !k! equ 100 (set i=) ren %%a %tezheng%!i!!j!!k!.%geshi% >nul 2>nul echo !i!!j!!k! ) echo over! 按任何键继续 &pause>nul &exit :1 setlocal enabledelayedexpansion set /a k=0 for /f "tokens=*" %%a in ('dir *.%geshi% /b') do ( set /a k+=1 ren %%a %tezheng%!k!.%geshi% echo !k! ) echo over! 按任何键继续 &pause>nul &exit --------------------------------------------------------------------------------- 对于13楼的话,额……都说啦 要求不要那么多嘛…… 以上的已经可以有很多变化了 [ Last edited by 523066680 on 2008-7-30 at 03:06 PM ]

作者: obsolete     时间: 2008-7-30 12:43
恩我也打算写一个重命名的批处理,主要是想写得通用一些,这样每次要用的时候改几个变量就可以用了,方便。

作者: obsolete     时间: 2008-7-30 12:47
11楼的方法,在一些常见任务中比9楼的要快很多,唯一的缺憾是不够通用,模板变化了得修改程序。

作者: obsolete     时间: 2008-7-30 22:41
请大家帮帮忙啊,剩下最后一个call,set了
@echo off
setlocal enabledelayedexpansion

set template=?a??b???c????d?????e??????f???????g????????h?????????i??????????j???????????k????????????l?????????????m??????????????n???????????????o????????????????p?????????????????q??????????????????r???????????????????s????????????????????t?????????????????????u??????????????????????

set template=!template:?=:?!
set template=!template:?:=/!
set template=!template::=!

for /l %%a in (1,1,1001) do (
        set file=%template%
	set temp=%%a:::::::::
	set rep=!temp:~10!%%a
        call,set file=%%file:?=!rep!%%
        for /l %%i in (1,1,9) do (
                set file=!file:/:=!
        )
        set file=!file:/=0!
        set file=!file::=!
	echo !file!
	echo.
)

pause
[ Last edited by obsolete on 2008-7-30 at 10:50 PM ]

作者: bat-zw     时间: 2008-7-30 22:49
一个很简单的重命名程序搞得像天书,楼主不要因小失大啊!!!

作者: obsolete     时间: 2008-7-30 22:51
没办法,重命名对效率比较敏感,尤其在1000多个文件批量重命名时,能省一点就是一点-_-||

作者: bat-zw     时间: 2008-7-30 22:59
Originally posted by obsolete at 2008-7-30 22:51: 没办法,重命名对效率比较敏感,尤其在1000多个文件批量重命名时,能省一点就是一点-_-||
我不知道楼主所指的是什么效率,1000个,10000个,100000个怎么样,现写现用就是的。。。 学习批处理激情固然重要,问题是努力的方向不要偏离了。。。

作者: obsolete     时间: 2008-7-30 23:10
恩,刚开始对用批处理写的东西感兴趣,一般都没思路,不知道写什么,抓着个就想搞搞清楚了。 其实我不打算在批处理方面 面面俱到,只是想怎样解决一些日常会遇到的问题。我觉得这是个很好的题。

作者: obsolete     时间: 2008-7-30 23:13
这个尝试也不是完全没有收获: 1. set的效率比较高 2. call,set浪费时间,尽量避免 3. 数字补零算法 所以我觉得,在效率方面多考虑,对学习批处理应该也有帮助。

作者: obsolete     时间: 2008-7-31 22:07
恩,我还是继续坚持下去,本着共享的精神-_-|| 前面反复说到call,set的效率问题,今天试着用for循环替换call,set,发现效率提高很多。通过运用for的嵌套,相信在效率影响比较大的场合,可以基本抛弃call,set了。
@echo off
setlocal enabledelayedexpansion

set template=?a??b???c????d?????e??????f???????g????????h?????????i??????????j???????????k????????????l?????????????m??????????????n???????????????o????????????????p?????????????????q??????????????????r???????????????????s????????????????????t?????????????????????u??????????????????????

set template=!template:?=:?!
set template=!template:?:=/!
set template=!template::=!

for /l %%a in (1,1,1001) do (
        set file=%template%
        set temp=%%a:::::::::%%a
	for %%b in (!temp:~10!) do set file=!file:?=%%b!
        for /l %%i in (1,1,9) do set file=!file:/:=!
        set file=!file:/=0!
        set file=!file::=!
        echo !file!
        echo.
)

pause
[ Last edited by obsolete on 2008-7-31 at 11:15 PM ]

作者: 523066680     时间: 2008-7-31 22:16
啊~阿里卤鸭~~ only you ~ 不应该这样子的,真的。如果我们写代码的时间超过了 我们用鼠标执行的时间,并且一直存在bug,那会是一件很吃力不讨好的事儿 这种精神我们是都需要滴 ,不过应该花在更好的创新的方面 回22楼,额……不知道说什么…… 不过我有个经验 ,整天对着电脑我什么都想不出 但是我上学的时候特别无聊 ,灵感就特多……不知道咋搞的的 我想,你需要放松 [ Last edited by 523066680 on 2008-8-1 at 10:47 AM ]

作者: obsolete     时间: 2008-7-31 22:25
Originally posted by 523066680 at 2008-7-31 22:16: 啊~阿里卤鸭~~ only you ~ 不应该这样子的,真的。如果我们写代码的时间超过了 我们用鼠标执行的时间,并且一直存在bug,那会是一件很吃力不讨好 ...
恩谢谢指点。没想到这么短时间就把缺点暴露出来了,其实我工作也一样,涉及的东西太少,和别人一比很受挫。。。