0

ハードドライブなどの他のドライブを無視しながら(objdrive.drivetype = 4の場合)、DVDドライブが存在することを確認する.vbsを作成しようとしています(それ以外の場合、cdrive = 1の場合-ステートメントなし-など)。ただし、この行は私に悲しみを引き起こしています:「colDrivesの各objDrive」。存在すると構文エラーが発生しますが、削除すると「必要なオブジェクト: objdrive」というエラーが発生します。このスクリプトは、ユーザーがメディアの検索をキャンセルできるようにする hta/vbs ハイブリッドを使用します。これは関数を使用することで実現されるため、これをサブルーチンに入れて呼び出しても無駄です。これが私のコードです。助けてください。

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構文エラーは、ループを閉じるキーワードが欠落していることが原因である可能性が最も高いです。条件付きにも(2つの間)if objdrive.isready thenクロージングが欠けていると思います。不足しているキーワードを追加すると、エラーは解消されます。End IfEnd Select

しかし、あなたはこのすべてを逆さまにやっています。VBScript からオンザフライで HTA を作成するのはなぜですか? HTA を作成し、必要な VBScript コードを埋め込むだけです。概要については、このチュートリアルを参照してください。また、ネストされた関数定義を避けることを強くお勧めします。これらはある時点でメンテナンスの頭痛の種となり、VBScript では一般的に許可されていません。そして、あなたのSelect声明は何をすることになっていますか?構成体

Select Case 1
  Case 1
    'instruction
End Select

そもそも選択がないので、まったく無意味です。命令を直接実行するのとまったく同じです。避けるべきもう 1 つのことは、条件文での空のアクションです。それらは、コードを読みにくくし、維持するのを難しくするだけで、何のメリットもありません。

于 2013-10-09T20:46:44.900 に答える
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 ステートメントが欠落しているようです。その場合、これらも問題を引き起こす可能性があります。

于 2013-10-09T20:31:22.527 に答える