Question

This is my first question on here, because, although I have searched at least 15 different other posts for the answer to my issue, none have the answer. Please help!

QUESTION: How do I fix Error:800A0009?

DETAILS: I am creating a small program that gathers all local computers and sends them all an audio file to be played. Also, I need to know how to force send, if anyone knows. Lastly, I first run "Get Computers.bat".

My Code:

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

(Obtains variable transferred which contains network name of a computer, and sends it a file to be play using 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)~~~~~~~~~~~

(Gathers computer names and assign each one, using net view, filtering the "\" to Computer%num%. Also, :tempcall is just an error handler.)

@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)

(The computers I made up off the top of my head, but they are generally in that format.)

@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

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~END DETAILS~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

1.) Temp.bat is literally just temporary, it's deleted, as you can see, almost immediately after it's created, it simply holds the value of %num% after it breaks out of the loop, because it didn't show "You have %num%computers on your network!" correctly.

2.) Don't worry too much about the VBScript file except for the top lines:

Option Explicit

Dim args, strOut

set args = Wscript.arguments

strOut= args(0)

IP = strOut

3.) My main issue is that I am trying to find a safe way to have "Computers.bat" call the "Remote Speak.vbs" file and set it's batch variables to be the exact same names to refer to the individual computers, in VBScript variable format.

Was it helpful?

Solution

The error raises because you are not passing any argument to the vbs file, and it is not passed because when you generate computers.bat you are using %1 (the first argument to the :number subroutine) as a parameter, but in call :number there is not any parameter.

Also, the incrementing computer number is not shown in computers.bat because delayedexpansion is not active. When execution reaches a line or block (the code inside parenthesis), the parser replaces variable reads with the value in the variable and then starts to execute it. As the value of the variable changes inside the block, but there is no variable read, only the value of the variable before starting to execute, changes are not seen. You need to setlocal enabledelayedexpansion to enable it and, where needed, change %var% to !var! to indicate the parser that the variable read needs to be delayed, not replaced at initial parse time.

And anyway, your code does not use it. And what is if exist %%f? And why the loop?

For your third question, the Environment property of the WshShell objects lets you read the required variables

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

This is a fast cleanup of your code. From your question it seems this is only the starting point. Adapt as needed.

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 

OTHER TIPS

Dim env
    Set oEnvironment = WScript.CreateObject("WScript.Shell").Environment("PROCESS")
    WScript.Echo oEnvironment("Computer1")
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top