Board logo

标题: [ 新手练习 9 ] 批处理去除歌曲编号(重命名) [打印本页]

作者: wxcute    时间: 2008-11-19 20:32     标题: [ 新手练习 9 ] 批处理去除歌曲编号(重命名)

  1. ::测试环境生成
  2. @echo off
  3. md 测试目录
  4. cd 测试目录
  5. del/q *
  6. cd.>"001 - 萨顶顶 - 万物生.mp3"
  7. cd.>"002 - 萨顶顶 - 神香.wma"
  8. cd.>"003 - 邓丽君 - 月亮代表我的心.mp3"
  9. cd.>"011 - 戴娆 - 绽放.mp3"
  10. cd.>"010 - 梦之旅 - 铃儿响叮当.mp3"
  11. cd.>"007 - 卓依婷 - 捉泥鳅.mp3"
  12. cd.>"009 - 周杰伦 - 稻香.wma"
  13. cd.>"005 - Lene - Pretty Young Thing.wma"
  14. cd.>"029 - M2M - The Day You Went Away.mp3"
复制代码
去掉所有歌曲的编号,只留下如:
萨顶顶 - 万物生.mp3
Lene - Pretty Young Thing.wma
……
此题不考虑重复运行的问题。所有文件名都是这个标准:编号 - 歌手 - 歌曲
==============================
相信这会是一个实用的功能。
大家对文件或目录进行重命名(ren)、删除(del、rd)等操作时要注意先 echo,并且放在测试目录中先对小部分进行测试,因为这些 P 操作一般是不可逆的。
如:echo ren "文件名A" "文件名B"
==============================
2008-11-20:根据 5、6、7 楼意见对测试环境做了相应修改,作为新的一题
  1. ::进阶题测试环境生成
  2. @echo off
  3. md 测试目录
  4. cd 测试目录
  5. del/q *
  6. cd.>"001 - 萨顶顶 - 万物生.mp3"
  7. cd.>"002 - 萨顶顶 - 神香.wma"
  8. cd.>"003 - 013 - 邓丽君 - 月亮代表我的心.mp3"
  9. cd.>"011 - 戴娆 - 绽放.mp3"
  10. cd.>"010 - 梦之旅 - 铃儿响叮当.mp3"
  11. cd.>"007 - 卓依婷 - 捉泥鳅.mp3"
  12. cd.>"周杰伦 - 稻香.wma"
  13. cd.>"005 - Lene - Pretty Young Thing.wma"
  14. cd.>"029 - M2M - The Day You Went Away.mp3"
复制代码
文件名可能会有 0 - 2 个编号不等,但歌手与歌曲名很标准。
要求还是去除编号,不要求批处理一次运行就完成任务,可以多运行几次。


[ 本帖最后由 wxcute 于 2008-11-20 10:04 编辑 ]
作者: BBCC    时间: 2008-11-19 20:36

貌似乱码出现了。  不够字不够字。
作者: wxcute    时间: 2008-11-19 20:38

是阿,有乱码,不知道怎么回事。

已更正。
作者: hlzj88    时间: 2008-11-19 21:24

原帖由 wxcute 于 2008-11-19 20:38 发表
是阿,有乱码,不知道怎么回事。

已更正。

还是乱码,且文件出不全的
作者: lhjoanna    时间: 2008-11-19 21:39

这样可以重复运行吧,只是针对楼上固定格式的文件名(即从第七个字符开始截取)。
  1. @echo off&setlocal enabledelayedexpansion
  2. set "str=0123456789"
  3. for %%i in (*.*) do (
  4.     if "%%~nxi" neq "%~nx0" (
  5.         set /a n=0
  6.         set name=%%~ni
  7.         echo %str%|findstr !name:~,1!>nul&& ren "%%~nxi" "!name:~6!%%~xi"
  8.     )
  9. )
  10. pause
