'对于colDrives中的每个objDrive'创建函数语法错误

时间:2013-10-09 20:05:52

标签: vbscript

我正在尝试创建一个.vbs,它将检查是否存在DVD驱动器(如果objdrive.drivetype = 4)而忽略其他驱动器(如硬盘驱动器)(否则如果cdrive = 1则为-no statement- ect。)。 然而,这条线让我感到悲伤:“对于colDrives中的每个objDrive”。当它存在时会导致语法错误,但是当它被删除时会导致错误,说“需要对象:objdrive”。该脚本使用hta / vbs混合,它提供用户取消对媒体的搜索,这是通过使用一个函数实现的,因此将它放在sub中并调用它将是无用的。这是我的代码,请帮忙。

Set shell=CreateObject("wscript.shell")
Set objShell = Wscript.CreateObject("WScript.Shell") 
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set colDrives = objFSO.Drives
For Each objDrive in colDrives

if objdrive.drivetype= 4 then 
select case 1

case 1

if objdrive.isready then
'continue statement here
else
select case 2

case 2

with HTABox("#F2F2F2", 115, 300, 700, 400)
.document.title = "Waiting..."
.msg.innerHTML = "Waiting for playable media...<b>"

end with
function HTABox(sBgColor, h, w, l, t)
Dim IE, HTA


randomize : nRnd = Int(1000000 * rnd)
sCmd = "mshta.exe ""javascript:{new " _
   & "ActiveXObject(""InternetExplorer.Application"")" _
   & ".PutProperty('" & nRnd & "',window);" _
   & "window.resizeTo(" & w & "," & h & ");" _
   & "window.moveTo(" & l & "," & t & ")}"""

with CreateObject("WScript.Shell")
.Run sCmd, 1, False
do until .AppActivate("javascript:{new ") : WSH.sleep 10 : loop
end with ' WSHShell

For Each IE In CreateObject("Shell.Application").windows
If IsObject(IE.GetProperty(nRnd)) Then
  set HTABox = IE.GetProperty(nRnd)
  IE.Quit
  HTABox.document.title = "Waiting"
  HTABox.document.write _
           "<HTA:Application contextMenu=no border=thin " _
         & "minimizebutton=no maximizebutton=no sysmenu=no />" _
         & "<body scroll=no style='background-color:" _
         & sBgColor & ";font:normal 10pt Arial;" _
         & "border-Style:normal;border-Width:0px'" _
         & "onbeforeunload='vbscript:if (done.value or cancel.value) then " _
         & "window.event.cancelBubble=false:" _
         & "window.event.returnValue=false:" _
         & "cancel.value=false: done.value=false:end if'>" _
         & "<input type=hidden id=done   value=false>" _
     & "<input type=hidden id=cancel value=false>" _
         & "<center><span id=msg>&nbsp;</span><br>" _
     & "&nbsp; &nbsp; &nbsp; &nbsp;<center><input type=button id=btn1 value=Cancel
         ' "_
         & "onclick=self.close><center></body>"
exit function
End If
Next

MsgBox "HTA window not found."
wsh.quit

End Function
end select
end select
else if objdrive.drivetype = 1 then
else if objdrive.drivetype = 2 then
else if objdrive.drivetype = 3 then
else if objdrive.drivetype = 5 then
end if

2 个答案:

答案 0 :(得分:1)

语法错误很可能是由于缺少关闭循环的Next关键字引起的。我认为条件if objdrive.isready then也缺少结束End If(在两个End Select之间)。添加缺少的关键字,错误就会消失。

然而,你正在完成整个过程。为什么要从VBScript动态创建HTA?只需编写HTA并在其中嵌入您需要的任何VBScript代码。有关简介,请参阅this tutorial。另外,我强烈建议强烈建议避免使用嵌套函数定义。它们会在某些时候引起您的维护问题,甚至在VBScript中通常都不允许这样做。你的Select陈述应该做什么?构造

Select Case 1
  Case 1
    'instruction
End Select

完全没有意义,因为首先没有选择。它与直接运行指令完全相同。另一件要避免的是条件句中的空行为。它们只会使您的代码更难以阅读和维护而不会产生任何好处。

答案 1 :(得分:0)

可能你的问题可能是由你的For语句中的“objDrive”中的大写字母D引起的,然后你在循环中用小写字母“d”objdrive.isready引用该名称。您可能希望在顶部声明“Option Explicit”以查找所有未声明的变量。

您可以测试下面的代码并查看它是否正常运行。

Set objFSO = CreateObject("Scripting.FileSystemObject")
For Each objDrive in objFSO.Drives
    If objDrive.DriveType = 4 Then 
        If objDrive.IsReady Then
            MsgBox "The appropriate media is inserted and ready for access"
        Else
            MsgBox "The Drive Is Not Ready"
        End If
    End If
Next

另外,我不确定您提供的代码段是否为完整代码,但似乎有几个缺少的End语句。如果是这样,这些也可能会给您带来麻烦。