中国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] »
请注意:您目前尚未注册或登录,请您注册登录以使用论坛的各项功能,例如发表和回复帖子等。


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



论坛跳转: