![]() |
中国DOS联盟-- 联合DOS 推动DOS 发展DOS --联盟域名:www.cn-dos.net 论坛域名:www.cn-dos.net/forum |
| 游客 | 登录 | 注册 | 会员 | 搜索 | 中国DOS联盟 |
|
中国DOS联盟论坛 现在时间是 2026-08-04 15:32 |
共 48,038 主题排行 / 350,123 发帖 / 今日 0 篇 / 48,251 会员排行 |
| DOS批处理 & 脚本技术(批处理室) » [求助]关于VBS脚本的小问题([新手],制作M3U播放列表) |
| 可打印版本 2,424 / 17 |
| 第1楼 kich | 发表于 2007-01-30 08:44 |
| 中级用户 发帖 168 积分 397 | |
|
[求助]关于VBS脚本的小问题([新手],制作M3U播放列表) 英雄们,我是新手.
VBS 编码目的:把某个文件夹下所有音乐文件(MP3+WMA)在它原目录下创建M3U播放列表文件以下是代码,但有出错,大家告诉我为什么,好吗?? '======== 获得MP3或WMA播放列表.vbs ====== Dim fso,s,folder, '创建连接,并获得脚本当前文件夹目录 Set fso=createobject("scripting.filesystemobject") folder = Left(Wscript.ScriptFullName,len(Wscript.ScriptFullName)-len(Wscript.ScriptName)) '调用过程,输出信息 SeekLastFolder folder Set folder=Nothing Set fso=Nothing Sub SeekLastFolder (ByVal thePath) Set fso = CreateObject("scripting.filesystemobject") '为什么下面总是提示出错呢?说找不到路径.不明白错在哪里,指教一下! Set curFolder = fso.getfolder(thePath) '判断是否有文件 If curFolder.Files.count>0 Then For Each Mefile In curFolder.Files '判断文件是否为音乐文件 If Right(Mefile.name,3)="mp3" Or Right(Mefile.name,3)="wma" Then '调用函数制作Winnamp列表 Makem3u(Mefile.name) End If Next End If '判断文件夹里有子文件夹 If curFolder.SubFolders.count > 0 Then For Each Subfolder In curFolder.SubFolders '进入子文件夹 NewFolder=curfolder&Subfolder SeekLastFolder NewFolder Next End If End Sub '制作列表 Function Makem3u(MeFileName) Set Wm3u=fso.CreateTextFile (curFolder&"\"&"00.PlayList.m3u") s=s&MeFilename&VbCrLf Wm3u.WriteLine s Wm3u.Close Set Wm3u=Nothing End Function '=========== End =================================== 想要生成的文件列表: ====== 00.PlayList.m3u ====== 101.Enter Sandman.mp3 102.Creeping Death.mp3 103.Harvester of Sorrow.mp3 104.Welcome Home (Sanitarium).mp3 105.Sad but True.mp3 . . . . 110.Ain't my B_tch.mp3 ========== end ======= 数字都是歌曲名!! 再帖上一个"用VBS脚本搜索文件.vbs"的文件,是网上的,可以运行. 我的上面脚本和这个文件脚本有很多相似之处,基本上就是一样的! 但为什么它的可以运行,我的就不可以呢? 我基本上就是按照他的代码来的!!! [ Last edited by kich on 2007-1-31 at 12:18 PM ] 附件 用VBS脚本搜索文件.rar (877 bytes) |
|
| 第2楼 jmz573515 | 发表于 2007-01-30 12:54 |
| 银牌会员 发帖 464 积分 1,212 | |
|
贴一个M3U播放列表表的例子看看
|
|
| 第3楼 baomaboy | 发表于 2007-01-31 10:55 |
| 银牌会员 发帖 554 积分 1,513 | |
|
我试了下发现
①楼主所述错误之处并无错,运行试只有“Dim fso,s,folder,”此句最后多一,号 ②将上述,号去掉即可运行,但生成的列表文件不在你希望的位置(因为curFolder 是子过程变量,Function Makem3u无法直接使用所以造成路径错误,当fso.CreateTextFile 的路径出错时系统会默认把文件在创建于根目录) ③将sub中的内容直接替换到全局中的SeekLastFolder folder这句即可。 也许我的理解也有错误,还望高手斧正 [ Last edited by baomaboy on 2007-1-31 at 10:59 AM ] |
|
| 第4楼 kich | 发表于 2007-01-31 11:50 |
| 中级用户 发帖 168 积分 397 | |
|
m3u播放列表例子:
====00.Playlist.m3u====== 01.happy.mp3 02.fuun.mp3 03.ff.jj.mp3 uukkll.wma hello.mp3 |
|
| 第5楼 kich | 发表于 2007-01-31 11:56 |
| 中级用户 发帖 168 积分 397 | |
|
感谢3楼的,不过还有疑问:
①去掉","后,还是不能运行,说找不到路径 ②sub 不可以单独提出来吧,因为我SUB里面,又用到SUB本程序,目的是如果文件夹下还有文件夹,那么再接着调用SUB程序,再进入子文件夹. 目的就是进入所有子文件夹! |
|
| 第6楼 baomaboy | 发表于 2007-01-31 14:29 |
| 银牌会员 发帖 554 积分 1,513 | |
|
呵呵,又帮你看了下
①“那么再接着调用SUB程序”应该是这个过程出错了,实际上程序开始正常运行时Set curFolder = fso.getfolder(thePath)这句已经通过了,我们看到的错误其实是你那个为取子目录而重新调用sub时出错 NewFolder=curfolder&Subfolder'''此句是无效路径,下面当然出错。 SeekLastFolder NewFolder 应改为: NewFolder=curFolder&"\"&Subfolder.name SeekLastFolder NewFolder ②还是Function Makem3u取路径问题: curFolder取自外部过程无效, 而你提供的搜索的例子: thePath = Trim(thePath) FormatPath = thePath If Right(thePath, 1) = "\" Then FormatPath = Mid(thePath, 1, Len(thePath) - 1) 是取自函数内部。 |
|
| 第7楼 baomaboy | 发表于 2007-01-31 14:42 |
| 银牌会员 发帖 554 积分 1,513 | |
|
如果你只生成一个播放列表在当前目录下你直接可以这样
Set Wm3u=fso.CreateTextFile (“00.PlayList.m3u")'''默认当前路径 或者 Set Wm3u=fso.CreateTextFile (folder&"\"&"00.PlayList.m3u")'''取全局变量 如果你在每个文件夹下都生成表可以传递两个参数 Makem3u Mefile.name,curFolder Function Makem3u(MeFileName,curFolder) |
|
| 第8楼 kich | 发表于 2007-01-31 17:54 |
| 中级用户 发帖 168 积分 397 | |
|
很感谢baomaboy兄的悉心指导!
您的修改: NewFolder=curFolder&"\"&Subfolder.name 我已经测试通过了. 看完你的代码,我才恍然大悟!新手毕竟还是新手,顾得了这头,顾不了那头! 至于Function函数的调用! 其实我的目的就是想在子文件夹下建M3U文件的,并不是想在脚本目录下建! 还有,您的"curFolder取自外部过程无效"我想想,也才明白,这函数只可以调用函数括号里的参数的. 再问一下,是不是把"curFolder"在第一行DIM一下! 这样函数就可以调用了?? 再次感谢您!! [ Last edited by kich on 2007-1-31 at 05:57 PM ] |
|
| 第9楼 kich | 发表于 2007-01-31 18:18 |
| 中级用户 发帖 168 积分 397 | |
|
又测试了下,还是子文件夹这里的程序有点错!
还是这不通过! PS: Function已经变做两个参量了. Makem3u(Mefile.name) 写成了 Makem3u Mefile.name,curfolder 但在子文件里仍然出错! 要是把这里 NewFolder=curfolder&Subfolder SeekLastFolder NewFolder 加上引号,程序不出错,但也无结果! 既然加了引号不出错,我想应该证明问题就在这了 |
|
| 第10楼 kich | 发表于 2007-01-31 18:48 |
| 中级用户 发帖 168 积分 397 | |
|
如果大哥能理解我的意思!
希望可以帮我写一个这样的程序~ 去看看您是怎么写的! (如果写的话,希望变量名不要变) |
|
| 第11楼 kich | 发表于 2007-01-31 19:11 |
| 中级用户 发帖 168 积分 397 | |
|
OK了,终于OK了,经过我多次调试(真的是多次,很多次啊)
最后,终于成功了,代码变了一些!位置也变了一些. (为便于观察操作流程,我设置了 msgbox 跟踪显示) 特将代码写如下,并加注释: (用的时候,可以把msgbox去掉!否则文件夹多的时候,很烦) '======== 获得MP3或WMA播放列表.vbs ====== Dim fso,s,folder Set fso=createobject("scripting.filesystemobject") folder = Left(Wscript.ScriptFullName,len(Wscript.ScriptFullName)-len(Wscript.ScriptName)-1) '这里多减了个1,把最后的"\"减掉,方便以后循环加"\" SeekLastFolder folder Set folder=Nothing Set fso=Nothing ''========================================================================== Sub SeekLastFolder (ByVal thePath) Set fso = CreateObject("scripting.filesystemobject") Set curFolder = fso.getfolder(thePath) If curFolder.Files.count>0 Then For Each Mefile In curFolder.Files If Right(Mefile.name,3)="mp3" Or Right(Mefile.name,3)="wma" Then s=s&Mefile.name&vbcrlf '这里,只是设置了字符串,而不是直接调用函数,因为"For Each Mefile In curFolder.Files"- '将决定这里执行的次数,如果直接调用函数,讲会执行文件数的次数. '这里只是记录下列表文件,最后在执行函数! End If Next if s<>"" then Makem3u s,curfolder msgbox "ok" end if '本来是没有这个IF语句的,后来观察到,在跟目录下也建了一个,而我跟目录下(脚本目录),根本就没有音乐文件啊. '后来想想知道,"curFolder.Files.count>0"这句语句成立了,因为脚本算一个文件了嘛! '但因为FOR循环里条件限制,又没字符串输出,所以,是空.这样输出一个空列表文件.所以这里加了个IF条件 End If If curFolder.SubFolders.count > 0 Then For Each Subfolder In curFolder.SubFolders msgbox curfolder&"\"&Subfolder.name '按照英雄提示,修改了这里 SeekLastFolder curfolder&"\"&Subfolder.name Next End If End Sub ''================================================================================= Function Makem3u(MeFileName,curfolder) Set Wm3u=fso.CreateTextFile (curfolder&"\"&"00.PlayList.m3u") Wm3u.WriteLine MeFileName Wm3u.Close MeFileName="" '如果这里不清空,列表讲一直累计下去,到最后一个列表,会列出所有音乐文件 Set Wm3u=Nothing '再次感谢baomaboy的指引,谢谢!成功了 End Function '=========== End =================================== |
|
| 第12楼 baomaboy | 发表于 2007-02-01 02:33 |
| 银牌会员 发帖 554 积分 1,513 | |
|
看到你ok了真替你高兴......
folder = Left(Wscript.ScriptFullName,len(Wscript.ScriptFullName)-len(Wscript.ScriptName)) 最初也发现取目录这句稍有点点问题,不过当时重点不在那里所以没提出来,其实用下面这句应该好一点 folder=FSO.GetParentFolderName(Wscript.ScriptFullName) 呵呵,希望共同进步! |
|
| 第13楼 wedd | 发表于 2007-02-06 15:37 |
| 初级用户 发帖 16 积分 36 | |
|
我觉得用批处理更方便
dir /s/b d:\mp3\*.mp3 >d:\mp3.m3u 只要这一个命令就够了 |
|
| 第14楼 112183883 | 发表于 2007-02-06 16:14 |
| 初级用户 发帖 31 积分 128 | |
|
顶一下,呵呵,楼上的兄弟说得对,能简便尽量简便一些的好。
[ Last edited by 112183883 on 2007-2-6 at 05:16 PM ] |
|
| 第15楼 ding520 | 发表于 2007-02-17 03:41 |
| 初级用户 发帖 15 积分 29 | |
|
一个比一个强 !F咯!
|
|
| 1 2 下一页 |
|
[ 联系联盟系统管理团队 -
中国DOS联盟 -
标准版 ] Sponsored by ifanr Inc | © 2001–2023 |