标题: [文件操作] 【己解决】求助批处理只对文件名末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
- @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
复制代码
作者: Batcher 时间: 2009-3-23 16:31
- 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楼 的帖子
- @echo off
- for %%a in (*.wav) do (
- set "OldName=%%a"
- setlocal enabledelayedexpansion
- echo ren "%%a" "!OldName:~0,-6!a3.wav"
- endlocal
- )
- 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
- 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://bathome.net./) |
Powered by Discuz! 7.2 |