返回列表 发帖

[问题求助] [已解决]VBS如何根据歌单判断所缺歌曲并写入id3v1&v2信息?

本帖最后由 batsealine 于 2013-5-4 09:51 编辑

举例说明,在某文件夹下有:
│  保证.mp3
│  愿牵你的手.mp3
│  爱不死.mp3
│  男人眼泪.mp3
│  
└─刘德华
        因为爱.txt
-----------
因为爱.txt:
保证
愿牵你的手
男人眼泪
爱不死
该怎么才知道
太多太多的抱歉
朱颜记
随风而去
如果看到她,请告诉我
为了你干杯
铁了心爱你
因为爱
-------------------------------------------------------------------------------------------
现想在歌曲同目录下写一个vbs,能将所缺歌曲写入result.txt,其格式如下,并为已有的歌曲写入id3信息,这个写入方法在本论坛已找到。
刘德华 :
  因为爱 :
    该怎么才知道.mp3
    太多太多的抱歉.mp3
    朱颜记.mp3
    随风而去.mp3
    如果看到她,请告诉我.mp3
    为了你干杯.mp3
    铁了心爱你.mp3
    因为爱.mp3
modifyMp3Tags "D:\a.mp3"
sub modifyMp3Tags(file)
set wmp = CreateObject("WMPlayer.ocx")
set oMedia = wmp.newMedia(file)
oMedia.setItemInfo "author", "歌手"
oMedia.setItemInfo "title", "标题"
oMedia.setItemInfo "WM/AlbumTitle", "专辑"
set wmp = Nothing
end sub
'"歌手"不能直接是刘德华,而是文件夹变量
'"标题"即为歌曲名
'"专辑"显然也不能直接是因为爱,而是对应的txt文件名COPY
这个vbs个人觉得还是很实用的,因为我常想将某歌手全部的歌曲下载下来,这样可以很容易判断还差哪些歌并规范id3信息。刚接触vbs,也想借此提高水平。
以前用bat配合id3tool写过同一东西,但id3tool只能改变id3v1信息。不过还是贴上来吧
@echo off&setlocal EnableDelayedExpansion
for /f "delims=" %%i in ('dir /a:d/b') do (
    echo. &echo. &echo %%i :
    for /f "delims=" %%j in ('dir /a-d/b "%%i\*.txt"') do (
      echo   %%~nj :
      for /f "usebackq delims=" %%k in ("%%i\%%j") do (
        if exist "%%k.mp3" (
          id3tool "%%k.mp3" -a "%%~nj" -r "%%i" -t "%%k" "%%k.mp3"
        ) else (
          echo     %%k.mp3
        )
      )
    )
  )>>result.txt
  pauseCOPY
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

Set objFSO = CreateObject("Scripting.FileSystemObject")
set objWmp = CreateObject("WMPlayer.ocx")
strFolder = CreateObject("Wscript.Shell").CurrentDirectory '指定文件夹
strResult = "缺少以下歌曲:" & vbCrLf & vbCrLf
Set objFolders = objFSO.GetFolder(strFolder).SubFolders
For Each objFolder In objFolders '遍历所有歌手名
    Set objFiles = objFSO.GetFolder(objFolder).Files
    For Each objFile In objFiles '遍历所有专辑名
        Set objTextStream = objFSO.OpenTextFile(objFile.Path, 1, False)
        strLost = ""
        Do Until objTextStream.AtEndOfStream
            strLine = Trim(objTextStream.ReadLine)
            If strLine = "" Then Exit Do '容错处理,遇到空行就认为文件已结束
            If objFSO.FileExists(strFolder & "\" & strLine & ".mp3") Then
                Set objMp3File = objWmp.NewMedia(strFolder & "\" & strLine & ".mp3")
                objMp3File.SetItemInfo "author", objFolder.Name
                objMp3File.SetItemInfo "title", strLine
                objMp3File.SetItemInfo "WM/AlbumTitle", Split(objFile.Name, ".")(0)
            Else
                strLost = strLost & Space(8) & strLine & vbCrLf
            End If
        Loop
        If strLost <> "" Then
            strResult = strResult & objFolder.Name & vbCrLf & Space(4) & _
                        Split(objFile.Name, ".")(0) & vbCrLf & strLost & vbCrLf
        End If
    Next
Next
objFSO.OpenTextFile("result.txt", 2, True).WriteLine strResultCOPY
1

评分人数


QQ 20147578

TOP

非常感谢,very cool

TOP

回复 2# czjt1234


    在遍历专辑文件时怎么加一个属性限制,否则若在歌手文件夹内有其它文件时会发生错误

TOP

本帖最后由 czjt1234 于 2013-5-5 17:00 编辑

限制只读取txt文件,假定所有txt文件都是专辑
Set objFSO = CreateObject("Scripting.FileSystemObject")
set objWmp = CreateObject("WMPlayer.ocx")
strFolder = CreateObject("Wscript.Shell").CurrentDirectory & "\"
strResult = "缺少以下歌曲:" & vbCrLf & vbCrLf
Set objFolders = objFSO.GetFolder(strFolder).SubFolders
For Each objFolder In objFolders                '遍历所有歌手名
    Set objFiles = objFSO.GetFolder(objFolder).Files
    For Each objFile In objFiles                '遍历所有专辑名
        If Lcase(Split(objFile.Name, ".")(1)) = "txt" Then
            Set objTextStream = objFSO.OpenTextFile(objFile.Path, 1, False)
            strLost = ""
            Do Until objTextStream.AtEndOfStream
                strLine = Trim(objTextStream.ReadLine)
                If strLine = "" Then Exit Do    '遇到空行就认为文件已结束
                If objFSO.FileExists(strFolder & strLine & ".mp3") Then
                    Set objMp3File = objWmp.NewMedia(strFolder & strLine & ".mp3")
                    objMp3File.SetItemInfo "author", objFolder.Name
                    objMp3File.SetItemInfo "title", strLine
                    objMp3File.SetItemInfo "WM/AlbumTitle", Split(objFile.Name, ".")(0)
                Else
                    strLost = strLost & Space(8) & strLine & vbCrLf
                End If
            Loop
            If strLost <> "" Then
                strResult = strResult & objFolder.Name & vbCrLf & Space(4) & _
                            Split(objFile.Name, ".")(0) & vbCrLf & strLost & vbCrLf
            End If
        End If
    Next
Next
objFSO.OpenTextFile("result.txt", 2, True).WriteLine strResultCOPY

QQ 20147578

TOP

回复 5# czjt1234


    嗯,这样是可以,不过能不能通过正则直接遍历到所有的txt文件

TOP

什么意思~~~~~

QQ 20147578

TOP

回复 7# czjt1234


    就是不用
If Lcase(Split(objFile.Name, ".")(1)) = "txt" Then
End IfCOPY
这一句,直接让objFile代表所有的txt文件。

TOP

fso对象没这个功能

可以考虑Wscript.Shell对象运行cmd命令dir *.txt /a/b

然后读取输出的内容

不过没有必要吧,读取全部文件再判断是否是txt也不影响速度

QQ 20147578

TOP

假设txt文件名为 因.为.爱.txt
会怎样?

TOP

你是担心这个啊

没问题的

QQ 20147578

TOP

回复 11# czjt1234


    呃,如果一个文件名为 "因为爱.txt.exe" ,那么它是不是txt文件呢?

TOP

真是疯狂。。。。用BAT写播放器。。。值得敬佩!
不过如果用面向对象语言编程的话。。。。不值得的一提。。。

TOP

你是担心这个啊

没问题的
czjt1234 发表于 2013-5-6 19:45
If Lcase(Split(objFile.Name, ".")(1)) = "txt" Then
End IfCOPY
没问题?

TOP

真是疯狂。。。。用BAT写播放器。。。值得敬佩!
不过如果用面向对象语言编程的话。。。。不值得的一提。。 ...
wuhengsi 发表于 2013-5-6 20:20


VBS和BAT不分?面向对象就很牛逼?

TOP

返回列表