![](/img/trans.png)
[英]VBScript Error “End of Statement” in .vbs File with SendKeys Method
[英].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.