How to get a return value from vbs into rev?

Neil Allan neil at yippo.co.uk
Thu Oct 15 07:06:57 EDT 2009


I'm not sure which version of rev you are using but you may not need to use 
the shell() function.

I personally use vbscript to get WMI data from the PC such as HDD and USB 
Hardware serial numbers. I use the WMI Code Creator availible from 
microsoft's website to generate the vbs code.
http://www.microsoft.com/downloads/details.aspx?FamilyID=2cc30a64-ea15-4661-8da4-55bbc145c30e
This is a little long winded and perhaps a little more involved than you 
need but I want to be pretty clear on how I manage it.

so... I want to enumerate usb devices attached to the PC...I know this 
information (and lots more) is availible through WMI in windows.

Fire up WMI Code Creator (you may need dot.net crap installed)
Select "Query for data from a WMI Class"
Select "root/CIMV2" as a namespace
Select "Dependant" from the properties field

Pure vbs code will be generated for you in the "Generated Code" window:

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_USBControllerDevice",,48)
For Each objItem in colItems
    Wscript.Echo "-----------------------------------"
    Wscript.Echo "Win32_USBControllerDevice instance"
    Wscript.Echo "-----------------------------------"
    Wscript.Echo "Dependent: " & objItem.Dependent
Next

>From here you have 2 Options:

The 1st Option:

Save or write the generated code to a *.vbs file either staticly or 
dynamicly, and call it using
put shell("cscript c:\MyWMIQuery.vbs") --this will dump the result to stdout
put shell("cscript c:\MyWMIQuery.vbs") into tVariable -- this will dump the 
result into variable tVariable
put shell("cscript c:\MyWMIQuery.vbs") into field "field" --this will dump 
the result into a field called "field"

The downside is your code will be "exposed" as plain text and you will have 
to set the hideConsoleWindows to true or your user will see the vbs script 
executing in the command line window.

The 2nd and my preferred option is to use the "do *SCRIPT* as vbscript" 
function in runrev.

The main thing you need to know is that when your vbs function is executed 
in THIS way, the result of the vbs function will have to be stored in a 
variable called "result" in your vbscript, thus it will be transferred to 
"the result" variable in runrev.

What I do is put my modified WMI vbscript into a field "fldScript" in runrev 
this makes it easier to read, however it does not have to be visible :)

strComputer = "."
Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\CIMV2")
Set colItems = objWMIService.ExecQuery( _
    "SELECT * FROM Win32_USBControllerDevice",,48)
For Each objItem in colItems
     tTemp = tTemp & vbcrlf & objItem.Dependent
Next
result = tTemp

Note how my rev version of the vbs script makes no use of "Wscript.Echo" 
because it is no use for us here. So I have also removed the fancy 
formatting stuff:
Wscript.Echo "-----------------------------------"
Wscript.Echo "Win32_USBControllerDevice instance"
They serve no purpose to us, we only want the raw information which is 
returned in vbs by the function "objItem.Dependant"

What I did was instead of echoing the values to stdout I concatenated them 
to the vbs "tTemp" Variable, Once I have all the information I need in the 
tTemp variable, finally assign it to a variable called "result" in vbscript.

To call it and get info back in rev you can then use:

do field "fldScript" as vbscript
put the result --this will dump the result of the vbscript to stout

do field "fldScript" as vbscript
put the result into field "fldOutput" --this will dump the result of the vbs 
function into a field called "fldOutput"
etc...

One last piece of advice I would issue is do only very minimum with vbs, the 
result of the above function contains all sorts of information but I would 
rather sift through it with revTalk than vbscript. The main lines I am 
interested in are the ones containing "USBSTOR"

Hope this helps. 




More information about the use-livecode mailing list