复制代码
测试环境可以这样:
  1. ::测试环境生成
  2. @echo off
  3. md 测试目录
  4. cd 测试目录
  5. del/q *
  6. cd.>"001 - 萨顶顶 - 万物生.mp3"
  7. cd.>"萨顶顶 - 神香.wma"
  8. cd.>"003 - 邓丽君 - 月亮代表我的心.mp3"
  9. cd.>"戴娆 - 绽放.mp3"
  10. cd.>"010 - 梦之旅 - 铃儿响叮当.mp3"
  11. cd.>"卓依婷 - 捉泥鳅.mp3"
  12. cd.>"009 - 周杰伦 - 稻香.wma"
  13. cd.>"005 - Lene - Pretty Young Thing.wma"
  14. cd.>"M2M - The Day You Went Away.mp3"
复制代码

[ 本帖最后由 lhjoanna 于 2008-11-19 22:11 编辑 ]
作者: pusofalse    时间: 2008-11-19 23:00

  1. echo %str%|findstr ...
复制代码
这样的语句存在非常严重的效率问题。
新文件名是原文件名第二列之后的所有字符,这就是规律。
如果是依兄弟的测试格式,也大可不必使用findstr。
cd.>"0Promise don't come easy.mp3"
类似于这样的文件名是否也要去掉前面的那个0呢~?

[ 本帖最后由 pusofalse 于 2008-11-19 23:03 编辑 ]
作者: lhjoanna    时间: 2008-11-20 00:14

恩,谢谢pusofalse的指教。我对于findstr命令还不熟,还在学习中。刚才总是在想怎么才能重复运行。也就是对于我修改后的测试环境中如何区分已经有没有编号。实在没想到什么好方法,想的也很粗糙。按照你的建议,代码如下,在楼主的测试环境中可以通过运行,可是我修改后的环境中却不行。想要重复运行的话,感觉应该是不是应给出个编号与文件名的设置规则之类的,也就是如何区分编号与文件名(例如这样的文件:012 - 013 - 邓丽君 - 月亮代表我的心.mp3应该怎么算?)
     下面这个不能重复运行的。
  1. @echo off&setlocal enabledelayedexpansion
  2. for %%i in (*.*) do (
  3.     if "%%~nxi" neq "%~nx0" (
  4.         for /f "tokens=1* delims=- " %%j in ("%%~ni") do ren "%%~nxi" "%%k%%~xi"
  5.     )
  6. )
  7. pause
复制代码
还望版主继续指教。

[ 本帖最后由 lhjoanna 于 2008-11-20 00:18 编辑 ]
作者: pusofalse    时间: 2008-11-20 04:28

第一次看错题意了,sorry,如果重复运行也没问题的话,用for截取第三列及其后的列的方法就行不通了。。。
暂时的思路是用findstr的正则匹配行首的数字前缀。
作者: wxcute    时间: 2008-11-20 10:08     标题: 回复 9楼 的帖子

题目中的批处理是用来生成测试环境的,并没有一个所谓歌曲列表的 TXT 文档。除非你自己先生成。
思路已经差不多了,改改就好。
作者: sylovanas    时间: 2008-11-20 10:51

偷机
  1. copy /y "%cd%\??? - *.*" "     *.*"
  2. del "%cd%\??? - *.*"
复制代码

作者: scarcr    时间: 2011-8-4 15:41

回复 1# wxcute

费了吃奶的劲,终于搞出来了。
可以应对的情况有前面是歌曲序号不大于100的情况(要是有大于这个的情况,把100改成1000或者10000都可以)
序号形式为数字开头D*的格式,比如说1. 01. 11这种样子的也可以处理。
一次解决前面N组数字序号,歌曲格式定为* - * - *这种类型,如果格式使用其它类型断号,可以在tokens前面加强delims=*,*代表歌曲格式中分割用的符号
缺点,歌手名字以小于100的数字开头的会惨被和谐,目前的状况下500和5566都可以成功存活下来。
在下初学这个,经验不足之处请各位指点。
另外,如果想要if的判定条件有两个的话应该如何处理?
  1. @echo off&setlocal enabledelayedexpansion
  2. :A
  3. set m=0
  4. for /r %%i in (*.*) do (
  5. set "name=%%~nxi"
  6. for /f "tokens=1,2,*" %%j in ("!name!") do (set a=%%j&set c=%%l)
  7. if !a! leq 100 (ren "!name!" "!c!"&set /a m+=1)
  8. )
  9. if !m! equ 0 (pause&goto :eof) else (goto A)
复制代码

作者: zijian521500    时间: 2011-8-9 18:12

偶是新人,折腾了半天才得出个自认为比较经典的命令吧,只需把两个相同的命令执行两遍,即可得到LZ 要求重命名的结果。

cd 测试目录
for /f  "tokens=1* " %%i in ('dir /b') do ren "%%i %%j"  "%%j"
for /f  "tokens=1* " %%i in ('dir /b') do ren "%%i %%j"  "%%j
作者: BHsolve    时间: 2013-12-29 18:08

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. dir /a:-d /b d:\temp\ > temp.txt
  4. for /f "tokens=* delims=" %%i in (temp.txt) do (
  5. set name=%%i
  6. ren d:\temp\%%i !name:~3!)
  7. del temp.txt
  8. pause >nul
复制代码
带临时文件的   感觉我好弱啊
作者: shelluserwlb    时间: 2014-11-17 23:23

本帖最后由 shelluserwlb 于 2014-11-17 23:24 编辑
  1. @echo off
  2. setlocal EnableDelayedExpansion
  3. for %%a in (测试目录\*) do (
  4.     set name1=%%a
  5.     set name2=!name1:*- =!
  6.     ren "!name1!" "!name2!"
  7. )
  8. endlocal
  9. pause
复制代码

作者: 尘丶    时间: 2015-6-10 20:36

for /f "tokens=2,3 delims=-" %%a in ('dir /s /b *.mp3') do cd.>"%%~na - %%~nxb"
pause
作者: sgnhm    时间: 2015-7-12 07:56

呵呵,学习一下。我也想好好的研究一下批处理现在@!
作者: 尘丶    时间: 2015-7-12 10:46

  1. @echo off&setlocal enabledelayedexpansion
  2. for %%a in (*.mp3) do (
  3.     set num=%%a
  4.     for /f "tokens=1,2,3 delims=-." %%b in ("!num!") do (
  5.     ren "%%b-%%c-%%d".mp3 "%%c-%%d".mp3
  6.   )
  7. )
  8. pause
复制代码

作者: lengmoke    时间: 2021-9-22 13:00

  1. @echo off&Setlocal enabledelayedexpansion
  2. cd 测试目录
  3. for /f "delims=" %%i in (' dir /b ') do (
  4.     for /f "tokens=1* delims=-" %%a in ("%%i") do (
  5.         set str=%%a
  6.         ::非数值经set /a 后数值变为0,先替换0防止数值因进制问题被设为0
  7.         set /a str=!str:0=1!
  8.         if !str! GTR 0 ren "%%i" "%%b"
  9.     )
  10. )
复制代码

作者: 唯尘    时间: 2022-10-24 09:13

本帖最后由 唯尘 于 2022-10-24 09:15 编辑

@echo off
echo 001 - 萨顶顶 - 万物生.mp3>>m.txt
echo 002 - 萨顶顶 - 神香.wma>>m.txt
echo 003 - 邓丽君 - 月亮代表我的心.mp3>>m.txt
echo 011 - 戴娆 - 绽放.mp3>>m.txt
echo 010 - 梦之旅 - 铃儿响叮当.mp3>>m.txt
echo 007 - 卓依婷 - 捉泥鳅.mp3>>m.txt
echo 009 - 周杰伦 - 稻香.wma>>m.txt
echo 005 - Lene - Pretty Young Thing.wma>>m.txt
echo 029 - M2M - The Day You Went Away.mp3>>m.txt
setlocal enabledelayedexpansion
for /f "tokens=*" %%i in (m.txt) do (
        set var=%%i
        echo !var:~6!
)
pause>nul
作者: 772074834    时间: 2023-5-4 20:55

::测试环境生成
@echo off
setlocal enabledelayedexpansion
for /r %cd%\测试目录 %%i in (*) do (
        for /f "tokens=1,2,3 delims=-" %%a in ("%%~ni") do (
                set ta=%%b
                set name=!ta:~1!-%%c%%~xi
                ren "%%~fi" "!name!"
        )
)
pause




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