1

vbscript에서 행 번호를 프로그래밍 방식으로 얻는 방법을 알고 싶습니다. 예를 들어 __LINE__ 또는 이상적으로 파이썬의 스택 모듈처럼 현재 함수가 호출 된 곳의 라인 번호를 얻는 방법으로 재사용 가능한 디버깅 함수 (그리고 코드가있는 파일)를 작성할 수 있고, 라인을 켜는 방법을 알고 싶지도 않다. 내 편집장의 번호. 당신이 그것을 액세스 할 수 있도록VBSCRIPT에서 __LINE__, __FILE __ 등의 컨텍스트 정보를 추출하는 방법

또한 나는 지금 등의 기능을 문자열로 변수 유형을 호출 등을 추출 할 수있는 유사한 유용한 정보가

+0

이 MSDN에서 설명한대로 스크립트 디버거를 만드는 것이 포함됩니다. http://msdn.microsoft.com/en-us/library/z537xb90(v=vs.94).aspx – Jay

+0

아마 디버깅을 사용하여 제목 오해의 소지가있다, 나는 더 많은 사람이 오류가 발생한 세부 정보를 신속하게 찾을 수있게 해주는 printf 디버깅/로깅 기능에 대해 이야기하고있다. –

답변

1

불행히도 루비와 파이썬에서와 같은 방식으로 작동하지 않습니다. 내가 해결 한 차선책은 일이 잘못 될 수있는 오류 처리 함수를 호출하는 것입니다. 이 함수의 매개 변수에있는 숫자는 내 편집기에서 매크로를 실행할 때마다 적용됩니다 (텍스트 패드를 사용하면 \ i는 정규식에서 자동 번호 매기기입니다). 에디터가 이것을 지원하지 않으면 이것을하는 스크립트를 작성할 수 있습니다. 따라서 오류가 발생하면 오류 처리 함수가 호출 된 번호와 함께 기록되며 # number #을 (를) 찾아 소스에서 쉽게 찾을 수 있습니다.

이것은 ASP와 VB에서 모두 사용할 수 있지만 VB에서는 더 쉬운 방법이 있습니다. 텍스트 패드 나 승화 텍스트와 같은 일부 편집자는 vbs 스크립트를 실행하고 탭에 출력을 표시하며 오류가 발생하면 errormessage와 함께 해당 행에서 스크립트를 여는 행을 두 번 누르십시오. 이것은 또한 정규식에 의해 수행됩니다. 텍스트 패드 용 코드가 필요한지 알려주세요.

on error resume next 
'initialize constants DEBUGLEVEL and LOGFILE 
'initialize strHostName 

'some code 
oConn.execute(sql) 

if not LogError("#1#") then 
    'do the things if successfull, otherwise log error with number 
end if 

'again some code 
if not LogError("#2#") then 
    'do the things if successfull, otherwise log error with number 
end if 

'the debug and log functions 
function LogError(errornumber) 
    'LogError\(\"#[0-9]+#\"\) replace by LogError("#\i#") 
    if err.number <> 0 then 
    call debug("<name of script>/Logerror","","","Errornumber:" _ 
     & errornumber & " " & err.number & " " & err.description & " " _ 
     & err.source) 
    LogError = True 
    err.clear 
    errors = errors+1 
    else 
    LogError = False 
    end if 
end function 

function Debug (pagina, lijn, varnaam, varinhoud) 
    if DEBUGLEVEL > 0 then 
    const forReading = 1, forWriting = 2, forAppending = 8, CreateFile = True 
    dim fs,f, var, strHostName 
    set fs=CreateObject("Scripting.FileSystemObject") 
    strHostName = fs.GetFileName(WScript.FullName) 
    if fs.FileExists(LOGFILE) then 
     set f=fs.OpenTextFile(LOGFILE, forAppending) 
    else 
     set f=fs.OpenTextFile(LOGFILE, forWriting,true) 
    end if 
    var = now & " " & pagina & ":" & lijn & ":" & varnaam & ":" & varinhoud 
    f.WriteLine var 
    if LCase(strHostName) = "cscript.exe" then 'debugging 
     if DEBUGLEVEL > 1 then 
     wscript.echo var 
     end if 
    end if 
    f.Close 
    set f=Nothing 
    set fs=Nothing 
    end if 
    debug = true 
end function 
1

VBScript를 해당 정보를 노출하지 않습니다 싶습니다 스크립트 내에서 프로그래밍 방식으로 (edge cases notwithstanding). 이런 종류의 정보를 추출하려면 debugger이 필요합니다. 또는 다른 스크립트가 첫 번째 스크립트를 해석하고 줄 번호 (like this)를 추적 할 수 있습니다. 그래도 어떤 종류의 프로덕션 환경에도 권장하지 않습니다.

0

함수 밖에서 발생하는 한 다음 작업이 가능합니다.

자동 오류 처리는 스크립트 시작시 On Error Resume Next까지 해제되어 있으므로 스크립트는 사용자가 아무것도 수행하기 전에 종료하지 않습니다. 하지만 On Error GoTo 0을 사용하여 오류 처리를 다시 사용하도록 설정하고 직접 예외를 발생시킬 수 있습니다. 그러면 디버깅 메시지와 함께 줄 번호가 출력됩니다. 예를 들어

: 당신이 인수없이 실행하면

On Error Resume Next 
server = WScript.Arguments(0) 
If Err.Number <> 0 Then 
    WScript.Echo("Need to pass in an argument!") 
    On Error GoTo 0 
    Err.Raise(1) 
End if 

, 당신은 다음과 같은 출력을 얻을 :

Need to pass in an argument! 
C:\script.vbs(6, 5) Microsoft VBScript runtime error: Unknown runtime error 

은 "6"은 예외가 발생한 행 번호를 의미합니다.

이렇게하면 사용자 정의 출력을 인쇄 할 수 있으며 오류가 발생한 행을 알 수 있습니다.