中国DOS联盟论坛

中国DOS联盟

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

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

游客:  注册 | 登录 | 命令行 | 会员 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » 怎么用if判断文件名的一部分
« [1] [2] »
作者:
标题: 怎么用if判断文件名的一部分 上一主题 | 下一主题
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『楼 主』:  怎么用if判断文件名的一部分

e:\111文件夹下有上千个txt文件
我运行了这个批处理a.bat
@echo off&setlocal EnableDelayedExpansion
set a=1
for /f "delims=" %%i in ('dir /b *.txt') do (
        if not "%%~ni"=="%~n0" (
        ren "%%i" "(!a!)%%~ni%%~xi"
        set/a a+=1
        )
)
将所有文档前面都加了个 (序号)
问题来了
当我再次运行a.bat时,它又会在所有文件前面加上个(序号),有什么办法可以判断一下文件名,发现前面有(序号)的就不理会,没有的就在前面加上,并且序号是接着前面的,比如说以有10个文档名加了序号(1)a.txt (2)b.txt  (3)af.txt  (4)sa.txt .......(10)aer.txt 还有5个没加序号的,e.txt  f.txt  g.txt  r.txt  h.txt再次运行a.bat时就从11加起?把这5个也加上序号,变成(11)e.txt (12)f.txt (13) g.txt  (14)r.txt  (15)h.txt

[ Last edited by 26933062 on 2007-1-2 at 01:55 AM ]

2007-1-2 12:55
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 2 楼』:  

