0

我正在尝试创建一个 .vbs 来检查是否存在 dvd 驱动器(如果 objdrive.drivetype= 4),同时忽略其他驱动器,例如硬盘驱动器(否则如果 cdrive = 1,则 -no statement- 等)。然而,这一行让我感到悲痛:“对于 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
4

2 回答 2

1

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

但是,您将整个事情颠倒过来。为什么要从 VBScript 动态创建 HTA?只需编写 HTA 并在其中嵌入您需要的任何 VBScript 代码。有关介绍,请参阅本教程。另外,我强烈建议避免嵌套函数定义。它们会在某些时候给您带来维护上的麻烦,甚至在 VBScript 中通常也不允许使用它们。你的Select陈述应该做什么?一个构造

Select Case 1
  Case 1
    'instruction
End Select

完全没有意义,因为一开始就没有选择。这与直接运行指令完全相同。要避免的另一件事是条件句中的空动作。它们只会使您的代码更难阅读和维护,而不会给您带来任何好处。

于 2013-10-09T20:46:44.900 回答
0

您的问题可能是由于 For 语句中“objDrive”中的大写 D,然后您稍后在循环中使用小写“d”objdrive.isready 引用该名称。您可能希望在顶部声明“选项显式”以查找所有未声明的变量。

你能测试下面的代码,看看它是否正常运行。

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 语句。如果是这样,这些也可能会给您带来问题。

于 2013-10-09T20:31:22.527 回答