Search code examples
vbscriptexecutecorrectness

VBScript verifying code correctness without executing it


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.


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.