中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --
联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum
游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟
中国DOS联盟论坛
现在时间是 2026-08-10 15:53
47,811 主题排行 / 349,897 发帖 / 今日 0 篇 / 48,255 会员排行
DOS批处理 & 脚本技术(批处理室) » 一起帮忙用批处理帮MP3找出未配歌词
可打印版本  3,144 / 13
第1楼 junyee 发表于 2006-10-01 21:17
中级用户 发帖 112 积分 253
一起帮忙用批处理帮MP3找出未配歌词
现在的很多MP3都能显示歌词了,要正常显示的话,歌词文件(*.lrc)必须与歌曲文件(*.mp3)同名,且在同一个目录内。!!!
而我们往往很难发现歌词是否有对应的歌词文件,于是我参考以前发的类似贴做了个批处理,尽管有很多不足之处.^^恳请众位前辈不吝赐教。
假设MP3对应的盘符为G:\
G:\Music是专门存放歌曲的目录,因为现在不少MP3都能读取数层目录,所以把不同类的歌分在不同的目录里面,在使用的时候能够更加顺手。
假设G:\Music下又有两个目录
G:\Music\01
G:\Music\02
批处理如下。

@echo off
del G:\list.txt>nul 2>nul
echo ---G:Music\01 >G:\list.txt
cd /d G:\music\01
for %%i in (*.mp3 *.wma) do (if not exist %%~ni.lrc echo %%~ni>>G:\list.txt)
echo ---G:Music\02 >>G:\list.txt
cd /d G:\Music\02
for %%i in (*.mp3 *.wma) do (if not exist %%~ni.lrc echo %%~ni>>G:\list.txt)
notepad G:\list.txt
exit

经试验能用。我是新手,这种很简单的操作却写出了这么一大堆代码,老觉得别扭,希望大家帮我把这段简化一下,如果有问题,也恳请大家提出来啊~~~

[ Last edited by junyee on 2006-10-1 at 22:49 ]
第2楼 pengfei 发表于 2006-10-01 21:45
银牌会员 发帖 485 积分 1,218 来自 湖南.娄底
@echo off
echo _____________________G:Music\01 >G:\list.txt
cd /d G:\music\01
for %%i in (*.mp3 *.wma) do if not exist %%~ni.lrc echo %%~ni>>G:\list.txt
echo _____________________G:Music\02 >>G:\list.txt
cd /d G:\Music\02
for %%i in (*.mp3 *.wma) do if not exist %%~ni.lrc echo %%~ni>>G:\list.txt
start G:\list.txt
exit

楼主的代码写得不错吗!!! 我去掉del因为下面echo ---G:Music\01 >G:\list.txt这一句会刷新内容. (只要文件属性不是只读!)

两个for语句处属于for与if两个复合语句的嵌套, 不用括号也可以.

notepad G:\list.txt这一句改成start G:\list.txt是因为DOS下的打开应用程序, 因为后缀都是关联好了的, 系统会自动调用记事本来打开它 .

[ Last edited by pengfei on 2006-10-1 at 23:18 ]
第3楼 namejm 发表于 2006-10-01 22:03
荣誉版主 发帖 1,737 积分 5,226 来自 成都
  其实你的代码已经够简洁了,能修改的就只是对一些代码进行一些优化而已,特别是 notepad G:\list.txt 这一句有点问题,一旦你使用了这一句,那么,只有等G:\list.txt被关闭之后,批处理窗口才会退出,并且,末尾的exit语句可以不用。修改你的代码如下:


  刚发完,却发现pengfei已经在2楼给出了代码,呵呵,手脚够快的呀。

  不过去掉del语句不太妥当,因为不知道G:\list.txt 是何属性,万一是只读属性呢,echo重定向到G:\list.txt 就会无法写入!所以我这段代码仍然保留了del语句,并且加了 /a /f 参数来强制删除,并加了静默参数 /q;又考虑到可能不存在G:\list.txt ,所以又用 2>nul 来屏蔽错误信息在屏幕上的显示。

[ Last edited by namejm on 2006-10-1 at 22:09 ]
第4楼 junyee 发表于 2006-10-01 22:35
中级用户 发帖 112 积分 253
kc唉,,我还老觉得不够简洁呢。。
不过。可不可以用什么方法把上面语名再精减一下呢?因为
echo ---G:Music\01 >>G:\list.txt
cd /d G:\music\01
for %%i in (*.mp3 *.wma) do if not exist %%~ni.lrc echo %%~ni>>G:\list.txt
echo ---G:Music\02 >>G:\list.txt
cd /d G:\Music\02
for %%i in (*.mp3 *.wma) do if not exist %%~ni.lrc echo %%~ni>>G:\list.txt
做的是重复动作只是目录名不同而已,如果在G:\music下有很多文件夹的话,岂不是更长了?
第5楼 namejm 发表于 2006-10-01 23:03
荣誉版主 发帖 1,737 积分 5,226 来自 成都
  可以试试下面的代码(暂时没有考虑到各种可能的错误,比如mp3格式的和wma格式的文件同名的问题):
