![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-02 21:42 |
共 48,038 主题排行 / 350,123 发帖 / 今日 1 篇 / 48,251 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » 怎么用if判断文件名的一部分 |
| 可打印版本 2,442 / 16 |
| 第1楼 26933062 | 发表于 2007-01-02 12:55 |
| 银牌会员 发帖 879 积分 2,268 | |
|
怎么用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 ] |
|
| 第2楼 26933062 | 发表于 2007-01-03 03:10 |
| 银牌会员 发帖 879 积分 2,268 | |
|
这么难吗?难道我的这个问题批处理解决不了.............?
提供个思路,不知道行不行,请各位参考一下 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 ] |
|
| 第3楼 26933062 | 发表于 2007-01-03 04:33 |
| 银牌会员 发帖 879 积分 2,268 | |
|
各位,我用一种及其龌龊的方法解决了,自我感觉简直就是侮辱了批处理,但又实在没别的办法,贴出来也算是给大家一个思路吧,还请哪位帮我整理成一个正宗的批处理,谢谢了..........................
@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 ] |
|
| 第4楼 tghksj | 发表于 2007-01-03 05:10 |
| 社区乞丐 发帖 90 积分 -49 | |
|
先找出最大的序号.
然后给没有序号的从最大序号后开始REN就行了. [ Last edited by tghksj on 2007-1-2 at 06:17 PM ] |
|
| 第5楼 tghksj | 发表于 2007-01-03 05:16 |
| 社区乞丐 发帖 90 积分 -49 | |
|
哈哈~发完了才看见3楼的26933062老师说的话..
其实还是毛主席说的好,只要能抓老鼠就是好猫. 手法不重要,达到目的就行~~哈哈~ |
|
| 第6楼 ccwan | 发表于 2007-01-03 05:35 |
| 金牌会员 发帖 1,160 积分 2,725 来自 河北廊坊 | |
|
哈哈哈哈哈哈哈哈!
汗一个先!我不是笑话别人,而是我自己也用了很笨的方法去写了代码,倒是符合楼主的思路,不过太臃肿了。毕竟for中使用call 的方法,我还不是很熟。 另外,tghksj的代码我测试还有问题,等我试试看再说。 |
|
| 第7楼 ccwan | 发表于 2007-01-03 05:52 |
| 金牌会员 发帖 1,160 积分 2,725 来自 河北廊坊 | |
|
tghksj的代码在我这里连续几次改名时,超过数值225后提示存在一个重名文件,或是找不到文件。
我把我的代码也贴上来请大家帮助修改 [ Last edited by ccwan on 2007-1-3 at 06:15 AM ] |
|
| 第8楼 PPdos | 发表于 2007-01-03 06:24 |
| 高级用户 发帖 268 积分 783 | |
|
搂主 你第一个写的就挺好 可是 这句好像。。。
if not "%%~ni"=="%~n0" 如果换成对比第一个字符是不是 "(" 就更接近了吧 |
|
| 第9楼 PPdos | 发表于 2007-01-03 06:33 |
| 高级用户 发帖 268 积分 783 | |
|
7楼如果支持长文件名就更好了。 |
|
| 第10楼 tghksj | 发表于 2007-01-03 06:39 |
| 社区乞丐 发帖 90 积分 -49 | |
|
re ccwan
你测试的结果并不是正确的. 不是在超过255时会出错. 问题是你的文件名内出现了"空格" 4楼的代码更新了一下,加上了对有空格的文件名的处理. ----------------------------------- 还有,老师在7楼的代码并没有做到楼主的要求, 您的代码所做的是,"对没有编号的文件从1开始REN" 而楼主要求的是"从已经有的编号后"开始REN" [ Last edited by tghksj on 2007-1-2 at 05:55 PM ] |
|
| 第11楼 ccwan | 发表于 2007-01-03 06:47 |
| 金牌会员 发帖 1,160 积分 2,725 来自 河北廊坊 | |
|
re tghksj
我的测试是建立了1-100这样100个.txt文件,重命名后,再建立100个,依次…… 兄所改动的代码我测试后还是提示存在一个重名文件,或是找不到文件,不知为何,请兄再试试。 |
|
| 第12楼 tghksj | 发表于 2007-01-03 07:16 |
| 社区乞丐 发帖 90 积分 -49 | |
|
RE ccwan老师
恩~测试的确出了问题. 问题发生在变量NO上 我以为dir /b /O:N会把最大值列到最后并赋值给NO 事实不是这样的....NO还是要进行大小比较的...... 4楼代码又................更新了....哎~~呵呵 ------------------------------------- 测试方法如下: 反复执行后没有出现错误. 1.bat 2.bat [ Last edited by tghksj on 2007-1-2 at 06:20 PM ] |
|
| 第13楼 26933062 | 发表于 2007-01-03 07:24 |
| 银牌会员 发帖 879 积分 2,268 | |
|
还有一点各位注意到没有,比如100个txt文件,中间漏掉了几个,比如20 25 37 58 这些序号没有,那么命名时就要先把这几个补上,再从101开始.
tghksj 老师的如果能再把这个问题解决了,就完美了. [ Last edited by 26933062 on 2007-1-2 at 07:26 PM ] |
|
| 第14楼 tghksj | 发表于 2007-01-03 11:57 |
| 社区乞丐 发帖 90 积分 -49 | |
|
RE 26933062
13楼的要求就更加简单了,从(1)开始,有就跳过,没有就REN:)呵呵 [ Last edited by tghksj on 2007-1-2 at 11:55 PM ] |
|
| 第15楼 26933062 | 发表于 2007-01-03 12:15 |
| 银牌会员 发帖 879 积分 2,268 | |
|
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 ] |
|
| 1 2 下一页 |
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |