Board logo

标题: [文本处理] 删除指定扩展名文件的文件名前缀 [打印本页]

作者: MarkovChain    时间: 2008-11-29 16:07     标题: 删除指定扩展名文件的文件名前缀

RT,由于工作需要,想编写一个小程序,要求批量修改指定扩展名,(.seq,.ab1)文件的文件名,文件名举例G08.CS080121018_0143.AG1.M13F.ab1->AG1.M13F.ab1
E06.CS080121018_0169.AG14.M13F.seq->AG14.M13F.seq
删除的前缀位数可由用户指定.
这里前缀指的是G08.CS080121018_0143. 共计21位。别人每次提交给我,一次提交的文件前缀是一样的位数,第二次再提交,位数可能就都变成20位了。
本人菜鸟诚心请教各位高手,能否贴出代码。感激不尽!


PS:对文件名规律的解释:三个“.”分为四段式,第二段及“.”为需要删除的。表述不清请以实例为准。

[ 本帖最后由 MarkovChain 于 2008-11-29 17:26 编辑 ]
作者: namejm    时间: 2008-11-29 16:25

  文件名有什么规律?哪些算前缀?是否包含特殊字符?是否需要修改子文件夹中的文件……请不要单纯举例,而要用文字予以详细说明——就算是把所有的文件名列出来,你不用文字描述,又有几个人能知道它们的准确规律?请在顶楼更新你的问题。
作者: wxcute    时间: 2008-11-29 16:38

可能是说用小点 “ . " 来分隔吧,一个点分开两个所谓 ”前缀“。
作者: MarkovChain    时间: 2008-11-29 16:51

谢谢版大及时提醒
作者: Batcher    时间: 2008-11-29 16:55

要删除的那部分G08.CS080121018_0143位数是固定的么?
要保留的那部分AG1.M13F.ab1位数是固定的么?
作者: 随风    时间: 2008-11-29 16:58

:
  1. @echo off
  2. echo 请输入需删除的位数:
  3. set /p n=
  4. Setlocal EnableDelayedExpansion
  5. for /f "delims=" %%a in ('dir/b *.seq *.ab1') do (
  6.    set "str=%%~na"
  7.    ren "%%a" "!str:~%n%!%%~xa"
  8. )
  9. pause
复制代码

作者: 随风    时间: 2008-11-29 17:03

对文件名规律的解释:两个“.”分为三段式,第一段及“.”为需要删除的。
楼主的要求怎么又变了?
6楼代码以不适合楼主的要求。。。
作者: MarkovChain    时间: 2008-11-29 17:03     标题: 回复 5楼 的帖子

删除部分不固定,像C那样由用户输入,而不是每次我改代码
作者: 随风    时间: 2008-11-29 17:07

:
  1. @echo off
  2. echo 请输入需删除的位数:
  3. set /p n=
  4. Setlocal EnableDelayedExpansion
  5. for /f "delims=" %%a in ('dir/b *.seq *.ab1') do (
  6.    for /f "tokens=1* delims=." %%i in ("%%a") do (
  7.       set "str=%%i."
  8.       ren "%%a" "!str:~%n%!%%j"
  9. ))
  10. pause
复制代码

作者: MarkovChain    时间: 2008-11-29 17:08     标题: 回复 7楼 的帖子

谢谢斑竹啊。我的要求没变,我试了你的代码,能很好的解决问题,谢谢了。
作者: wxcute    时间: 2008-11-29 17:12

如果每个文件都会出现 AG,且出现位置相同。
可以先运行下面的程序检查一下有没有错,如果没错就去掉下面红色这句中的 echo 再运行。
if /i "!fstr:~,2!"=="AG" echo ren "%%i.%%j.%%k" "%%k"

以下代码在满足第一句条件的情况下可多次运行
  1. @echo off
  2. setlocal enableDelayedExpansion
  3. for /f "tokens=1,2* delims=." %%i in ('dir/b *.ab1 *.seq') do (
  4. set "fstr=%%k"
  5. if /i "!fstr:~,2!"=="AG" echo ren "%%i.%%j.%%k" "%%k"
  6. )
  7. pause
复制代码

作者: 随风    时间: 2008-11-29 17:20

楼主是需注意,这样的重命名代码是不能反复运行的,否则你的文件名会越来越短,若要反复运行,需知道你已经重命名过的文件名有什么固定特征。
作者: MarkovChain    时间: 2008-11-29 18:10

谢谢各位!本人着实菜鸟,只接触过C。故能否以6L代码为例,稍做解释
作者: Batcher    时间: 2008-11-29 18:37     标题: 回复 13楼 的帖子

哪句不懂,就问哪句,有很多热心人会告诉你答案;如果全部不懂,建议先去学习基础教程,这样才能更快的掌握批处理。
作者: namejm    时间: 2008-11-29 18:42

  如果想要完美解决你的问题,还请楼主补充两点:
  1、以点号分隔的节,最少和最多各有多少个?
  2、你最终想保留多少节?
作者: MarkovChain    时间: 2008-11-30 02:41     标题: 回复 15楼 的帖子

问题1:这个我也说不好,只接受了两批文件,都是四段式
问题2:以AG为开头往后的节
作者: MarkovChain    时间: 2008-11-30 18:02     标题: 不懂语句汇总

以6L代码为例
1 "delims=" 等号后为空这个不太懂,教程里说是整行内容,取消for的默认分割符。
2 dir/b 这个看help没明白啥意思
3 in()内何时打单引号?
4 =%%~na这一处不懂
5 "!str:~%n%!%%~xa"不明白

烦请高手解答
另外追问一个:这个小程序我原本想用C写的,但感到用C实现此功能好像比较复杂,不如bat来的简单实惠,也不知道是不是这样?
作者: namejm    时间: 2008-11-30 19:10

  1、for /f 语句中,默认以空格和跳格键作为分隔符,并默认只提取第一节字符串;"delims=" 则取消这种默认设置,把整行内容作为一个整体予以提取;
  2、若看不懂帮助,请实地运行代码来测试,其义自现——不要太依赖他人,自己动手测试一次比问别人千百次更有效果;
  3、在for /f 语句中,in ()内有时候打单引号,有时候打双引号,有时候不加任何符号,要看具体情况,简而言之,如果把括号里的字符串作为一个命令语句看待,就要加单引号;如果作为一个字符串来看待,就要加双引号,如果作为一个文件看待,则不加任何符号;如:in ('dir'),则dir表示命令语句;若in ("dir"),则dir仅表示字符串;若in (dir),则dir表示一个文件;
  4、=%%~na 实际上应该是 %%~na,你把语句断错了位置,与set配合使用,表示一个赋值语句,%%~na 中的原型是%%a,%%~na 是for语句中的扩展,表示获取文件名,具体分析请看 for /?
  5、"!str:~%n%!%%~xa"应该分成两部分来看待,一部分是字符串截取语句"!str:~%n%",另一部分是for语句中的扩展用法"%%~xa",第一部分中的%n%表示一个数值,整体意思是提取%str%中第%n%个之后的所有字符串,其中感叹号对涉及到了变量延迟的用法,具体分析请在教学区搜索set教程和变量延迟教程;第二部分与第4点的解释类似,它是获取文件的后缀名(包括点号),具体用法请看 for /?

  对于文件改名,bat用起来非常方便,无需动用高级语言来编程。
作者: MarkovChain    时间: 2008-12-1 02:52

基本上懂了,%%~na是保留文件名,%%~xa是保留文件后缀,"!str:~%n%!"是变量延迟的用法,显示的就是复合语句中即时得到的值,str:~%n%则是取用户输入变量n位后字符。
'dir/b *.seq *.ab1'是一条命令,把相关文件显示出来,每个文件名占一行,for循环在这里是以cmd行为单位元素执行do的,是这样吗
作者: namejm    时间: 2008-12-1 09:18

  基本上正确,不过 str:~%n% 的原型为 %str:~x,y%。




欢迎光临 批处理之家 (http://bathome.net./) Powered by Discuz! 7.2