中国DOS联盟论坛

中国DOS联盟

-- 联合DOS 推动DOS 发展DOS --

联盟域名:www.cn-dos.net  论坛域名:www.cn-dos.net/forum
DOS,代表着自由开放与发展,我们努力起来,学习FreeDOS和Linux的自由开放与GNU精神,共同创造和发展美好的自由与GNU GPL世界吧!

游客:  注册 | 登录 | 命令行 | 搜索 | 上传 | 帮助 »
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [求助]关于VBS脚本的小问题([新手],制作M3U播放列表)
<<   [1] [2]  >>   >
作者:
标题: [求助]关于VBS脚本的小问题([新手],制作M3U播放列表) 上一主题 | 下一主题
kich
中级用户





积分 397
发帖 168
注册 2006-10-8
状态 离线
『楼 主』:  [求助]关于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 ]


附件 1: 用VBS脚本搜索文件.rar (2007-1-31 12:18, 877 bytes, 下载附件所需积分 1 点 ,下载次数: 23)
2007-1-30 08:44
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
jmz573515
银牌会员




积分 1212
发帖 464
注册 2006-12-13
状态 离线
『第 2 楼』:  

贴一个M3U播放列表表的例子看看


2007-1-30 12:54
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
baomaboy
银牌会员





积分 1513
发帖 554
注册 2005-12-30
状态 离线
『第 3 楼』:  

我试了下发现 ①楼主所述错误之处并无错,运行试只有“Dim fso,s,folder,”此句最后多一,号 ②将上述,号去掉即可运行,但生成的列表文件不在你希望的位置(因为curFolder 是子过程变量,Function Makem3u无法直接使用所以造成路径错误,当fso.CreateTextFile 的路径出错时系统会默认把文件在创建于根目录) ③将sub中的内容直接替换到全局中的SeekLastFolder folder这句即可。 也许我的理解也有错误,还望高手斧正 [ Last edited by baomaboy on 2007-1-31 at 10:59 AM ]


2007-1-31 10:55
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
kich
中级用户





积分 397
发帖 168
注册 2006-10-8
状态 离线
『第 4 楼』:  

m3u播放列表例子: ====00.Playlist.m3u====== 01.happy.mp3 02.fuun.mp3 03.ff.jj.mp3 uukkll.wma hello.mp3


2007-1-31 11:50
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
kich
中级用户





积分 397
发帖 168
注册 2006-10-8
状态 离线
『第 5 楼』:  

感谢3楼的,不过还有疑问: ①去掉","后,还是不能运行,说找不到路径 ②sub 不可以单独提出来吧,因为我SUB里面,又用到SUB本程序,目的是如果文件夹下还有文件夹,那么再接着调用SUB程序,再进入子文件夹. 目的就是进入所有子文件夹!


2007-1-31 11:56
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
baomaboy
银牌会员





积分 1513
发帖 554
注册 2005-12-30
状态 离线
『第 6 楼』:  

呵呵,又帮你看了下 ①“那么再接着调用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) 是取自函数内部。


2007-1-31 14:29
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
baomaboy
银牌会员





积分 1513
发帖 554
注册 2005-12-30
状态 离线
『第 7 楼』:  

如果你只生成一个播放列表在当前目录下你直接可以这样 Set Wm3u=fso.CreateTextFile (“00.PlayList.m3u")'''默认当前路径 或者 Set Wm3u=fso.CreateTextFile (folder&"\"&"00.PlayList.m3u")'''取全局变量 如果你在每个文件夹下都生成表可以传递两个参数 Makem3u Mefile.name,curFolder Function Makem3u(MeFileName,curFolder)


2007-1-31 14:42
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
kich
中级用户





积分 397
发帖 168
注册 2006-10-8
状态 离线
『第 8 楼』:  

很感谢baomaboy兄的悉心指导! 您的修改: NewFolder=curFolder&"\"&Subfolder.name 我已经测试通过了. 看完你的代码,我才恍然大悟!新手毕竟还是新手,顾得了这头,顾不了那头! 至于Function函数的调用! 其实我的目的就是想在子文件夹下建M3U文件的,并不是想在脚本目录下建! 还有,您的"curFolder取自外部过程无效"我想想,也才明白,这函数只可以调用函数括号里的参数的. 再问一下,是不是把"curFolder"在第一行DIM一下! 这样函数就可以调用了?? 再次感谢您!! [ Last edited by kich on 2007-1-31 at 05:57 PM ]


2007-1-31 17:54
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
kich
中级用户





积分 397
发帖 168
注册 2006-10-8
状态 离线
『第 9 楼』:  

又测试了下,还是子文件夹这里的程序有点错! 还是这不通过! PS: Function已经变做两个参量了. Makem3u(Mefile.name) 写成了 Makem3u Mefile.name,curfolder 但在子文件里仍然出错! 要是把这里 NewFolder=curfolder&Subfolder SeekLastFolder NewFolder 加上引号,程序不出错,但也无结果! 既然加了引号不出错,我想应该证明问题就在这了


2007-1-31 18:18
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
kich
中级用户





积分 397
发帖 168
注册 2006-10-8
状态 离线
『第 10 楼』:  

如果大哥能理解我的意思! 希望可以帮我写一个这样的程序~ 去看看您是怎么写的! (如果写的话,希望变量名不要变)


2007-1-31 18:48
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
kich
中级用户





积分 397
发帖 168
注册 2006-10-8
状态 离线
『第 11 楼』:  

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 ===================================


2007-1-31 19:11
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
baomaboy
银牌会员





积分 1513
发帖 554
注册 2005-12-30
状态 离线
『第 12 楼』:  

看到你ok了真替你高兴...... folder = Left(Wscript.ScriptFullName,len(Wscript.ScriptFullName)-len(Wscript.ScriptName)) 最初也发现取目录这句稍有点点问题,不过当时重点不在那里所以没提出来,其实用下面这句应该好一点 folder=FSO.GetParentFolderName(Wscript.ScriptFullName) 呵呵,希望共同进步!


2007-2-1 02:33
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
wedd
初级用户





积分 36
发帖 16
注册 2007-1-2
状态 离线
『第 13 楼』:  

我觉得用批处理更方便 dir /s/b d:\mp3\*.mp3 >d:\mp3.m3u 只要这一个命令就够了


2007-2-6 15:37
查看资料  发短消息  网志   编辑帖子  回复  引用回复
112183883
初级用户





积分 128
发帖 31
注册 2006-10-23
状态 离线
『第 14 楼』:  

顶一下,呵呵,楼上的兄弟说得对,能简便尽量简便一些的好。 [ Last edited by 112183883 on 2007-2-6 at 05:16 PM ]


2007-2-6 16:14
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
ding520
初级用户




积分 29
发帖 15
注册 2007-2-17
状态 离线
『第 15 楼』:  

一个比一个强 !F咯!


2007-2-17 03:41
查看资料  发送邮件  发短消息  网志   编辑帖子  回复  引用回复
<<   [1] [2]  >>   >
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


可打印版本 | 推荐给朋友 | 订阅主题 | 收藏主题



论坛跳转: