Question

Do you have an idea how can one vbs file verify the correctness of another vbs file but without executing it?

By "verify correctness" I mean that this second file can be compiled without getting an error.

Was it helpful?

Solution

  1. .ReadAll() the file to check
  2. Remove "Option Explicit" if necessary, prepend "Option Explicit : WScript.Quit 0"
  3. On Error Resume Next : Execute[Global] (modified) source : Handle Error

Update:

As intersum pointed out, I did not realize that the WScript.Quit will terminate the script that execute(global)s it. So using a shell can't be avoided.

Proof of concept script:

Option Explicit

Dim goFS   : Set goFS = CreateObject("Scripting.FileSystemObject")
Dim goWS   : Set goWS = CreateObject("WScript.Shell")
Dim aFiles : aFiles   = Array("good.vbs", "bad.vbs")
Dim sFile
For Each sFile In aFiles
    WScript.Echo sFile, "==>", checkSyntax(sFile)
Next

Function checkSyntax(sFile)
  Dim sCode : sCode = goFS.OpenTextFile(sFile).ReadAll()
  WScript.StdOut.Write "  A " & sCode
  sCode = "Option Explicit : WScript.Quit 0 : " & sCode
  goFS.CreateTextFile("sctmp.vbs", True).WriteLine sCode
  WScript.StdOut.Write "  B " & goFS.OpenTextFile("sctmp.vbs").ReadAll()
  Dim oExec : Set oExec = goWS.Exec("cscript sctmp.vbs")
  Dim sOtp  : sOtp      = oExec.Stderr.ReadAll()
  If "" = sOtp Then
     checkSyntax = "ok"
  Else
     checkSyntax = sOtp
  End If
End Function

output:

cscript sc.vbs
  A WScript.Echo "good"
  B Option Explicit : WScript.Quit 0 : WScript.Echo "good"

good.vbs ==> ok
  A WScript.Echo "bad" : SomeSub(1, 2, 3)
  B Option Explicit : WScript.Quit 0 : WScript.Echo "bad" : SomeSub(1, 2, 3)

bad.vbs ==> M:\lib\kurs0705\xpl\sctmp.vbs(1, 73) Microsoft VBScript compilation error: Cannot use parentheses
when calling a Sub

Update II:

As can be seen from:

type bad.vbs
WScript.Echo "bad" : SomeSub 1, 2, 3

cscript bad.vbs
bad
M:\lib\kurs0705\xpl\bad.vbs(1, 22) Microsoft VBScript runtime error: Type mismatch: 'SomeSub'

a runtime error may occur after most of the script has executed (output of "bad"). To deal with such errors, you must

  1. design and implement robust programs
  2. do intensive tests
  3. implement rutime error handling

None of these requirements are 'easy' in VBScript.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top