中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [结贴]关于ACDSee的重命名算法
« [1] [2] »
作者:
标题: [结贴]关于ACDSee的重命名算法 上一主题 | 下一主题
obsolete
初级用户





积分 192
发帖 72
注册 2005-7-31
状态 离线
『楼 主』:  [结贴]关于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 ]

2008-7-28 20:59
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
obsolete
初级用户





积分 192
发帖 72
注册 2005-7-31
状态 离线
『第 2 楼』:  

程序可能会比较啰嗦,如果写起来麻烦,可以只说一下思路。谢谢!

2008-7-28 21:01
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
523066680
银牌会员

SuperCleaner


积分 2362
发帖 1133
注册 2008-2-2
状态 离线
『第 3 楼』:  

大致符合题意有待改进…… 不过,大家看到这类帖都会比较……
毕竟太多人问批量重命名的事儿了,我觉得题目吸引人很重要。

rem 这一版本的编辑if_exist   http://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   http://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 ]

   此帖被 +2 点积分    点击查看详情   
评分人:【 obsolete 分数: +2  时间:2008-7-28 21:49




综合型编程论坛

我的作品索引
  
2008-7-28 21:25
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (523066680)  编辑帖子  回复  引用回复
obsolete
初级用户





积分 192
发帖 72
注册 2005-7-31
状态 离线
『第 4 楼』:  

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

2008-7-28 21:38
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
523066680
银牌会员

SuperCleaner


积分 2362
发帖 1133
注册 2008-2-2
状态 离线
『第 5 楼』:  

觉得好就加加分!那我谢谢你啦!等下改改 ,看能否完全符合题意

以下内容并非代表本人立场
欢迎来到 hat前辈建立的群  61377162

[ Last edited by 523066680 on 2008-7-28 at 09:52 PM ]



综合型编程论坛

我的作品索引
  
2008-7-28 21:45
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (523066680)  编辑帖子  回复  引用回复
obsolete
初级用户





积分 192
发帖 72
注册 2005-7-31
状态 离线
『第 6 楼』:  

下面这段代码效率很低,先贴上来吧
@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 ]

2008-7-28 22:49
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
obsolete
初级用户





积分 192
发帖 72
注册 2005-7-31
状态 离线
『第 7 楼』:  

上面代码在文件名长度不超过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

2008-7-28 23:03
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
523066680
银牌会员

SuperCleaner


积分 2362
发帖 1133
注册 2008-2-2
状态 离线
『第 8 楼』:  

汗……不知道你在说啥……数学 批处理……我的娘~
(最讨厌数学了!但是没法,我也爱数学,有爱就有恨……)



综合型编程论坛

我的作品索引
  
2008-7-29 10:12
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (523066680)  编辑帖子  回复  引用回复
obsolete
初级用户





积分 192
发帖 72
注册 2005-7-31
状态 离线
『第 9 楼』:  

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 ]

2008-7-29 22:03
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
obsolete
初级用户





积分 192
发帖 72
注册 2005-7-31
状态 离线
『第 10 楼』:  

9楼算法还利用了一个前提是:整形的最大值在21亿左右,也就是10位。
超过10位的无法处理(因为for循环不支持)

[ Last edited by obsolete on 2008-7-29 at 10:08 PM ]

   此帖被 +2 点积分     点击查看详情   
评分人:【 523066680 分数: +2  时间:2008-7-30 08:54


2008-7-29 22:04
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
523066680
银牌会员

SuperCleaner


积分 2362
发帖 1133
注册 2008-2-2
状态 离线
『第 11 楼』:  

哎就是重命名嘛  要求那么高干什么 ……
我写了一个多选择的重命名批处理
:: 这一版本的编辑if_exist   http://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 ]



综合型编程论坛

我的作品索引
  
2008-7-30 09:49
查看资料  发送邮件  访问主页  发短消息 网志  OICQ (523066680)  编辑帖子  回复  引用回复
obsolete
初级用户





积分 192
发帖 72
注册 2005-7-31
状态 离线
『第 12 楼』:  

恩我也打算写一个重命名的批处理,主要是想写得通用一些,这样每次要用的时候改几个变量就可以用了,方便。

2008-7-30 12:43
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
obsolete
初级用户





积分 192
发帖 72
注册 2005-7-31
状态 离线
『第 13 楼』:  

11楼的方法,在一些常见任务中比9楼的要快很多,唯一的缺憾是不够通用,模板变化了得修改程序。

2008-7-30 12:47
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
obsolete
初级用户





积分 192
发帖 72
注册 2005-7-31
状态 离线
『第 14 楼』:  

请大家帮帮忙啊,剩下最后一个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 ]

2008-7-30 22:41
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
bat-zw
金牌会员

永远的学习者


积分 3105
发帖 1276
注册 2008-3-8
状态 离线
『第 15 楼』:  

一个很简单的重命名程序搞得像天书,楼主不要因小失大啊!!!



批处理之家新域名:www.bathome.net
2008-7-30 22:49
查看资料  发送邮件  发短消息 网志  OICQ (841615149)  编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: