wiki:WindowsScripting

VBScripts

I have to say, I expect much more from VBScript. Or I expect there to be something usable and standard all the way back to Win2000 and maybe NT. Looking at the standard offerings though, it is a common and better than the built-in alternatives.

Here you will find our collection, or maybe just MY collection:

  • VBScript Databases
  • VBScript Processes

RestorePLCCheck.vbs

AccessConnect = "Driver={Microsoft Access Driver (*.mdb)};" & _
                     "Dbq=ConfigDB.mdb"


' Try to:
' Update MechanismControllers Set Register01=-1 Where MechanismName='CTLR0001'


' Initialize Connection and RecordSet
Set Conn = CreateObject("ADODB.Connection")
Conn.Open AccessConnect
Set Rs = CreateObject("ADODB.Recordset")

' Query and display the field before we modify
Set Rs = Conn.Execute("Select * from MechanismControllers Where MechanismName='CTLR0001'")
WScript.Echo "Before:  MechanismName=" & Rs("MechanismName") & "  Register01=" & Rs("Register01")
Rs.Close

' Change the value
Conn.Execute("Update MechanismControllers Set Register01 = null Where MechanismName = 'CTLR0001'")

' Query and display the field after we modify
Set Rs = Conn.Execute("Select * from MechanismControllers Where MechanismName='CTLR0001'")
WScript.Echo "After:  MechanismName=" & Rs("MechanismName") & "  Register01=" & Rs("Register01")
Rs.Close


Conn.Close

RemovePLCCheck.vbs

AccessConnect = "Driver={Microsoft Access Driver (*.mdb)};" & _
                     "Dbq=ConfigDB.mdb"

' Try to:
' Update MechanismControllers Set Register01=-1 Where MechanismName='CTLR0001'

' Initialize Connection and RecordSet
Set Conn = CreateObject("ADODB.Connection")
Conn.Open AccessConnect
Set Rs = CreateObject("ADODB.Recordset")

' Query and display the field before we modify
Set Rs = Conn.Execute("Select * from MechanismControllers Where MechanismName='CTLR0001'")
WScript.Echo "Before:  MechanismName=" & Rs("MechanismName") & "  Register01=" & Rs("Register01")
Rs.Close

' Change the value
Conn.Execute("Update MechanismControllers Set Register01 = -1 Where MechanismName = 'CTLR0001'")

' Query and display the field after we modify
Set Rs = Conn.Execute("Select * from MechanismControllers Where MechanismName='CTLR0001'")
WScript.Echo "After:  MechanismName=" & Rs("MechanismName") & "  Register01=" & Rs("Register01")
Rs.Close


Conn.Close

CreateShortCut.vbs

Set WshShell = CreateObject("Wscript.shell")
strDesktop = WshShell.SpecialFolders("Desktop")
Set oMyShortcut = WshShell.CreateShortcut(strDesktop + "\Sample.lnk")
'oMyShortcut.WindowStyle = 3
OMyShortcut.TargetPath = "%windir%\notepad.exe"
oMyShortCut.Save

DefeatPLCCheck.vbs

AccessConnect = "Driver={Microsoft Access Driver (*.mdb)};" & _
                     "Dbq=ConfigDB.mdb"

' Try to:
' Update MechanismControllers Set Register01=-1 Where MechanismName='CTLR0001'

' Initialize Connection and RecordSet
Set Conn = CreateObject("ADODB.Connection")
Conn.Open AccessConnect
Set Rs = CreateObject("ADODB.Recordset")

' Query and display the field before we modify
Set Rs = Conn.Execute("Select * from MechanismControllers Where MechanismName='CTLR0001'")
WScript.Echo "Before:  MechanismName=" & Rs("MechanismName") & "  Register01=" & Rs("Register01")
Rs.Close

' Change the value
Conn.Execute("Update MechanismControllers Set Register01 = -1 Where MechanismName = 'CTLR0001'")

' Query and display the field after we modify
Set Rs = Conn.Execute("Select * from MechanismControllers Where MechanismName='CTLR0001'")
WScript.Echo "After:  MechanismName=" & Rs("MechanismName") & "  Register01=" & Rs("Register01")
Rs.Close

Conn.Close

rbas_old.vbs

Set WshShell = WScript.CreateObject("WScript.Shell")
Set colProcessList = GetObject("Winmgmts:").ExecQuery("Select * from Win32_Process")

For Each objProcess in colProcessList
  If objProcess.name = "rbas.exe" then
    vFound = True
  End if
Next

If vFound = True then
  MsgBox "RBAS is already running!!!",vbExclamation,"What are you doing?"
Else
  WshShell.Run("C:\Temp\rbas.exe")
End If  

sendkeys.vbs

set oShell = WScript.CreateObject("WScript.Shell")
REM oShell.Run "calc"
rem WScript.Sleep 100

oShell.AppActivate "*culator"
oShell.SendKeys "(% )R"
rem oShell.SendKeys "(% )X"

launch_scw.vbs

'
' Author: Scott Serr
' Date: 3/9/2010
'
' Purpose:
'   To not allow a second instance of a program (SCW.exe) to start if a 
'   first instance is already running.
' General Operation:
'   Instead of excuting the executable (SCW.exe) directly, execute this
'   .vbs.  This vbscript will check if the executable is running.
'   If it is already running:
'        - it will not execute a new instance of the .exe
'        - it will maximize/restore the SCW that is already running
'        - it will popup a message box explaining that RBAS is already running
'   If it is NOT running:
'        - it will execute SCW.EXE
'
' Original execution method:
'   A shortcut launches the .exe.
' New execution method:
'   A shortcut launches this .vbs which then launches the .exe.
'
'

Set oAutoIt = WScript.CreateObject("AutoItX3.Control")
oldval = oAutoIt.Opt("WinTitleMatchMode", 2)

Set WshShell = WScript.CreateObject("WScript.Shell")
Set colProcessList = GetObject("Winmgmts:").ExecQuery("Select * from Win32_Process")

For Each objProcess in colProcessList

  If UCase(objProcess.Name) = "SCW.EXE" then
    oAutoIt.WinSetState "Special Case Waste Packet Assay Monitor", "", oAutoIt.SW_SHOW
    oAutoIt.WinClose "Attention!  SCW is already running.", ""
    WScript.sleep 400
    MsgBox "Only one instance of SCW is allowed to run at one time.  SCW has been maximized for your convenience.", _
	vbExclamation, "Attention!  SCW is already running."
    WScript.Quit
  End if

Next

WshShell.Run("SCW.EXE")

SetArchiveonSequence.vbs

' Try to:
' Update CountInfo Set ArchivedFlag=-1 Where ItemId=?


' Initialize Connection and RecordSet
AccessConnect = "Driver={Microsoft Access Driver (*.mdb)};" & _
                     "Dbq=ItemInfoDB.mdb"
Set Conn = CreateObject("ADODB.Connection")
Conn.Open AccessConnect
Set Rs = CreateObject("ADODB.Recordset")


Set ArgObj = WScript.Arguments 


If (Wscript.Arguments.Count < 2) Then  
  Wscript.Echo "Required Parameter missing, entering GUI mode"
  seq = InputBox("Enter drum sequence number (8 digits)") 

  ' Query and display the field before we modify
  Set Rs = Conn.Execute("Select * from CountInfo Where MasterCountDBFile LIKE '%" & seq & "_CNTR0001.mdb'")

  result = MsgBox ("ItemId:  " & seq & "   ArchivedFlag Now:  " & Rs("ArchivedFlag") & Chr(13) & Chr(13) & _
			"Click OK to toggle/flip value" & Chr(13) & _
			"Click Cancel to abort", 1, _
			"Toggle Archive Flag on " & Rs("ItemId"))

  If result = 2 Then 
    Wscript.Quit  
  End If

  archivedflag = Rs("ArchivedFlag")
  If archivedflag = 0 Then
    archivedflag = -1
  Else
    archivedflag = 0
  End If

  Rs.Close
