VBScript
VBScript
"VBScript (short for Visual Basic Scripting Edition) is an Active Scripting language developed by Microsoft. The language's syntax reflects its history as a limited variation of Microsoft's Visual Basic programming language." VBScript - Wikipedia
MSDN - VBScript
Reference Guides
Tips
- Always use Option Explicit and declare all variables [1]
- (Temporarily) disable all On Error Resume Next lines
- Modularize your scripts with functions and subroutines
- Use descriptive names for variables, functions and subroutines
- Initialize variables
- Avoid nested functions
- Display or log intermediate results like variable values and return codes
- Create and use a debug window
- Use a VBScript aware editor or IDE with built-in debugger and object browser
- My personal favorite is VbsEdit. Because there are more editors and more scripting languages, I compiled a list of script editors and IDEs
- Document your scripts with useful comments
- Use custom error handling
- Clean up
- Check the WSH version
- Use a debugger, if available
Default Script Engine
CScript //H:CScript //S
This was found when running prncnfg:
Windows Script Host Please run this script using CScript. This can be achived by 1. Using "Cscript script.vbs arguments" or 2. Changing the default Windows Scripting Host to CScript using "CScript //H:CScript //S" and running the script "script.vbs arguments".
Syntax
NOTE: Generally VBScript is not case sensitive!
File Extensions
.VBS and .VBE
Comments
' this is a comment
Echo
Hello World:
wscript.echo("Hello World")
Variables
Variable:
Dim i
Integer:
i = 5
String
i = "test"
Boolean
i = true i = false
Dim
Dim Version : Version = "1.0" ' Script version Dim strFileName Dim var1, var2, var3
Constants
Const xl3DPie = -4102 Const xlColumns = 2
if
If [EXPRESSION] Then ... ElseIf [EXPRESSION] Then ... Else ... End If
If i = true Then ... End If
for
For i = 1 to 5 wscript.echo i Next
while
string concatenation
mystring = "hello " & "world"
line wrapping
mystring = "this is"_ & "a wrapped line"
Exit
WScript.Quit(1)
Console Output
' VBScript which uses the root WSH COM object "WScript" to display a message and 'OK' button. ' vbscript: GUI message box with message ' cscript: console output wscript.echo("Hello World")
cscript mytest.vbs
Console Input
strIn = wscript.stdin.readline
cscript
Difference between vbscript and cscript
- "The WScript command opens separate windows for output, whereas the CScript command sends output to the Command Prompt window from which it was initiated." [2]
To force cscript:
To Change the Default Script Host:
On initial installation of Windows Script Host, the default script host is WScript. To change it to CScript, type the following at a command line. (On computers running Windows Vista, open the command prompt by using Run as administrator.)
cscript //h:cscript
To change the default host from CScript to WScript, type the following at a command line.
cscript //h:wscript
Sleep
WScript.Sleep 100
Subroutines
Sub CheckError ... End Sub
Functions
Sub Sort( ByRef myArray ) End Sub
Sub Sort( ByVal myArray ) End Sub
Arrays
Display array on screen:
WScript.Echo Join( myArray, vbCrLf )
input box
inputBox Prompt, Title, Default, Xpos, Ypos, HelpFile, Context inputbox "hello", "title", "default text"
message box
MsgBox Prompt, Buttons, Title
MsgBox "Please run this script with cscript.exe." & Chr(13) & _ "For example : cscript " & WScript.ScriptName & " /?", _ vbExclamation, WScript.ScriptName
Buttons:
CONSTANT | VALUE | DESCRIPTION |
VBOKOnly | 0 | Show OK button |
VBOKCancel | 1 | Show OK and cancel buttons |
VBAbortRetryIgnore | 2 | Show abort, retry, ignore buttons |
VBYesNoCancel | 3 | Show yes, no cancel buttons |
VBYesNo | 4 | Show yes, no buttons |
VBRetryCancel | 5 | Show retry, cancel buttons |
VBCritical | 16 | Show critical message icon |
VBQuestion | 32 | Show warning query button |
VBExclamation | 48 | Show warning message icon |
VBInformation | 64 | Show information message icon |
VBDefaultButton1 | 0 | First button is default |
VBDefaultButton2 | 256 | Second button is default |
VBDefaultButton3 | 512 | Third button is default |
VBDefaultButton4 | 768 | Fourth button is default |
VBApplicationModal | 0 | Demands that the user respond to the dialog before allowing continuation of work in current application |
VBSystemModal | 4096 | Causes suspension of all applications until the user responds to the dialog |
Return Values:
CONSTANT | VALUE | BUTTON |
VBOK | 1 | OK |
VBCancel | 2 | Cancel |
VBAbort | 3 | Abort |
VBRetry | 4 | Retry |
VBIgnore | 5 | Ignore |
VBYes | 6 | Yes |
VBNo | 7 | No |
Command Line Parameters
Script name:
wscript.scriptname
Arguments:
Set Args = Wscript.Arguments If Args.Count = 0 Then ... End If strArg1 = Args(0)
Set args = WScript.Arguments FirstArg = args.Item(0) SecondArg = args.Item(0)
References:
- Microsoft Windows 2000 Scripting Guide - Working with Command-Line Arguments - http://technet.microsoft.com/en-us/library/ee156618.aspx
Error Handling
'** Add Error Handling on error resume Next ... If err.number = vbEmpty Then ... End If
'** Make sure the script is started with cscript If InStr(wscript.FullName, "wscript.exe") > 0 Then MsgBox "Please run this script with cscript.exe." & Chr(13) & _ "For example : cscript " & WScript.ScriptName & " /?", _ vbExclamation, WScript.ScriptName WScript.Quit(1) End If
True Random Numbers
"Computer generated random numbers are not true random numbers. They are retrieved from a stored semi-random sequence. That is why websites like random.org and random.irb.hr exist. They use atmospherical noise and photonic emission in semiconductors respectively, which is more truly random than anything that computer software can generate." [3]
Environment Variables
Set wshShell = CreateObject( "WScript.Shell" ) WScript.Echo wshShell.ExpandEnvironmentStrings( "%PATHEXT%" ) wshShell = Nothing
Dates
TYear = Year(Date) ' 2011 TMonth = Month(Date) ' 3 TDay = Day(Date) ' 7
Today = TYear & "-" & TMonth & "-" & TDay
Include
set oFile = fso.OpenTextFile(sFileName,1) sText = oFile.ReadAll oFile.close ExecuteGlobal sText
Source: [4]
You can create a (relatively) small function in each file that you want to include other files into, as follows: [5]
sub includeFile (fSpec) dim fileSys, file, fileData set fileSys = createObject ("Scripting.FileSystemObject") set file = fileSys.openTextFile (fSpec) fileData = file.readAll () file.close executeGlobal fileData set file = nothing set fileSys = nothing end sub
includeFile "commonapi.vbi" includeFile "dbcalls.vbi"
Examples
randomize.vbs
intHighNumber = 100 intLowNumber = 1 For i = 1 to 5 Randomize intNumber = Int((intHighNumber - intLowNumber + 1) * Rnd + intLowNumber) wscript.echo Int(rnd) Wscript.Echo intNumber Next
Self-Destruct
' Author: Denis St-Pierre ' Function: Make a script delete itself Set objFSO = CreateObject( "Scripting.FileSystemObject" ) objFSO.DeleteFile WScript.ScriptFullName WScript.Quit
defrag.vbs
strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set colProcesses = objWMIService.ExecQuery _ ("Select * from Win32_Process Where Name = 'Dfrgntfs.exe'") If colProcesses.Count = 0 Then Wscript.Echo " Dfrgntfs.exe is not running." Else Wscript.Echo " Dfrgntfs.exe is running." End If
vnc.vbs
strComputer = "." Set objWMIService = GetObject("winmgmts:\\" & strComputer & "\root\cimv2") Set colProcesses = objWMIService.ExecQuery _ ("Select * from Win32_Process Where Name = 'winvnc.exe'") If colProcesses.Count = 0 Then Wscript.Echo " winvnc.exe is not running." Else Wscript.Echo " winvnc.exe is running." End If
ADS - role.vbs
strComputer = "." Set objWMIService = GetObject("winmgmts:" _ & "{impersonationLevel=impersonate}!\\" & strComputer & "\root\cimv2") Set colComputers = objWMIService.ExecQuery _ ("Select DomainRole from Win32_ComputerSystem") For Each objComputer in colComputers Select Case objComputer.DomainRole Case 0 strComputerRole = "Standalone Workstation" Case 1 strComputerRole = "Member Workstation" Case 2 strComputerRole = "Standalone Server" Case 3 strComputerRole = "Member Server" Case 4 strComputerRole = "Backup Domain Controller" Case 5 strComputerRole = "Primary Domain Controller" End Select Wscript.Echo strComputerRole Next
ADS - listaccounts.vbs
Const ADS_SCOPE_SUBTREE = 2 Set objConnection = CreateObject("ADODB.Connection") Set objCommand = CreateObject("ADODB.Command") objConnection.Provider = "ADsDSOObject" objConnection.Open "Active Directory Provider" Set objCOmmand.ActiveConnection = objConnection objCommand.CommandText = _ "Select Name, Location from 'LDAP://DC=ut,DC=keylabs,DC=com' " _ & "Where objectClass='computer'" objCommand.Properties("Page Size") = 1000 objCommand.Properties("Searchscope") = ADS_SCOPE_SUBTREE Set objRecordSet = objCommand.Execute objRecordSet.MoveFirst Do Until objRecordSet.EOF Wscript.Echo "Computer Name: " & objRecordSet.Fields("Name").Value Wscript.Echo "Location: " & objRecordSet.Fields("Location").Value objRecordSet.MoveNext Loop
mysqltest.vbs
'****************************************************************************************** 'Script Name: mysqltest.vbs 'Author: Martin Lydon 'Created: 26/06/2006 'Description: First attempt at MySQL Connection using local DSN - MySQL 3.51 ODBC Connector '****************************************************************************************** 'Script Initialisation OPTION EXPLICIT Dim objDB,arrRecord,strRecord,strOutput Dim oRS, nRec, oFld 'Main Processing section 'Database connection & select all from Table Set objDB = DBConnect() Set oRS = objDB.Execute("SELECT * FROM martin LIMIT 3") 'Dump Records from Table WScript.Echo "Recordset Dump:" nRec = 0 Do While Not oRS.EOF WScript.Echo "-----", nRec : nRec = nRec + 1 For Each oFld In oRS.Fields WScript.Echo oFld.Name & " = " & oFld.Value Next oRS.MoveNext Loop 'Procedures section 'This function sets up DB Connection using specified DSN Function DBConnect Set objDB = CreateObject("ADODB.Connection") objDB.Open "portal" Set DBConnect = objDB End Function
write all your data to a textfile
' Set up Constants Const ForWriting = 2 ' Input OutPut mode Const Create = True Dim MyFile Dim FSO ' FileSystemObject Dim TSO ' TextStreamObject ' Use MapPath function to get the Physical Path of file MyFile = Server.MapPath("textfile.txt") Set FSO = Server.CreateObject("Scripting.FileSystemObject") Set TSO = FSO.OpenTextFile(MyFile, ForWriting, Create) TSO.Write "This is first line in this text File" & vbCrLf ' Vbcrlf is next line character TSO.Write "This is Second line in this text file" & vbCrLf TSO.Write "Writen by devasp visitor at " & Now() TSO.WriteLine "" Response.Write " Three lines are writen to textfile.txt <br>" Response.Write " Local time at server is " & Now() ' close TextStreamObject and ' destroy local variables to relase memory TSO.Close Set TSO = Nothing Set FSO = Nothing
stdout and stdin
Dim StdIn, StdOut Set StdIn = WScript.StdIn Set StdOut = WScript.StdOut Do While Not StdIn.AtEndOfStream str = StdIn.ReadLine StdOut.WriteLine "Line " & (StdIn.Line - 1) & ": " & str Loop
Work with the Registry
' Create a WSH Shell object: Set wshShell = CreateObject( "WScript.Shell" ) ' ' Create a new key: wshShell.RegWrite "HKCU\TestKey\", "" ' Create a new DWORD value: wshShell.RegWrite "HKCU\TestKey\DWordTestValue", 1, "REG_DWORD" ' Create a new subkey and a string value in that new subkey: wshShell.RegWrite "HKCU\TestKey\SubKey\StringTestValue", "Test", "REG_SZ" ' Read the values we just created: WScript.Echo "HKCU\TestKey\DWordTestValue = " _ & wshShell.RegRead( "HKCU\TestKey\DWordTestValue" ) WScript.Echo "HKCU\TestKey\SubKey\StringTestValue = """ _ & wshShell.RegRead( "HKCU\TestKey\SubKey\StringTestValue" ) & """" ' Delete the subkey and key and the values they contain: wshShell.RegDelete "HKCU\TestKey\SubKey\" wshShell.RegDelete "HKCU\TestKey\" ' Note: Since the WSH Shell has no Enumeration functionality, you cannot ' use the WSH Shell object to delete an entire "tree" unless you ' know the exact name of every subkey. ' If you don't, use the WMI StdRegProv instead. ' Release the object Set wshShell = Nothing
ASP.NET VBScript
See ASP.NET VBScript
IDE
has anyone come across and VBScript IDE with integrated debugging? It should have all the usual features I'd expect from an IDE such as syntax highlighting and completion plus integrated debugging with single step and variable inspection.
No recommendations on this myself but you've encouraged me to go looking so here's what I've found so far: http://www.primalscript.com/Editions...onal/index.asp This one looks promising (ie: cheaper and easier to use) http://www.vbsedit.com/ ... and another for good luck http://www.script-debugger.com/produ...r/debugwsh.asp I think I'll take a crack at vbsedit first when I get a chance but hopefully this is a start.
@Geoff: Doesn't the Express edition of VisualBasic do this?
I've used PrimalScript and it is very good. Must say that I prefer scripting in AutoIT these days. One of the reasons I love it is that wherever I am, I can download the whole thing (interpreter, compiler, help file and IDE) in a few seconds from the web site. It compiles to .EXE and comes with a far richer set of commands than VBS. Then there is the whole GUI thing if you need it, not to mention all the extra user defined functions, windows automation, COM functionality... I've yet to discover anything that you can do in VBS that you can't in AutoIT. The reverse, however, is far from true!
I think Textpad would work. www.textpad.com
vbsedit - it has setp/debug which is good and loads of built in code samples VbsEdit costs $49
One of the above sites:
Microsoft Visual Web Developer 2005 works a treat for vbscript. The intellisense works even with vbscript, and it has a full knowledge of the DOM allowing for Autocomplete in client side scripting. <pre> [http://xtremeworlds.com/forums/viewtopic.php?f=5&t=2101 Xtreme Worlds • View topic - FREE VBScript IDE]: <pre> I found a free VBScript IDE. Actually, it's a universal IDE, and it works very well: http://www.pspad.com/en/ (Not completely in English) An alternate to PsPad that is entirely English, but not a true IDE: http://notepad-plus.sourceforge.net/uk/site.htm (Not fully featured) I have also found a debugger with a free trial: http://www.softpedia.com/get/Internet/W ... -IDE.shtml (Not free) I have Cross-Checked ALL sites for legitimacy and Virus-Scanned their downloads.
PSPad forum / English discussion forum / QUERY: PSPad VBScript debugger/executor
Is it possible to execute/debug VBScripts in PSPad? Like a VBScript editor & debugger?
You can excute and catch output of the script if you use command line script interpreter. Program settings / VBScript / Compiler tab With Ctrl+F9 you run your script
This worked for me to execute scripts. Save a simple .vbs file, e.g., Dim i For i = 1 to 10 WScript.Echo "Hello World" Next MsgBox "Check your log", vbInformation Under Settings > Highlighters Settings > MS VBscript > Compilers tab: Compiler: C:\WINDOWS\system32\cscript.exe Parameters: "%File%" Optional (experiment and see what you like): LOG File: [x] Capture program output window
Real Life Forums • View topic - VBScript IDE?
- I need a good IDE for editing VBScript. No, it's not for websites. A program we use at work utilized JScript and VBScript for its scripting capabilities. (Coming versions of the program will allow for Perl, Python, and REXX, and I'm pushing them to include PHP, though I'll script in REXX if I can't do PHP just to annoy others at work.)
- Anyway, VBScript has better array controls than does JScript, but the IDEs out there are lacking. Does anyone have suggestions for something that's free (it takes months to get a purchasing request through the system)? Ideally, I'd like something like PHPEdit, with context-sensitive help and autocomplete, but it's not really required. Syntax coloring is necessary, though, because of the volume of the work I do (one script is already approaching 20KB, and will likely exceed 30KB before I'm done).
- Note: VIM and emacs are out. I need something without a learning curve that requires a rocket jump to get past, because the script development is moving forward so quickly.
http://sourceforge.net/projects/aspprofiler/ Development Status: 5 - Production/Stable A line-level performance profiler for ASP (VBScript) code. Optimize ASP by seeing how many times each line was executed and how long it took. Written in pure ASP, it supports nested server-side includes, and features a client-side sorting dynamic table. -- http://sourceforge.net/projects/tclscript/ Development Status: 2 - Pre-Alpha The TclScript project will provide the Tcl language as an Active Scripting COM object for use under Microsoft Windows. This will allow Tcl to be used anywhere where either VBScript or JScript is currently used by Windows applications. As a sideline, this -- http://sourceforge.net/projects/bsfasp/ This Project Has Not Released Any Files BSF ASP is a implementation of ASP as a java servlet with scripting language support provided by the Bean Scripting Framework so that pages can be created in a number of program languages including VBScript, JavaScript, Python, NetRex, etc. -- http://sourceforge.net/projects/pgiacd/ Development Status: 1 - Planning, 2 - Pre-Alpha The PGIA CD, is an informational educational and (hopefully) well designed Development Environment Suite. The Development Suite, natively supports C,C++,C#,VBScript,Assembly,Visual Basic,Visual Basic .NET and Pascal. Alongside it is the customising script That's what comes up when searching for vbscript ide and having the checkbox for require all words. I included other info because I could. Because of how you're going to use it, it seems ASPProfiler would be best, it's also stable.
http://www.google.com/search?q=VBScript+IDE
jEdit is OSS and supports a VBScript edit mode. (Which basically gives you syntax highlighting and in theory will help with indentation when it comes to IF statements and the like.) Unfortunately, it requires Java, so it may not be an option. I use it for editting JSPs and PHPs all the time and rather like it. But it's not really an IDE. (Although there are some plugins to try and make it into a Java IDE. They don't really succeed.) I doubt you're going to find what you're looking for Martin, but good luck anyway. The only VBScript IDE I've ever used was Visual Studio, and I doubt that's the answer you're looking for. :)