第6楼 zh159 发表于 2006-10-01 23:30
金牌会员 发帖 1,467 积分 3,687
当前目录下所有文件夹都可以
注:文件夹不能有空格、敏感字符



如果想区分mp3格式的和wma格式,改为“>>list.txt echo %1\%%i”
第7楼 NaturalJ0 发表于 2006-10-01 23:54
银牌会员 发帖 533 积分 1,181


我也试试

[ Last edited by NaturalJ0 on 2006-10-2 at 00:01 ]
第8楼 pengfei 发表于 2006-10-02 00:21
银牌会员 发帖 485 积分 1,218 来自 湖南.娄底
大家写的都不错啊, 我也贴一段. 遍历当前目录下的每一个目录. 列出没有歌词的歌曲名, 同时注明所在目录. 对于路径中存在空格的问题应该可以处理. 也会搜索当前目录, 如果没有文件会提示找不到文件...

namejm版主说的只读文件, 将不能写入. 这一点很重要, 所在还是选择DEL. 如果同一目录出现两种格式文件的同名, 这一点不能做任何处理, 因为lrc只能有一个, 所以还得重命名另一种格式的文件.



更多的音乐类型请在第二个for语句中按当前格式添加.

[ Last edited by pengfei on 2006-10-2 at 05:34 ]
第9楼 pengfei 发表于 2006-10-02 02:09
银牌会员 发帖 485 积分 1,218 来自 湖南.娄底
发现5楼namejm兄的代码, 原来不用dir也可以列出目录的匹配文件. 呵呵~ 学习了...

下面的代码和8楼实现一样的功能, 一个for来完成. 速度还可以!



[ Last edited by pengfei on 2006-10-2 at 05:34 ]
第10楼 无奈何 发表于 2006-10-02 05:18
荣誉版主 发帖 356 积分 1,338
命令行简单显示版:


严格格式排版版:
第11楼 pengfei 发表于 2006-10-02 08:27
银牌会员 发帖 485 积分 1,218 来自 湖南.娄底
:sub
@if "%~dp1" NEQ "%dir%" set "dir=%~dp1" &echo. ---%dir%>>G:\list.txt
@if not exist "%~dpn1.lrc" echo. %~n1>>G:\list.txt
@goto :EOF


发现%%i 重新赋予%1居然还可以使用for的变量扩充.....
第12楼 vkill 发表于 2006-10-03 08:01
金牌会员 发帖 1,744 积分 4,103 来自 甘肃.临泽
要是可以弄到像芊芊静听那样自动下载歌词就好了
第13楼 yayumyself 发表于 2007-06-21 17:35
初级用户 发帖 14 积分 36
比我想简洁的多!
第14楼 yayumyself 发表于 2007-06-21 18:21
初级用户 发帖 14 积分 36
这个是检测有没有歌词没有对应的音乐文件
@echo off&setlocal enabledelayedexpansion&color 1f
mode con:cols=50 lines=25
title 删除mp3上未匹配的歌词 http://hi.baidu.com/xinghuo
set n=0
if "%~1"=="" (
echo 请直接拖放包含音乐的文件夹到此文件上
ping /n 6 127.0.0.1>nul&exit
) else (
echo 当前检测目录为:%~1
)
echo _________
for %%i in ("%1\*.lrc") do (
if not exist %1\%%~ni.wma (
if not exist %1\%%~ni.mp3 set/a n+=1&set name!n!=%%i&echo %%~nxi --Not Find )
)
echo.
if %n%==0 echo 所有歌词都匹配&echo 程序来自: http://hi.baidu.com/xinghuo&pause>nul&exit
set /p sure=是否删除这些歌词文件(Y),其他键退出:
if /i "%sure%"=="y" (
cls
echo 正在删除...
for /l %%a in (1,1,%n%) do (
del "!name%%a!" 2>nul
)
echo.&echo ^^_^^,世界清静了!
echo 程序来自: http://hi.baidu.com/xinghuo
)
pause>nul
exit
[ 联系联盟系统管理团队 - 中国DOS联盟 - 标准版 ]
Sponsored by ifanr Inc | © 2001–2023