Else
  'First parameter
  seq = ArgObj(0) 
  'Second parameter
  archivedflag = ArgObj(1) 
End If

If Len(seq) <> 8 Then
  WScript.Echo "Drum sequence number is not 8 digits, aborting..."
End If

' Change the value
Conn.Execute("Update CountInfo Set ArchivedFlag = " & archivedflag & " Where MasterCountDBFile LIKE '%" & seq & "_CNTR0001.mdb'")

If (Wscript.Arguments.Count < 2) Then  
  ' Query and display the field after we modify
  Set Rs = Conn.Execute("Select * from CountInfo Where MasterCountDBFile LIKE '%" & seq & "_CNTR0001.mdb'")
  WScript.Echo "Sequence#: " & seq & "   ArchivedFlag After: " & Rs("ArchivedFlag")
  Rs.Close
End If

Conn.Close

dumper.vbs

Const adSchemaTables = 20
Const adSchemaColumns = 4

Set filesys = CreateObject("Scripting.FileSystemObject")
Set conn = CreateObject("ADODB.Connection")

Set thisfolder = filesys.GetFolder(".") 
Set fs = thisfolder.Files 
For Each f in fs
  If Ucase(Right(f,4)) = ".MDB" Then
    mdb = f
    txt = thisfolder & "\" & filesys.getBaseName(f) & ".txt"
    Wscript.Echo "mdb: " & mdb
    Wscript.Echo "txt: " & txt
    DumpMdbToTxt mdb, txt
  End If    
Next 

Function DumpMdbToTxt(mdb,txt)
  Set txtfile = filesys.CreateTextFile(txt, True)
  ' Initialize Connection and RecordSet
  AccessConnect = "Driver={Microsoft Access Driver (*.mdb)};" & _
                     "Dbq=" & mdb
  conn.Open AccessConnect

  Set table_rs = conn.OpenSchema(adSchemaTables)
  Do Until table_rs.EOF
    strTableName = table_rs("Table_Name")
    If Left(strTableName,4) <> "MSys" Then 
      Set column_rs = conn.OpenSchema(adSchemaColumns, _
          Array(Null, Null, strTableName))

      txtfile.Write "TABLE: " & strTableName & "    ("
      Do While Not column_rs.EOF
        txtfile.Write column_rs("Column_Name") & ","
        column_rs.MoveNext
      Loop
      txtfile.WriteLine ")"

      Set row_rs = conn.Execute("Select * from " & strTableName )
      Do While Not row_rs.eof
        txtfile.Write "  "
        column_rs.MoveFirst
        Do While Not column_rs.EOF
          str = column_rs("Column_Name")
          txtfile.Write row_rs(str) & Chr(9)
          column_rs.MoveNext
        Loop
        row_rs.MoveNext
        txtfile.WriteLine
      Loop
    End If
    table_rs.MoveNext
  Loop

  txtfile.Close
  Set txtfile = nothing
  Set table_rs = nothing
  Set row_rs = nothing
  Set column_rs = nothing
  conn.Close
End Function

SetArchivedFromList.vbs

' After review, you can pump the file that is output from this script
' into the "force archive" script
'   cscript SetArchivedFromList.vbs //B < badunarchived.log
'
' Author: Scott Serr
'

ItemInfoDB_Location="C:\Temp\Test\ItemInfoDB.mdb"


' Initialize Connection and RecordSet
AccessConnect = "Driver={Microsoft Access Driver (*.mdb)};" & _
                     "Dbq=" & ItemInfoDB_Location
Set Conn = CreateObject("ADODB.Connection")
Conn.Open AccessConnect

Set StdOut = WScript.StdOut
Set StdIn  = WScript.StdIn

Do Until StdIn.AtEndOfStream
  seq = StdIn.ReadLine
  StdOut.Write "Updating " & seq & " ..."
  Conn.Execute("Update CountInfo Set ArchivedFlag = -1 Where MasterCountDBFile LIKE '%" & seq & "_CNTR0001.mdb'")
  StdOut.WriteLine " OK"
Loop

Conn.Close

OrphanFileList.vbs

' Run this at the command line like this:
'   cscript OrphanFileList.vbs //B > orphan.log
' You may then edit the badunarchived.log file.  
'
' Note: //B above is required to suppress interpreter banner output
'
' Author: Scott Serr
'


ItemInfoDB_Location="C:\Temp\Test\ItemInfoDB.mdb"
AssayData_Directory="C:\Temp\Test\AssayData"


Dim StdOut, StdIn

Set StdOut = WScript.StdOut
Set StdIn  = WScript.StdIn



' Initialize Connection and RecordSet
AccessConnect = "Driver={Microsoft Access Driver (*.mdb)};" & _
                     "Dbq=" & ItemInfoDB_Location
Set Conn = CreateObject("ADODB.Connection")
Conn.Open AccessConnect
Set Rs = CreateObject("ADODB.Recordset")
Set filesys = CreateObject("Scripting.FileSystemObject") 


