1

Тема: VBS: Как определить порядковый номер строки запущенного скрипта

Возможно ли вывести порядковый номер строки, исполняемого скрипта определенной метки:

MsgBox "Команда MsgBox расположена в скрипте 1.vbs строке № =" &NumberStroki


Более подробно описал для чего:

+ открыть спойлер

Есть какой-то скрипт у которого возможны ошибки в его работе которые иногда невозможно воспроизвести во время полноценной отладки. Поэтому хочу создать журнал в котором будет кратко описан все этапы работы.
В коде будут описаны какие-то метки благодаря которым можно будет определить на какой метке "зарубился" скрипт и выполняя какую операцию и с какими данными, но что б не проставлять каждую метку вручную подумал можно использовать номер строки и тогда б это выглядело так (может структура будет другой):

Например стандартная работа:
Сработала строка в коде №1 Начало работы скрипта.
Сработала строка в коде №2 Блок обработки массива такого-то.
Сработала строка в коде №3 Блок обработки массива такого-то закончен.
Сработала строка в коде №4 Завершение работы скрипта.


Работа при которой произошла ошибка:
Сработала строка в коде №1 Начало работы скрипта.
Сработала строка в коде №2 Блок обработки массива такого-то.
Сработала строка в коде №3 Блок обработки массива такого-то закончен.
Сработала строка в коде №1 Начало работы скрипта.
Сработала строка в коде №2 Блок обработки массива такого-то.
Сработала строка в коде №3 Блок обработки массива такого-то закончен.
Сработала строка в коде №4 Завершение работы скрипта.

Получается одна строка в коде была пропущена означает что там была ошибка параметры были такие-то такие-то было тото-тото. Произошло из-за того-то того-то.

И уже потом можно будет разобраться из-за чего это произошло.

2 (изменено: omegastripes, 2014-04-14 02:10:53)

Re: VBS: Как определить порядковый номер строки запущенного скрипта

Вот, пожалуйста, очень весёлый костыльчик Прошу отнестись с чувством юмора

Option Explicit
NumberStrokiInit() ' всегда в самом начале скрипта

MsgBox NumberStroki(anyValue)
If NumberStroki("##") = 5 Then MsgBox "Line = " & NumberStroki
MsgBox NumberStroki()

Sub NumberStrokiInit()
    Dim strCode, objReplace, lngLine, arrCode, strCmdLn, strArg
    With CreateObject("Scripting.FileSystemObject").OpenTextFile(WScript.ScriptFullName, 1)
        strCode = .ReadAll
        .Close
    End With
    ExecuteGlobal "Function Number" & "Stroki(n): Number" & "Stroki = n: End Function"
    Execute "Class clsReplace: Public lngLine, bMod: Public Default Function fReplace(strMatch, strSubMatch, lngPos, strSource): On Error Resume Next: If Eval(strSubMatch) <> lngLine Then fReplace = Replace(strMatch, strSubMatch, ""Number" & "Stroki("" & lngLine & "")""): bMod = True Else fReplace = strMatch End If: End Function: End Class"
    Set objReplace = New clsReplace
    objReplace.bMod = False
    arrCode = Split(strCode, vbCrLf)
    With New RegExp
        .Pattern = "\b(Number" & "Stroki\ {0,}(?:|\( {0,}(?:|""[^""]*""|[A-Za-z_]{1,}\w{0,}|\d{1,}) {0,}\)))\ {0,}(?:[><+*\\/\-\^':=&\r\n]|$)"
        .Global = True
        .IgnoreCase = True
        For lngLine = 0 To Ubound(arrCode)
            objReplace.lngLine = lngLine + 1
            arrCode(lngLine) = .Replace(arrCode(lngLine), objReplace)
        Next
    End With
    strCode = Join(arrCode, vbCrLf)
    If objReplace.bMod Then
        With CreateObject("Scripting.FileSystemObject").OpenTextFile(WScript.ScriptFullName, 2, True)
            .Write strCode
            .Close
        End With
        strCmdLn = WScript.FullName & " """ & WScript.ScriptFullName & """"
        For Each strArg In WScript.Arguments
            strCmdLn = strCmdLn & " """ & strArg & """"
        Next
        CreateObject("WScript.Shell").Run strCmdLn
        WScript.Quit
    End If
End Sub
Щт Уккщк Куыгьу Туче
’ҐЄгй п Є®¤®ў п бва Ёж : 1251