标题: [问题求助] [已解决]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- 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文件名
复制代码
这个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
- pause
复制代码
作者: czjt1234 时间: 2013-5-3 17:28
- 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 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文件都是专辑- 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 strResult
复制代码
作者: batsealine 时间: 2013-5-5 21:17
回复 5# czjt1234
嗯,这样是可以,不过能不能通过正则直接遍历到所有的txt文件
作者: czjt1234 时间: 2013-5-6 06:37
什么意思~~~~~
作者: batsealine 时间: 2013-5-6 12:00
回复 7# czjt1234
就是不用- If Lcase(Split(objFile.Name, ".")(1)) = "txt" Then
- 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
- If Lcase(Split(objFile.Name, ".")(1)) = "txt" Then
- 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 编辑
- 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(Right(objFile.Name, 3)) = "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", Left(objFile.Name, Len(objFile.Name) - 4)
- Else
- strLost = strLost & Space(8) & strLine & vbCrLf
- End If
- Loop
- If strLost <> "" Then
- strResult = strResult & objFolder.Name & vbCrLf & Space(4) & _
- Left(objFile.Name, Len(objFile.Name) - 4) & vbCrLf & strLost & vbCrLf
- End If
- End If
- Next
- Next
-
- 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://www.bathome.net/) |
Powered by Discuz! 7.2 |