这么难吗?难道我的这个问题批处理解决不了.............?
提供个思路,不知道行不行,请各位参考一下
1,先将e:\111文件夹里的所有txt文件名以 ) 为分隔符,分成2部分,如原文件名
  (1)a.txt   第一部分是 (1  第二部分就是a.txt
2,再用for遍历,if以递增形式判断第一部分,再设变量a的值
3,再判断文件名没有( )的,并在前面加(%a%)
不知道这个思路有没有用,我无法整理出句子,请各位动动脑............[/
size]

[ Last edited by 26933062 on 2007-1-2 at 02:13 PM ]

2007-1-3 03:10
查看资料  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 3 楼』:  

各位,我用一种及其龌龊的方法解决了,自我感觉简直就是侮辱了批处理,但又实在没别的办法,贴出来也算是给大家一个思路吧,还请哪位帮我整理成一个正宗的批处理,谢谢了..........................
@echo off
:3
del d:\111\22.txt
del d:\111\33.txt
for /f "delims=" %%i in ('dir /b *.txt') do echo %%i>>d:\111\22.txt
type d:\111\22.txt | find /v ")">>d:\111\33.txt
for %%i in (d:\111\33.txt) do if "%%~zi"=="0" exit
set a=1
:1
type d:\111\22.txt | find "(%a%)" || goto 2
set /a a=%a%+1
goto 1
:2
echo %a%
for /f "delims=" %%i in (d:\111\33.txt) do call :ren "%%i"

goto :eof

:ren
ren %1 (%a%)%1
goto 3


[ Last edited by 26933062 on 2007-1-2 at 03:39 PM ]

2007-1-3 04:33
查看资料  发短消息 网志   编辑帖子  回复  引用回复
tghksj
社区乞丐

此图片另存后死机



积分 -49
发帖 90
注册 2006-12-2
状态 离线
『第 4 楼』:  

先找出最大的序号.
然后给没有序号的从最大序号后开始REN就行了.
@ECHO %dbg% OFF
setlocal ENABLEDELAYEDEXPANSION

FOR /F "delims=)" %%i in ('dir /b /O:N %~dp0\*.txt') do (
                                                         SET STR=%%i
                                                         IF "!STR:~0,1!"=="(" IF !STR:~1! GTR !NO! (SET NO=!STR:~1!)         
                                                         )
CALL :RENAME %NO%
GOTO :EOF


:RENAME
FOR /F "eol=( tokens=*" %%j in ('dir /b /O:N %~dp0\*.txt') do (
                                                      SET /A NO+=1
                                                      REN "%%j" (!NO!^)^"%%j"
                                                      )
GOTO :EOF
[ Last edited by tghksj on 2007-1-2 at 06:17 PM ]

   此帖被 +5 点积分      点击查看详情   
评分人:【 ccwan 分数: +5  时间:2007-1-3 05:22




我的网络笔记本.[color=Red]非联系本人请勿访问![/color]http://w.vicp.net[img]http://zhenlove.com.cn/cndos/fileup/files/QM2.jpg[/img]
2007-1-3 05:10
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
tghksj
社区乞丐

此图片另存后死机



积分 -49
发帖 90
注册 2006-12-2
状态 离线
『第 5 楼』:  

哈哈~发完了才看见3楼的26933062老师说的话..
其实还是毛主席说的好,只要能抓老鼠就是好猫.
手法不重要,达到目的就行~~哈哈~



我的网络笔记本.[color=Red]非联系本人请勿访问![/color]http://w.vicp.net[img]http://zhenlove.com.cn/cndos/fileup/files/QM2.jpg[/img]
2007-1-3 05:16
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
ccwan
金牌会员




积分 2725
发帖 1160
注册 2006-9-23
来自 河北廊坊
状态 离线
『第 6 楼』:  

哈哈哈哈哈哈哈哈!
汗一个先!我不是笑话别人,而是我自己也用了很笨的方法去写了代码,倒是符合楼主的思路,不过太臃肿了。毕竟for中使用call 的方法,我还不是很熟。
另外,tghksj的代码我测试还有问题,等我试试看再说。



三人行,必有吾师焉。   学然后知不足,教然后知困,然后能自强也。
2007-1-3 05:35
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
ccwan
金牌会员




积分 2725
发帖 1160
注册 2006-9-23
来自 河北廊坊
状态 离线
『第 7 楼』:  

tghksj的代码在我这里连续几次改名时,超过数值225后提示存在一个重名文件,或是找不到文件。

我把我的代码也贴上来请大家帮助修改
@echo off&setlocal EnableDelayedExpansion
set a=1
for /f "delims=" %%i in ('dir /a-d/b/on *.txt') do call :ren "%%i"

:ren
for /f "delims=" %%a in (%1) do (
       set var=%%a
       if not "%~nx1"=="%0" if not "!var:~0,1!" == "("  (
          ren !var! "(!a!)%~nx1"
       )
set/a a+=1
)
goto :eof
[ Last edited by ccwan on 2007-1-3 at 06:15 AM ]



三人行,必有吾师焉。   学然后知不足,教然后知困,然后能自强也。
2007-1-3 05:52
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
PPdos
高级用户




积分 783
发帖 268
注册 2006-12-26
状态 离线
『第 8 楼』:  

搂主 你第一个写的就挺好 可是 这句好像。。。

if not "%%~ni"=="%~n0"

如果换成对比第一个字符是不是 "(" 就更接近了吧

2007-1-3 06:24
查看资料  发短消息 网志   编辑帖子  回复  引用回复
PPdos
高级用户




积分 783
发帖 268
注册 2006-12-26
状态 离线
『第 9 楼』:  7楼如果支持长文件名就更好了。



2007-1-3 06:33
查看资料  发短消息 网志   编辑帖子  回复  引用回复
tghksj
社区乞丐

此图片另存后死机



积分 -49
发帖 90
注册 2006-12-2
状态 离线
『第 10 楼』:  

re ccwan

你测试的结果并不是正确的.
不是在超过255时会出错.
问题是你的文件名内出现了"空格"

4楼的代码更新了一下,加上了对有空格的文件名的处理.
-----------------------------------
还有,老师在7楼的代码并没有做到楼主的要求,

您的代码所做的是,"对没有编号的文件从1开始REN"

而楼主要求的是"从已经有的编号后"开始REN"

[ Last edited by tghksj on 2007-1-2 at 05:55 PM ]



我的网络笔记本.[color=Red]非联系本人请勿访问![/color]http://w.vicp.net[img]http://zhenlove.com.cn/cndos/fileup/files/QM2.jpg[/img]
2007-1-3 06:39
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
ccwan
金牌会员




积分 2725
发帖 1160
注册 2006-9-23
来自 河北廊坊
状态 离线
『第 11 楼』:  

re tghksj

我的测试是建立了1-100这样100个.txt文件,重命名后,再建立100个,依次……
兄所改动的代码我测试后还是提示存在一个重名文件,或是找不到文件,不知为何,请兄再试试。



三人行,必有吾师焉。   学然后知不足,教然后知困,然后能自强也。
2007-1-3 06:47
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
tghksj
社区乞丐

此图片另存后死机



积分 -49
发帖 90
注册 2006-12-2
状态 离线
『第 12 楼』:  

RE ccwan老师

恩~测试的确出了问题.

问题发生在变量NO上
我以为dir /b /O:N会把最大值列到最后并赋值给NO
事实不是这样的....NO还是要进行大小比较的......

4楼代码又................更新了....哎~~呵呵

-------------------------------------
测试方法如下:
反复执行后没有出现错误.
1.bat
FOR /L %%i IN (1,1,300) DO ECHO^ >%%i.txt
2.bat
@ECHO %dbg% OFF
setlocal ENABLEDELAYEDEXPANSION

FOR /F "delims=)" %%i in ('dir /b /O:N %~dp0\*.txt') do (
                                                         SET STR=%%i
                                                         IF "!STR:~0,1!"=="(" IF !STR:~1! GTR !NO! (SET NO=!STR:~1!)         
                                                         )
CALL :RENAME %NO%
GOTO :EOF


:RENAME
FOR /F "eol=( tokens=*" %%j in ('dir /b /O:N %~dp0\*.txt') do (
                                                      SET /A NO+=1
                                                      REN "%%j" (!NO!^)^"%%j"
                                                      )
GOTO :EOF
[ Last edited by tghksj on 2007-1-2 at 06:20 PM ]



我的网络笔记本.[color=Red]非联系本人请勿访问![/color]http://w.vicp.net[img]http://zhenlove.com.cn/cndos/fileup/files/QM2.jpg[/img]
2007-1-3 07:16
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 13 楼』:  

还有一点各位注意到没有,比如100个txt文件,中间漏掉了几个,比如20 25 37 58 这些序号没有,那么命名时就要先把这几个补上,再从101开始.
tghksj 老师的如果能再把这个问题解决了,就完美了.

[ Last edited by 26933062 on 2007-1-2 at 07:26 PM ]

2007-1-3 07:24
查看资料  发短消息 网志   编辑帖子  回复  引用回复
tghksj
社区乞丐

此图片另存后死机



积分 -49
发帖 90
注册 2006-12-2
状态 离线
『第 14 楼』:  

RE 26933062

13楼的要求就更加简单了,从(1)开始,有就跳过,没有就REN:)呵呵
@ECHO %dbg% OFF
setlocal ENABLEDELAYEDEXPANSION
SET STR=0

:RENNAME
FOR /F "eol=( tokens=*" %%j in ('dir /b /O:N %~dp0*.txt') do (
                                                              SET /A STR+=1
                                                              dir /b /O:N %~dp0*.txt|Findstr /l "(!STR!)" >NUL
                                                              IF !errorlevel!==1 (
                                                                                  FOR /F "eol=( tokens=*" %%j in ('dir /b /O:N %~dp0*.txt') do (
                                                                                                                                                REN "%%j" (!STR!^)^"%%j"
                                                                                                                                                ECHO "%%j"--(!STR!^)^"%%j"
                                                                                                                                                GOTO :RENNAME
                                                                                                                                                )
                                                                                  )
                                                              GOTO :RENNAME
                                                              )
[ Last edited by tghksj on 2007-1-2 at 11:55 PM ]

   此帖被 +2 点积分    点击查看详情   
评分人:【 26933062 分数: +2  时间:2007-1-3 13:08




我的网络笔记本.[color=Red]非联系本人请勿访问![/color]http://w.vicp.net[img]http://zhenlove.com.cn/cndos/fileup/files/QM2.jpg[/img]
2007-1-3 11:57
查看资料  发送邮件  发短消息 网志   编辑帖子  回复  引用回复
26933062
银牌会员





积分 2268
发帖 879
注册 2006-12-19
状态 离线
『第 15 楼』:  

14f tghksj
没办法进行第二次命名啊?你测试过吗?我先创建了15个文档,运行你的批处理后,命名成功,我再新建两个文档,运行批处理就没反映了?

谢谢大家了,我把14楼的综合了一下,暂时可以正常运行了,代码如下,
红字部分可以再麻烦14楼解释一下吗?帮助我看不懂.
@echo off
set a=1
:1
dir /b *.txt | find "(%a%)" || goto 2
set /a a=%a%+1
goto 1
:2
echo %a%
setlocal ENABLEDELAYEDEXPANSION
FOR /F "eol=( tokens=*" %%j in ('dir /b /O:N %~dp0*.txt') do (
REN "%%j" (!a!^)^"%%j"
goto :1
)

[ Last edited by 26933062 on 2007-1-2 at 11:38 PM ]

2007-1-3 12:15
查看资料  发短消息 网志   编辑帖子  回复  引用回复
« [1] [2] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: