[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[文件操作] 【己解决】求助批处理只对文件名末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 编辑 ]

  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
复制代码
技术问题请到论坛发帖求助!

TOP

  1. ren ?abcd_20080325_high_00.wav ?abcd_20080325_high_a3.wav
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

原帖由 随风 于 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 编辑 ]

TOP

回复 4楼 的帖子

因为那只是一个演示程序,把ren前面的echo去掉即可实现真正删除。
建议多多阅读批处理基础教程。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

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


对我列表中的文件可以成功,但实际上的文件不只这些,其中的?abcd_20080325也不是固定的,可能是“素材_20090423_high_00.wav”这样的名字

TOP

  请在顶楼给出真实数据——即使是演示数据,也应该忠实于原始数据的规律,这样才不至于让别人理解错误。
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

回复 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
复制代码
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

回复楼主

应该就用通配符?能实现的吧。
尝试一下:for /r %a in (?abcd_20080325_high_00.wav) do ren %a ?abcd_20080325_high_a3.wav

TOP

  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 编辑 ]

TOP

通配符可能出现很多意料之外的问题,如果文件名规则比较复杂,建议慎用。
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

  在用通配符做ren操作的时候,如果ren之前和ren之后的文件名字符数不相等,那就得十分小心了,因为它很可能会导致一些稀奇古怪的结果,请看这个帖子:这是不是ren的一个bug? http://www.cn-dos.net/forum/viewthread.php?tid=29538
尺有所短寸有所长,学好批处理没商量;
考虑问题复杂化,解决问题简洁化。

心在天山,身老沧州。

TOP

回复 12楼 的帖子

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

在c盘新建一个10.pdf

执行下面的两句命令;

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

ren 10.pdf *2.c

结果为: 10.pdf2.c

ren 10.pdf *1.c

结果为1.c

结果不出意外啊。

TOP

回复 13楼 的帖子

可能那个代码的作者想把10.pdf改成12.c吧
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

原帖由 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

TOP

返回列表