簡體   English   中英

.vbs(5,1)Microsoft VBScript運行時錯誤:下標超出范圍錯誤:800A0009

[英].vbs(5, 1) Microsoft VBScript runtime error: Subscript out of range Error:800A0009

這是我在這里的第一個問題,因為雖然我已經搜索了至少15個不同的其他帖子來解答我的問題,但沒有人能得到答案。 請幫忙!

問題:如何修復錯誤:800A0009

詳細信息:我正在創建一個小程序,它收集所有本地計算機並向它們發送所有要播放的音頻文件。 此外,如果有人知道,我需要知道如何強制發送。 最后,我首先運行“Get Computers.bat”。

我的代碼:

~~~~~~ VBS FILE(Remote Speak.vbs)~~~~~~~~~~~~~~~~~~~

(獲取包含計算機網絡名稱的變量傳輸,並使用SAPI向其發送要播放的文件)

'get ip    
Option Explicit    
Dim args, strOut   
set args = Wscript.arguments    
strOut= args(0)    
IP = strOut

'get MSG    
MSG = InputBox("Type what you want the PC to say:", "Remote Voice Send By X BiLe", "")

If MSG = "" Then WScript.quit: Else

'vbs command to send

A = "on error resume next" & VBCRLF & _    
"CreateObject(""SAPI.SpVoice"").speak " & """" & MSG & """" & VBCRLF & _    
"CreateObject(""Scripting.FileSystemObject"").DeleteFile (""C:\Voice1.vbs"")"

' Create the vbs on remote C$    
CreateObject("Scripting.FileSystemObject").OpenTextFile("\\" & ip & "\C$\Voice1.vbs",2,True).Write A

' Run the VBS through Wscript on remote machine via WMI Object Win32_Process    
B = GetObject("winmgmts:\\" & IP & "\root\cimv2:Win32_Process").Create("C:\windows\system32\wscript.exe ""C:\Voice1.vbs""", null, null, intProcessID)

~~~ BATCH PRIMARY(Get Computers.bat)~~~~~~~~~~~

(收集計算機名稱並使用網絡視圖分配每個計算機名稱,將“\\”過濾到計算機%num%。此外,:tempcall只是一個錯誤處理程序。)

@echo off    
cls    
set num=1    
echo @echo off > Computers.bat    
if "%1"=="loop" (    
for /f "delims=\ tokens=*" %%a in ('net view ^| findstr /r "^\\\\"') do (    
set comp=%%a    
call :number    
if exist %%f exit    
)    
goto :eof    
)    
cmd /v:on /q /d /c "%0 loop"    
:tempcall    
call temp.bat    
echo.    
echo.    
echo.    
echo You have %num%computers on your network!    
pause>nul    
del /q temp.bat    
start Computers.bat    
exit    
:number    
if %comp% == "" (    
goto :tempcall    
) else (    
echo set Computer%num%=%comp% >> Computers.bat    
echo cscript "Remote Speak.vbs" %1 >> Computers.bat    
echo call "Remote Speak.vbs" >> Computers.bat    
echo set num=%num% > temp.bat    
echo Computer%num%: %comp%    
set /a num=%num% + 1    
)

BATCH SECONDARY(Computers.bat)

(我自己編制的計算機,但它們通常采用這種格式。)

@echo off    
set Computer1=040227-CYCVN1                                              
cscript "Remote Speak.vbs" //NoLogo > log.txt    
set Computer1=051448-YZVN2                                                             
cscript "Remote Speak.vbs" //NoLogo > log.txt    
pause>nul

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~詳情~~~~~~~~~~~~~~~~ ~~~~~~~~~~~~~~~~~~~~

1.)Temp.bat實際上只是暫時的,它被刪除了,正如你所看到的,幾乎在它創建之后,它只是在它突然退出循環之后保持%num%的值,因為它沒有顯示“你擁有網絡上%num%的計算機!“ 正確。

2.)除了頂行之外,不要過多擔心VBScript文件:

Option Explicit

Dim args, strOut

set args = Wscript.arguments

strOut= args(0)

IP = strOut

3.)我的主要問題是我試圖找到一種安全的方法讓“Computers.bat”調用“Remote Speak.vbs”文件並將其批處理變量設置為與各個計算機完全相同的名稱,以VBScript變量格式。

錯誤引發因為您沒有將任何參數傳遞給vbs文件,並且它沒有被傳遞,因為當您生成computers.bat您使用%1:number子例程的第一個參數)作為參數,但在call :number沒有任何參數。

此外,遞增計算機數量並不所示computers.bat因為delayedexpansion不活躍。 當執行到達一行或一個塊(括號內的代碼)時,解析器用變量中的值替換變量讀取,然后開始執行它。 由於變量的值在塊內部發生變化,但沒有變量讀取,只有變量的值開始執行之前 ,沒有看到變化。 您需要setlocal enabledelayedexpansion才能啟用它,並在需要時將%var%更改為!var! 指示解析器需要延遲變量讀取,而不是在初始解析時替換。

無論如何,您的代碼不會使用它。 if exist %%f什么? 為什么loop

對於第三個問題, WshShell對象的Environment屬性允許您讀取所需的變量

Dim env
    Set oEnvironment = WScript.CreateObject("WScript.Shell").Environment("PROCESS")
    WScript.Echo oEnvironment("Computer1")

這是對代碼的快速清理。 從您的問題來看,這似乎只是一個起點。 根據需要進行調整。

RemoteSpeak.vbs

Option Explicit    

If WScript.Arguments.Count < 1 Then 
    WScript.Quit
End If

'get ip
Dim IP
    IP = WScript.Arguments.Item(0)

'get MSG    
Dim MSG
    MSG = InputBox("Type what you want the PC to say:", "Remote Voice Send By X BiLe", "")
    If MSG = "" Then 
        WScript.Quit
    End If

Dim A
    A = "on error resume next" & VBCRLF & _    
        "CreateObject(""SAPI.SpVoice"").speak " & """" & MSG & """" & VBCRLF & _    
        "CreateObject(""Scripting.FileSystemObject"").DeleteFile(WScript.ScriptFullName)"

' Create the vbs on remote C$    
    CreateObject("Scripting.FileSystemObject").OpenTextFile("\\" & IP & "\C$\Voice1.vbs",2,True).Write A

' Run the VBS through Wscript on remote machine via WMI Object Win32_Process    
Dim B
    B=GetObject("winmgmts:\\" & IP & "\root\cimv2:Win32_Process").Create("C:\windows\system32\wscript.exe ""C:\Voice1.vbs""", null, null, intProcessID)

getComputers.bat

@echo off    
    setlocal enableextensions enabledelayedexpansion
    cls    
    set "num=0"
    (   echo @echo off
        for /f "tokens=* delims=\" %%a in ('net view ^| findstr /r /c:"^\\\\"') do (
            set /a "num+=1"
            echo set "Computer!num!=%%a"
            echo cscript "RemoteSpeak.vbs" %%a
        )    
    ) > computers.bat

    echo You have %num% computers in your network
    pause > nul
    start Computers.bat
    endlocal
    exit /b 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM