Board logo

标题: [文件操作] 【己解决】求助批处理只对文件名末n个字符进行修改的重命名? [打印本页]

作者: cnsccd    时间: 2009-3-23 16:10     标题: 【己解决】求助批处理只对文件名末n个字符进行修改的重命名?

有如下一些文件:
1abcd_20080325_high_00.wav
2abcd_20080325_high_00.wav
3abcd_20080325_high_00.wav
4abcd_20080325_high_00.wav
5abcd_20080325_high_00.wav
6abcd_20080325_high_00.wav
7abcd_20080325_high_00.wav
8abcd_20090323_high_00.wav
想要改成:
1abcd_20080325_high.a3.wav
2abcd_20080325_high.a3.wav
3abcd_20080325_high.a3.wav
4abcd_20080325_high.a3.wav
5abcd_20080325_high.a3.wav
6abcd_20080325_high.a3.wav
7abcd_20080325_high.a3.wav
8abcd_20090323_high.a3.wav

[ 本帖最后由 cnsccd 于 2009-3-25 22:49 编辑 ]
作者: 随风    时间: 2009-3-23 16:19

  1. @echo off
  2. for %%i in (*.wav) do (
  3.   for /f "tokens=1-3 delims=_" %%a in ("%%i") do (
  4.      echo ren "%%i" "%%a_%%b_%%c_.a3%%~xi"
  5. ))
  6. pause
复制代码

作者: Batcher    时间: 2009-3-23 16:31

  1. ren ?abcd_20080325_high_00.wav ?abcd_20080325_high_a3.wav
复制代码

作者: cnsccd    时间: 2009-3-23 16:43

原帖由 随风 于 2009-3-23 16:19 发表
@echo off
for %%i in (*.wav) do (
  for /f "tokens=1-3 delims=_" %%a in ("%%i") do (
     echo ren "%%i" "%%a_%%b_%%c_.a3%%~xi"
))
pause



我修改了一下:
@echo off
for %%i in (*.wav) do (
  for /f "tokens=1-3 delims=_" %%a in ("%%i") do (
     echo ren "%%i" "%%a_%%b_%%c.a3%%~xi"
))
pause
执行后,显示是正确的,而没有真正地执行更名的操作啊

[ 本帖最后由 cnsccd 于 2009-3-23 16:44 编辑 ]
作者: Batcher    时间: 2009-3-23 16:45     标题: 回复 4楼 的帖子

因为那只是一个演示程序,把ren前面的echo去掉即可实现真正删除。
建议多多阅读批处理基础教程。
作者: cnsccd    时间: 2009-3-23 16:56

原帖由 Batcher 于 2009-3-23 16:31 发表
ren ?abcd_20080325_high_00.wav ?abcd_20080325_high_a3.wav


对我列表中的文件可以成功,但实际上的文件不只这些,其中的?abcd_20080325也不是固定的,可能是“素材_20090423_high_00.wav”这样的名字
作者: namejm    时间: 2009-3-23 18:08

  请在顶楼给出真实数据——即使是演示数据,也应该忠实于原始数据的规律,这样才不至于让别人理解错误。
作者: Batcher    时间: 2009-3-23 18:54     标题: 回复 6楼 的帖子

  1. @echo off
  2. for %%a in (*.wav) do (
  3.   set "OldName=%%a"
  4.   setlocal enabledelayedexpansion
  5.   echo ren "%%a" "!OldName:~0,-6!a3.wav"
  6.   endlocal
  7. )
  8. pause
复制代码

作者: Lumiere    时间: 2009-3-23 18:57     标题: 回复楼主

应该就用通配符?能实现的吧。
尝试一下:for /r %a in (?abcd_20080325_high_00.wav) do ren %a ?abcd_20080325_high_a3.wav
作者: tireless    时间: 2009-3-23 19:05

  1. ren *abcd_*_high_*.wav *h.a3.wav
复制代码
解释:

? 匹配一个字符,但是 ?? 会匹配两个和一个字符,??? 就会匹配 3 个及 3 个以下字符,以此类推;
* 匹配任意多个字符;
代码中 *h.a3.wav*h 表示取文件名(包括后缀名)最后一个 h 及前面所有的字符。如:
ren aaba3bcc.wav *b.wav -------> aab3b.wav
ren aaba3bcc.wav *a.wav -------> aaba3bcc.wa.wav
ren aaba3bcc.wav *.         -------> aaba3bcc (注:因为用正常的方法不能创建无后缀的末尾带点的文件,所以结果中末尾的点没有了。可以用 cd.>\\?\%cd%\test. 来创建这样的文件。)
ren aaba3bcc.wav ??.wav -------> aa.wav

[ 本帖最后由 tireless 于 2009-3-23 21:14 编辑 ]
作者: Batcher    时间: 2009-3-23 19:34

通配符可能出现很多意料之外的问题,如果文件名规则比较复杂,建议慎用。
作者: namejm    时间: 2009-3-23 20:16

  在用通配符做ren操作的时候,如果ren之前和ren之后的文件名字符数不相等,那就得十分小心了,因为它很可能会导致一些稀奇古怪的结果,请看这个帖子:这是不是ren的一个bug? http://www.cn-dos.net/forum/viewthread.php?tid=29538
作者: tireless    时间: 2009-3-23 20:46     标题: 回复 12楼 的帖子

『楼 主』:  这是不是ren的一个bug?

在c盘新建一个10.pdf

执行下面的两句命令;

看看最后10.pdf 被改名成了什么/

ren 10.pdf *2.c

结果为: 10.pdf2.c

ren 10.pdf *1.c

结果为1.c

结果不出意外啊。
作者: Batcher    时间: 2009-3-23 21:10     标题: 回复 13楼 的帖子

可能那个代码的作者想把10.pdf改成12.c吧
作者: cnsccd    时间: 2009-3-25 22:47

原帖由 Batcher 于 2009-3-23 18:54 发表
@echo off
for %%a in (*.wav) do (
  set "OldName=%%a"
  setlocal enabledelayedexpansion
  echo ren "%%a" "!OldName:~0,-6!a3.wav"
  endlocal
)
pause

我用了这个,发现是最好用的,不像前一个,虽然能改,但再次运行后又会重新在原文件名后不断增加.a3.wav,而这一个,只要改好后,再次运行时只有新增加的文件才会被改名,已经改过的不会再变化了。谢谢!!
@echo off
for %%a in (*.wav) do (
  set "OldName=%%a"
  setlocal enabledelayedexpansion
  ren "%%a" "!OldName:~0,-7!.a3.wav"
  endlocal
)
pause




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