Board logo

标题: 一起帮忙用批处理帮MP3找出未配歌词 [打印本页]

作者: junyee     时间: 2006-10-1 21:17    标题: 一起帮忙用批处理帮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 ]
作者: pengfei     时间: 2006-10-1 21:45
@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 ]
作者: namejm     时间: 2006-10-1 22:03
  其实你的代码已经够简洁了,能修改的就只是对一些代码进行一些优化而已,特别是 notepad G:\list.txt 这一句有点问题,一旦你使用了这一句,那么,只有等G:\list.txt被关闭之后,批处理窗口才会退出,并且,末尾的exit语句可以不用。修改你的代码如下:
@echo off
del /a /f /q G:\list.txt 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
start  G:\list.txt
  刚发完,却发现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 ]
作者: junyee     时间: 2006-10-1 22:35
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下有很多文件夹的话,岂不是更长了?
作者: namejm     时间: 2006-10-1 23:03
  可以试试下面的代码(暂时没有考虑到各种可能的错误,比如mp3格式的和wma格式的文件同名的问题):
@echo off
setlocal enabledelayedexpansion
del /a /f /q G:\list.txt 2>nul
for /r %%i in (.) do (
    set route=%%i
    set route=!route:~0,-2!
    echo -------!route!>>G:\list.txt
    for %%j in ("%%i\*.mp3" "%%i\*.wma") do (
        if not exist %%~nj.lrc echo %%~nj>>G:\list.txt
    )
)
start notepad G:\list.txt

作者: zh159     时间: 2006-10-1 23:30
当前目录下所有文件夹都可以
注:文件夹不能有空格、敏感字符
@echo on
cd.>list.txt
setlocal enabledelayedexpansion
for /f %%i in ('dir/ad/b/s') do (
    set D=%%i
    call :List !D:%cd%\=!)
exit

:List
for %%i in ("%1\*.mp3" "%1\*.wma") do if not exist "%1\%%~ni.lrc" >>list.txt echo %1\%%~ni
goto :eof
如果想区分mp3格式的和wma格式,改为“>>list.txt echo %1\%%i”
作者: NaturalJ0     时间: 2006-10-1 23:54

@echo off

del/a/f/q list.txt 2>nul & for /f "delims=" %%i in ('dir/s/a-d/b *.mp3 *.wma') do ( if not exist "%%~di%%~pi%%~ni.lrc" echo %%i>>list.txt )

start list.txt
我也试试

[ Last edited by NaturalJ0 on 2006-10-2 at 00:01 ]
作者: pengfei     时间: 2006-10-2 00:21
大家写的都不错啊, 我也贴一段. 遍历当前目录下的每一个目录. 列出没有歌词的歌曲名, 同时注明所在目录. 对于路径中存在空格的问题应该可以处理. 也会搜索当前目录, 如果没有文件会提示找不到文件...

namejm版主说的只读文件, 将不能写入. 这一点很重要, 所在还是选择DEL. 如果同一目录出现两种格式文件的同名, 这一点不能做任何处理, 因为lrc只能有一个, 所以还得重命名另一种格式的文件.
@echo off
set route=%cd%
if exist list.txt del /a list.txt
setlocal enabledelayedexpansion
for /r %%m in (.) do (
    set list=%%m
    set list=!list:~0,-2!
    cd /d !list!
    set num=
    for /f "tokens=*" %%i in ('dir /a-d /b *.mp3 *.wma') do (
        if "!num!"==" " echo ===!list!===>>"%route%\list.txt" & set num=
        if not exist %%~ni.lrc echo %%i>>"%route%\list.txt"
    )
)
start "" "%route%\list.txt"
更多的音乐类型请在第二个for语句中按当前格式添加.

[ Last edited by pengfei on 2006-10-2 at 05:34 ]
作者: pengfei     时间: 2006-10-2 02:09
发现5楼namejm兄的代码, 原来不用dir也可以列出目录的匹配文件. 呵呵~ 学习了...

下面的代码和8楼实现一样的功能, 一个for来完成. 速度还可以!
@echo off
set route=%cd%
set term=
set take=set list=%%~dpi
if exist file.txt del /a file.txt
setlocal enabledelayedexpansion
for /f "tokens=*" %%i in ('dir /s /a-d /b *.mp3 *.wma') do (
    !take!
    if "!list!"=="%%~dpi" (
        set take=
    ) else (
        set term= & set take=set list=%%~dpi
    )
    if "!term!"==" " echo ===%%~dpi===>>"%route%\file.txt" & set term=
    if not exist %%~dpni.lrc echo %%~nxi>>"%route%\file.txt"
)
start "" "%route%\file.txt"
[ Last edited by pengfei on 2006-10-2 at 05:34 ]
作者: 无奈何     时间: 2006-10-2 05:18
命令行简单显示版:
@for /r %i in (*.mp3 *.wma) do @if not exist "%~ni.lrc" echo. %%i
严格格式排版版:
@del /a /f /q G:\list.txt 2>nul
@for /r %%i in (*.mp3 *.wma) do @if not exist "%%~dpni.lrc" call :sub "%%i"
@goto :EOF
: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

作者: pengfei     时间: 2006-10-2 08:27


  Quote:
: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的变量扩充.....
作者: vkill     时间: 2006-10-3 08:01
要是可以弄到像芊芊静听那样自动下载歌词就好了
作者: yayumyself     时间: 2007-6-21 17:35
比我想简洁的多!
作者: yayumyself     时间: 2007-6-21 18:21    标题: 这个是检测有没有歌词没有对应的音乐文件

@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