我们如何使用msscript.ocx以编程方式知道语法错误



我已经使用c#实现了msscript.ocx,它适用于VBScript。

考虑以下VBScript代码:

For i = 0 To 5
  'The following line has missing 'Then'. It should show an error.
  If i = 2
    Exit For
  End If
Next

在不运行脚本的情况下,我们如何判断包含If(缺少Then)的行中是否存在错误?

加载时会出现错误。

Set Arg = WScript.Arguments
set WshShell = createObject("Wscript.Shell")
Set Inp = WScript.Stdin
Set Outp = Wscript.Stdout
Sub VBSCmd
    RawScript = Arg(1)
    'Remove ^ from quoting command line and replace : with vbcrlf so get line number if error
    Script = Replace(RawScript, "^", "")
    Script = Replace(Script, "'", chr(34))
    Script = Replace(Script, ":", vbcrlf)
    'Building the script with predefined statements and the user's code
    Script = "Dim gU" & vbcrlf & "Dim gdU" & vbcrlf & "Set gdU = CreateObject(" & chr(34) & "Scripting.Dictionary" & chr(34) & ")" & vbcrlf & "Function UF(L, LC)" & vbcrlf & "Set greU = New RegExp" & vbcrlf & "On Error Resume Next" & vbcrlf & Script & vbcrlf & "End Function" & vbcrlf
    'Testing the script for syntax errors
    On Error Resume Next
    set ScriptControl1 = wscript.createObject("MSScriptControl.ScriptControl",SC)
        With ScriptControl1
            .Language = "VBScript"
            .UseSafeSubset = False
            .AllowUI = True
        .AddCode Script
    End With
    With ScriptControl1.Error
        If .number <> 0 then
            Outp.WriteBlankLines(1)
            Outp.WriteLine "User function syntax error"
            Outp.WriteLine "=========================="
            Outp.WriteBlankLines(1)
            Outp.Write NumberScript(Script)
            Outp.WriteBlankLines(2)
            Outp.WriteLine "Error " & .number & " " & .description
            Outp.WriteLine "Line " & .line & " " & "Col " & .column
            Exit Sub
        End If
    End With
    ExecuteGlobal(Script)
    'Remove the first line as the parameters are the first line
    'Line=Inp.readline  
    Do Until Inp.AtEndOfStream
        Line=Inp.readline
        LineCount = Inp.Line 
        temp = UF(Line, LineCount)
        If err.number <> 0 then 
            outp.writeline ""
            outp.writeline ""
            outp.writeline "User function runtime error"
            outp.writeline "==========================="
            Outp.WriteBlankLines(1)
            Outp.Write NumberScript(Script)
            Outp.WriteBlankLines(2)
            Outp.WriteLine "Error " & err.number & " " & err.description
            Outp.WriteLine "Source " & err.source
            Outp.WriteLine "Line number and column not available for runtime errors"
            wscript.quit
        End If
        outp.writeline temp
    Loop
End Sub

Vbs

filter vbs "text of a vbs script"

使用冒号分隔语句和行。使用单引号代替双引号,如果需要单引号,请使用chr(39)。用^字符转义方括号和"与"。如果需要插入符号,请使用chr(136)。

该函数称为UF(用于UserFunction)。它有两个参数,L包含当前行,LC包含行数。将脚本的结果设置为UF。请参见示例。

有三个全局对象可用。用于维护状态的未声明全局变量gU。如果需要多个变量,请将其用作数组。Dictionary对象gdU,用于保存和访问前面的行。和一个RegExp对象greU,准备使用。

示例这个vbs脚本插入行号并将行设置为Filter打印的函数UF。

filter vbs "uf=LC ^& ' ' ^& L"<"%systemroot%win.ini"

这就是它在内存中的样子

Dim gU
Set gdU = CreateObject("Scripting.Dictionary")
Set greU = New RegExp
Function UF(L, LC)
---from command line---
uf=LC & " " & L
---end from command line---
End Function

如果出现语法错误,Filter将显示调试详细信息。

相关内容

  • 没有找到相关文章

最新更新