Set thisfolder = filesys.GetFolder(AssayData_Directory) 
Set fs = thisfolder.Files 
For Each f in fs
  If UCase(Right(f,3)) = "MDB" Then
    seq=Left(filesys.getBaseName(f),8)
    Set rs = Conn.Execute("Select MasterCountDBFile from CountInfo " & _
             "Where MasterCountDBFile LIKE '%\" & seq & "_%'")
    If rs.Eof Then
      StdOut.WriteLine f
    End If
    rs.Close
  End If
Next 

Conn.Close

HowMany?.vbs

ItemInfoDB_Location="C:\Temp\Test\ItemInfoDB.mdb"

Dim StdOut, StdIn

Set StdOut = WScript.StdOut
Set StdIn  = WScript.StdIn



' Initialize Connection and RecordSet
AccessConnect = "Driver={Microsoft Access Driver (*.mdb)};" & _
                     "Dbq=" & ItemInfoDB_Location
Set Conn = CreateObject("ADODB.Connection")
Conn.Open AccessConnect
Set Rs = CreateObject("ADODB.Recordset")

Set rs = Conn.Execute("Select Count(*) from CountInfo " & _
             "Where ArchivedFlag=0")

StdOut.WriteLine rs(0)

rs.Close
Conn.Close

MASandDB-properties.vbs

Const adSchemaTables = 20
Const adSchemaColumns = 4

Set StdOut = WScript.StdOut
Set StdIn  = WScript.StdIn
Set filesys = CreateObject("Scripting.FileSystemObject")
Set conn = CreateObject("ADODB.Connection")
Set objShell = WScript.CreateObject("WScript.Shell")

ItemInfoDB_Location="C:\Temp\Test\ItemInfoDB.mdb"
AssayData_Directory="C:\Temp\Test\AssayData"
table="CountInfo"
seq=WScript.Arguments(0)
parsstr="SURSTRING1,SURSTRING5,SURSTRING6,SURSTRING7,SURINT1,SURINT2," & _
     "SURINT3,SURINT4,SURINT5,SURINT6,SURINT7,SURFLAG0,SIDENT," & _
     "SDESC1,SDESC2,SLOCTN,SDESC3,SWCONTSHAPE,NSPRTITLE," & _
     "SWCONTMATRIX,SWCONTGW,SWCONTNW,SCWT,SWCONTFULL,SHZFEFRAC," & _
     "SHZPBFRAC,SSURVENT,SCTRDESC,ISOCSFILE,SGEOMTRY,WACQCOLPOS," & _
     "WACQNSEG,WACQSKIPSEG,WACQOFFSET,WACQDELTA,WACQPASSMODE,SASID," & _
     "WACTRANSRC,WACQSEGMENT,ACQOPNAME,SANALNAME,SGRPDESC"

pars = Split(parsstr, ",")

StdOut.WriteLine seq

' Initialize Connection and RecordSet
AccessConnect = "Driver={Microsoft Access Driver (*.mdb)};" & _
                     "Dbq=" & ItemInfoDB_Location
conn.Open AccessConnect

Set column_rs = conn.OpenSchema(adSchemaColumns, _
          Array(Null, Null, table))

Set row_rs = conn.Execute("Select * from " & table & " Where MasterCountlistFile LIKE '%\" & seq & "%'" )

Do While Not row_rs.Eof
  
  column_rs.MoveFirst
  Do While Not column_rs.EOF
    str = column_rs("Column_Name")
    StdOut.WriteLine "Field: " & str & "   Value: " & row_rs(str)
    column_rs.MoveNext
  Loop

  countfile = AssayData_Directory & "\" & filesys.getBaseName(row_rs("MasterCountlistFile")) & ".mas"
  StdOut.WriteLine "Handle---> " & countfile

  For i = LBound(pars) to UBound(pars)
    pname = pars(i)
    StdOut.Write pname & "   "
    Set objExecObject = objShell.Exec("cmd /c getpars.exe " & countfile & " /" & pname)
    Do While Not objExecObject.StdOut.AtEndOfStream
     strText = objExecObject.StdOut.ReadLine()
     StdOut.Write strText    
    Loop
    StdOut.WriteLine

  Next

  row_rs.MoveNext
Loop

column_rs.Close
row_rs.Close
conn.Close

ChangeLastSequenceNumber.vbs

' Initialize Connection and RecordSet
AccessConnect = "Driver={Microsoft Access Driver (*.mdb)};" & _
                     "Dbq=ConfigDB.mdb"
Set Conn = CreateObject("ADODB.Connection")
Conn.Open AccessConnect
Set Rs = CreateObject("ADODB.Recordset")

' Query and display the field before we modify
Set Rs = Conn.Execute("Select * from Counters")
If Rs.Eof Then
  WScript.Echo "Can't get db record, aborting."
  WScript.Quit
End If
ns=Rs("NextCountSequenceNumber")
Rs.Close

seq = InputBox("NextCountSequenceNumber is: " & ns & Chr(13) & _
	"Enter a new value.")

If seq <> "" Then
  Conn.Execute("Update Counters Set NextCountSequenceNumber=" & seq)

  Set Rs = Conn.Execute("Select * from Counters")
  ns=Rs("NextCountSequenceNumber")
  Rs.Close
  WScript.Echo "Your new NextCountSequenceNumber is: " & ns
End If

Conn.Close

UnarchivedList.vbs

' Run this at the command line like this:
'   cscript UnarchivedList.vbs //B > badunarchived.log
' You may then edit the badunarchived.log file.  
'
' Note: //B above is required to suppress interpreter banner output
'
' After review, you can pump the file that is output from this script
' into the "force archive" script
'   cscript SetArchivedFromList //B < badunarchived.log
'
' Author: Scott Serr
'

ItemInfoDB_Location="C:\Temp\Test\ItemInfoDB.mdb"
AssayData_Directory="C:\Temp\Test\AssayData"

Dim StdOut, StdIn

Set StdOut = WScript.StdOut
Set StdIn  = WScript.StdIn

' Initialize Connection and RecordSet
AccessConnect = "Driver={Microsoft Access Driver (*.mdb)};" & _
                     "Dbq=" & ItemInfoDB_Location
Set Conn = CreateObject("ADODB.Connection")
Conn.Open AccessConnect
Set Rs = CreateObject("ADODB.Recordset")
Set filesys = CreateObject("Scripting.FileSystemObject") 

' Query and display the field after we modify
Set rs = Conn.Execute("Select MasterCountDBFile from CountInfo Where ArchivedFlag=0")

while not rs.eof
  mc = rs("MasterCountDBFile")

  Set thisfolder = filesys.GetFolder(AssayData_Directory) 
  Set fs = thisfolder.Files 

  For Each f in fs
    If Left(filesys.getBaseName(f),8) = Left(filesys.getBaseName(mc),8) Then
      found = True
      Exit For   
    End If
    found = False
  Next 

  If Not found Then
    StdOut.WriteLine Left(filesys.getBaseName(mc),8)
  End If

  rs.movenext
wend

rs.Close
Conn.Close

Misc usage of TASKLIST

C:\Documents and Settings\serrsm>tasklist /nh /fi "IMAGENAME eq Notepad.exe"
notepad.exe                 2980 Console                 0      2,816 K

C:\Documents and Settings\serrsm>START "do something window" dir
C:\Documents and Settings\serrsm>FOR /F "tokens=2" %I in ('TASKLIST /NH /FI "WIN
DOWTITLE eq do something window"' ) DO SET PID=%I
C:\Documents and Settings\serrsm>SET PID=2460
C:\Documents and Settings\serrsm>ECHO %PID%

You drop a Genie2k .CNF file on this VBS script and it shows you info in a notepad window.

' Initialization
Const camFile=5
Const camReadWrite=512
Const outfile="C:\Temp\outfile.txt"
Set WshShell = WScript.CreateObject("WScript.Shell")
Set StdIn = WScript.StdIn
Set StdOut = WScript.StdOut


' Bailout if they didn't drop a file on this script
If Wscript.Arguments.Count = 0 Then
    WScript.Echo "Drag a CNF file on me."
    WScript.Quit
End If

filename=WScript.Arguments(0)

' Debug
'WScript.Echo filename

Dim fso, tf
Set fso = CreateObject("Scripting.FileSystemObject")
Set tf = fso.CreateTextFile(outfile, True)


Dim objDS
Set objDS = CreateObject("Canberra.CamDatasource")
objDS.Open filename,camReadWrite,camFile


tf.WriteLine("Date:    " & objDS.Parameter(CAM_X_ASTIME))
tf.WriteLine()

tf.WriteLine("Totals:    " & _
	objDS.Parameter(CAM_F_NACQMEANBCT) & "   " & objDS.Parameter(CAM_F_NACQMEANBCTE) )
tf.WriteLine("Reals:    " & _
	objDS.Parameter(CAM_F_NACQMEANBCR) & "   " & objDS.Parameter(CAM_F_NACQMEANBCRE) )
tf.WriteLine()

tf.WriteLine("Singles:    " & _
	objDS.Parameter(CAM_F_NACQAVGCSGL) & "   " & objDS.Parameter(CAM_F_NACQAVGCSER) )
tf.WriteLine("Doubles:    " & _
	objDS.Parameter(CAM_F_NACQAVGCDBL) & "   " & objDS.Parameter(CAM_F_NACQAVGCDER) )
tf.WriteLine("Triples:    " & _
	objDS.Parameter(CAM_F_NACQAVGCTPL) & "   " & objDS.Parameter(CAM_F_NACQAVGCTER) )
tf.WriteLine()

tf.WriteLine("Truncated Singles:    " & _
	objDS.Parameter(CAM_F_NACQAVGTRNS) & "   " & objDS.Parameter(CAM_F_NACQAVGTRNSE) )
tf.WriteLine("Truncated Doubles:    " & _
	objDS.Parameter(CAM_F_NACQAVGTRND) & "   " & objDS.Parameter(CAM_F_NACQAVGTRNDE) )
tf.WriteLine("Truncated Triples:    " & _
	objDS.Parameter(CAM_F_NACQAVGTRNT) & "   " & objDS.Parameter(CAM_F_NACQAVGTRNTE) )
tf.WriteLine()

tf.WriteLine("Ones:    " & _
	objDS.Parameter(CAM_F_NACQAVGCONE) & "   " & objDS.Parameter(CAM_F_NACQAVGCOER) )


tf.Close
WshShell.Run("notepad " & outfile)
WScript.Quit