Board logo

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

作者: batsealine    时间: 2013-5-3 14:48     标题: [已解决]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
  1. modifyMp3Tags "D:\a.mp3"
  2. sub modifyMp3Tags(file)
  3. set wmp = CreateObject("WMPlayer.ocx")
  4. set oMedia = wmp.newMedia(file)
  5. oMedia.setItemInfo "author", "歌手"
  6. oMedia.setItemInfo "title", "标题"
  7. oMedia.setItemInfo "WM/AlbumTitle", "专辑"
  8. set wmp = Nothing
  9. end sub
  10. '"歌手"不能直接是刘德华,而是文件夹变量
  11. '"标题"即为歌曲名
  12. '"专辑"显然也不能直接是因为爱,而是对应的txt文件名
复制代码
这个vbs个人觉得还是很实用的,因为我常想将某歌手全部的歌曲下载下来,这样可以很容易判断还差哪些歌并规范id3信息。刚接触vbs,也想借此提高水平。
以前用bat配合id3tool写过同一东西,但id3tool只能改变id3v1信息。不过还是贴上来吧
  1. @echo off&setlocal EnableDelayedExpansion
  2. for /f "delims=" %%i in ('dir /a:d/b') do (
  3.     echo. &echo. &echo %%i :
  4.     for /f "delims=" %%j in ('dir /a-d/b "%%i\*.txt"') do (
  5.       echo   %%~nj :
  6.       for /f "usebackq delims=" %%k in ("%%i\%%j") do (
  7.         if exist "%%k.mp3" (
  8.           id3tool "%%k.mp3" -a "%%~nj" -r "%%i" -t "%%k" "%%k.mp3"
  9.         ) else (
  10.           echo     %%k.mp3
  11.         )
  12.       )
  13.     )
  14.   )>>result.txt
  15.   pause
复制代码

作者: czjt1234    时间: 2013-5-3 17:28

  1. Set objFSO = CreateObject("Scripting.FileSystemObject")
  2. set objWmp = CreateObject("WMPlayer.ocx")
  3. strFolder = CreateObject("Wscript.Shell").CurrentDirectory '指定文件夹
  4. strResult = "缺少以下歌曲:" & vbCrLf & vbCrLf
  5. Set objFolders = objFSO.GetFolder(strFolder).SubFolders
  6. For Each objFolder In objFolders '遍历所有歌手名
  7.     Set objFiles = objFSO.GetFolder(objFolder).Files
  8.     For Each objFile In objFiles '遍历所有专辑名
  9.         Set objTextStream = objFSO.OpenTextFile(objFile.Path, 1, False)
  10.         strLost = ""
  11.         Do Until objTextStream.AtEndOfStream
  12.             strLine = Trim(objTextStream.ReadLine)
  13.             If strLine = "" Then Exit Do '容错处理,遇到空行就认为文件已结束
  14.             If objFSO.FileExists(strFolder & "\" & strLine & ".mp3") Then
  15.                 Set objMp3File = objWmp.NewMedia(strFolder & "\" & strLine & ".mp3")
  16.                 objMp3File.SetItemInfo "author", objFolder.Name
  17.                 objMp3File.SetItemInfo "title", strLine
  18.                 objMp3File.SetItemInfo "WM/AlbumTitle", Split(objFile.Name, ".")(0)
  19.             Else
  20.                 strLost = strLost & Space(8) & strLine & vbCrLf
  21.             End If
  22.         Loop
  23.         If strLost <> "" Then
  24.             strResult = strResult & objFolder.Name & vbCrLf & Space(4) & _
  25.                         Split(objFile.Name, ".")(0) & vbCrLf & strLost & vbCrLf
  26.         End If
  27.     Next
  28. Next
  29. objFSO.OpenTextFile("result.txt", 2, True).WriteLine strResult
复制代码

作者: batsealine    时间: 2013-5-4 09:49

非常感谢,very cool
作者: batsealine    时间: 2013-5-5 16:31

回复 2# czjt1234


    在遍历专辑文件时怎么加一个属性限制,否则若在歌手文件夹内有其它文件时会发生错误
作者: czjt1234    时间: 2013-5-5 16:59

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

限制只读取txt文件,假定所有txt文件都是专辑
  1. Set objFSO = CreateObject("Scripting.FileSystemObject")
  2. set objWmp = CreateObject("WMPlayer.ocx")
  3. strFolder = CreateObject("Wscript.Shell").CurrentDirectory & "\"
  4. strResult = "缺少以下歌曲:" & vbCrLf & vbCrLf
  5. Set objFolders = objFSO.GetFolder(strFolder).SubFolders
  6. For Each objFolder In objFolders                '遍历所有歌手名
  7.     Set objFiles = objFSO.GetFolder(objFolder).Files
  8.     For Each objFile In objFiles                '遍历所有专辑名
  9.         If Lcase(Split(objFile.Name, ".")(1)) = "txt" Then
  10.             Set objTextStream = objFSO.OpenTextFile(objFile.Path, 1, False)
  11.             strLost = ""
  12.             Do Until objTextStream.AtEndOfStream
  13.                 strLine = Trim(objTextStream.ReadLine)
  14.                 If strLine = "" Then Exit Do    '遇到空行就认为文件已结束
  15.                 If objFSO.FileExists(strFolder & strLine & ".mp3") Then
  16.                     Set objMp3File = objWmp.NewMedia(strFolder & strLine & ".mp3")
  17.                     objMp3File.SetItemInfo "author", objFolder.Name
  18.                     objMp3File.SetItemInfo "title", strLine
  19.                     objMp3File.SetItemInfo "WM/AlbumTitle", Split(objFile.Name, ".")(0)
  20.                 Else
  21.                     strLost = strLost & Space(8) & strLine & vbCrLf
  22.                 End If
  23.             Loop
  24.             If strLost <> "" Then
  25.                 strResult = strResult & objFolder.Name & vbCrLf & Space(4) & _
  26.                             Split(objFile.Name, ".")(0) & vbCrLf & strLost & vbCrLf
  27.             End If
  28.         End If
  29.     Next
  30. Next
  31. objFSO.OpenTextFile("result.txt", 2, True).WriteLine strResult
复制代码

作者: batsealine    时间: 2013-5-5 21:17

回复 5# czjt1234


    嗯,这样是可以,不过能不能通过正则直接遍历到所有的txt文件
作者: czjt1234    时间: 2013-5-6 06:37

什么意思~~~~~
作者: batsealine    时间: 2013-5-6 12:00

回复 7# czjt1234


    就是不用
  1. If Lcase(Split(objFile.Name, ".")(1)) = "txt" Then
  2. End If
复制代码
这一句,直接让objFile代表所有的txt文件。
作者: czjt1234    时间: 2013-5-6 15:23

fso对象没这个功能

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

然后读取输出的内容

不过没有必要吧,读取全部文件再判断是否是txt也不影响速度
作者: apang    时间: 2013-5-6 16:08

假设txt文件名为 因.为.爱.txt
会怎样?
作者: czjt1234    时间: 2013-5-6 19:45

你是担心这个啊

没问题的
作者: apang    时间: 2013-5-6 20:16

回复 11# czjt1234


    呃,如果一个文件名为 "因为爱.txt.exe" ,那么它是不是txt文件呢?
作者: wuhengsi    时间: 2013-5-6 20:20

真是疯狂。。。。用BAT写播放器。。。值得敬佩!
不过如果用面向对象语言编程的话。。。。不值得的一提。。。
作者: Demon    时间: 2013-5-6 20:26

你是担心这个啊

没问题的
czjt1234 发表于 2013-5-6 19:45
  1. If Lcase(Split(objFile.Name, ".")(1)) = "txt" Then
  2. End If
复制代码
没问题?
作者: Demon    时间: 2013-5-6 20:29

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


VBS和BAT不分?面向对象就很牛逼?
作者: czjt1234    时间: 2013-5-6 23:29

啊,惭愧惭愧,考虑不周

这样

If Lcase(Right(objFile.Name, 3)) = "txt" Then
作者: czjt1234    时间: 2013-5-6 23:33

本帖最后由 czjt1234 于 2013-5-6 23:37 编辑
  1. Set objFSO = CreateObject("Scripting.FileSystemObject")
  2. set objWmp = CreateObject("WMPlayer.ocx")
  3. strFolder = CreateObject("Wscript.Shell").CurrentDirectory & "\"
  4. strResult = "缺少以下歌曲:" & vbCrLf & vbCrLf
  5. Set objFolders = objFSO.GetFolder(strFolder).SubFolders
  6. For Each objFolder In objFolders                '遍历所有歌手名
  7.     Set objFiles = objFSO.GetFolder(objFolder).Files
  8.     For Each objFile In objFiles                '遍历所有专辑名
  9.         If Lcase(Right(objFile.Name, 3)) = "txt" Then
  10.             Set objTextStream = objFSO.OpenTextFile(objFile.Path, 1, False)
  11.             strLost = ""
  12.             Do Until objTextStream.AtEndOfStream
  13.                 strLine = Trim(objTextStream.ReadLine)
  14.                 If strLine = "" Then Exit Do    '遇到空行就认为文件已结束
  15.                 If objFSO.FileExists(strFolder & strLine & ".mp3") Then
  16.                     Set objMp3File = objWmp.NewMedia(strFolder & strLine & ".mp3")
  17.                     objMp3File.SetItemInfo "author", objFolder.Name
  18.                     objMp3File.SetItemInfo "title", strLine
  19.                     objMp3File.SetItemInfo "WM/AlbumTitle", Left(objFile.Name, Len(objFile.Name) - 4)
  20.                 Else
  21.                     strLost = strLost & Space(8) & strLine & vbCrLf
  22.                 End If
  23.             Loop
  24.             If strLost <> "" Then
  25.                 strResult = strResult & objFolder.Name & vbCrLf & Space(4) & _
  26.                             Left(objFile.Name, Len(objFile.Name) - 4) & vbCrLf & strLost & vbCrLf
  27.             End If
  28.         End If
  29.     Next
  30. Next
  31. objFSO.OpenTextFile("result.txt", 2, True).WriteLine strResult
复制代码

作者: wuhengsi    时间: 2013-5-7 14:30

我淡淡一笑。。。。。。
作者: batsealine    时间: 2013-5-8 14:52

了解了解,最后再次感谢大家
作者: wuhengsi    时间: 2013-5-9 14:42

疯狂。。。不过VBS  很容易被杀软提示




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