2014-09-28 4 views
0

Как мы можем программно узнать ошибку synatx, используя msscript.ocx?Как мы можем программно узнать ошибку synatx, используя msscript.ocx?

Я реализовал msscript.ocx, используя C#, и он работает для 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» без запуска сценария?

+0

С помощью [следующей ссылки] (http://stackoverflow.com/a/25983099/2165759) вы можете найти код C#, который проверяет наличие синтаксических ошибок кода VBScript, использует Microsoft Script Control. – omegastripes

ответ

1

Вы получаете ошибку при загрузке.

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 (для пользовательской функции). Он имеет два параметра: L, который содержит текущую строку и LC, который содержит linecount. Задайте результаты сценария UF. См. Пример.

Доступны три глобальных объекта. Необъявленная глобальная переменная gU для поддержания состояния. Используйте его как массив, если вам нужно больше одной переменной. Объект словаря gdU для сохранения и доступа к предыдущим строкам. И объект RegExp greU готов к использованию.

Пример Этот сценарий vbs вставляет номер строки и устанавливает линию на функцию 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 

Если будет отображать отладочные детали ошибки фильтра синтаксиса.