找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 23312|回复: 14

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

[复制链接]
发表于 2009-3-23 16:10:12 | 显示全部楼层 |阅读模式
有如下一些文件:
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:11 | 显示全部楼层
  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
复制代码
发表于 2009-3-23 16:31:33 | 显示全部楼层
  1. ren ?abcd_20080325_high_00.wav ?abcd_20080325_high_a3.wav
复制代码
 楼主| 发表于 2009-3-23 16:43:01 | 显示全部楼层
原帖由 随风 于 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 编辑 ]
发表于 2009-3-23 16:45:42 | 显示全部楼层

回复 4楼 的帖子

因为那只是一个演示程序,把ren前面的echo去掉即可实现真正删除。
建议多多阅读批处理基础教程。
 楼主| 发表于 2009-3-23 16:56:13 | 显示全部楼层
原帖由 Batcher 于 2009-3-23 16:31 发表
ren ?abcd_20080325_high_00.wav ?abcd_20080325_high_a3.wav


对我列表中的文件可以成功,但实际上的文件不只这些,其中的?abcd_20080325也不是固定的,可能是“素材_20090423_high_00.wav”这样的名字
发表于 2009-3-23 18:08:40 | 显示全部楼层
  请在顶楼给出真实数据——即使是演示数据,也应该忠实于原始数据的规律,这样才不至于让别人理解错误。
发表于 2009-3-23 18:54:39 | 显示全部楼层

回复 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
复制代码
发表于 2009-3-23 18:57:28 | 显示全部楼层

回复楼主

应该就用通配符?能实现的吧。
尝试一下:for /r %a in (?abcd_20080325_high_00.wav) do ren %a ?abcd_20080325_high_a3.wav
发表于 2009-3-23 19:05:21 | 显示全部楼层
  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 编辑 ]
发表于 2009-3-23 19:34:56 | 显示全部楼层
通配符可能出现很多意料之外的问题,如果文件名规则比较复杂,建议慎用。
发表于 2009-3-23 20:16:58 | 显示全部楼层
  在用通配符做ren操作的时候,如果ren之前和ren之后的文件名字符数不相等,那就得十分小心了,因为它很可能会导致一些稀奇古怪的结果,请看这个帖子:这是不是ren的一个bug? http://www.cn-dos.net/forum/viewthread.php?tid=29538
发表于 2009-3-23 20:46:01 | 显示全部楼层

回复 12楼 的帖子

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

在c盘新建一个10.pdf

执行下面的两句命令;

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

ren 10.pdf *2.c

结果为: 10.pdf2.c

ren 10.pdf *1.c

结果为1.c

结果不出意外啊。
发表于 2009-3-23 21:10:35 | 显示全部楼层

回复 13楼 的帖子

可能那个代码的作者想把10.pdf改成12.c吧
 楼主| 发表于 2009-3-25 22:47:25 | 显示全部楼层
原帖由 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
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-17 06:27 , Processed in 0.023201 second(s), 9 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表