2014-12-11 6 views
2

모든 스크립트에서 동일한 작업을 수행하지만 실패 - 실패 값이 저장된 변수 만 변경하는 함수가 있습니다. 예를 들어 한 스크립트에서 상태가 Envrionment.Value ("Current_Status")에 저장됩니다. 다른 스크립트에서 - 상태가 DataTable.Value ("Status", 1)에 저장됩니다. 다른 스크립트에서 -> 상태는 objRS ("AddCriteria_Status")에 저장됩니다. 값문자열을 변수 이름으로 전달 QTP

그래서이 매개 변수를 문자열로 전달한 다음 나중에 변수 이름으로 사용하는 기능을 만들려고합니다. 다음은 샘플 코드입니다 :

Envrionment.Value("Current_Status") = "none" 
Environment.Value("Fail_text") = "none" 
Call AddCriteria("Environment.Value(""Current_Status"")","Environment.Value(""Fail_text"")") 

Pubic Function AddCriteria(varStatus,varActual) 

varTemp = "" 

Execute(varStatus+ "=InProgress") 'change status to InProgress by the time execution is done 
Execute(varActual + "=not_defined") 'this will have the reason the case failed 

....code 

If varTemp = "FAIL" Then 
Execute(varStatus+ "=PASS") 
Execute(varActual + "=PASS") 
Else 
Execute(varStatus+ "=FAIL") 
Execute(varActual + "=Criteria did not get added") 
End If 

End Function 

내가 Environment.Value의 값을 원하는 서브 루틴을 호출에 ("CURRENT_STATUS은")를 "없음"에서 "진행중"과에 "PASS" 에서 변경하려면하지만 "Execute"명령이 실행 된 후 환경 변수가 비게됩니다.

VBScript에서 CVar가 지원되지 않으므로 사용할 수 없습니다.

Eval을 시도했지만 다른 방향으로 작동하지 않습니다. 즉, Environment.Value ("Current_Status") 값을 변경하면 Eval (varStatus) 값이 변경되지만 찾을 수 없습니다. Environment.Value ("Current_Status") 값이 변경되도록 Eval (varStatus)의 값을 변경하는 방법.

도와주세요. 나는 일주일 동안 붙어있다.

!!! 내가 성취하려고하는 것은 무엇입니까 !!!

.vbs 파일에서 함수에 문자열을 매개 변수로 전달하십시오. 그 함수의 변수 이름으로 변환하십시오. 간단한 예 : "abc"문자열을 함수에 매개 변수로 전달하고 해당 함수 내에서 문자열을 변수 이름으로 변환하여 [[abc = "PASS"] [0126 그것을 시도! 나는 그것이 내가 "CVar"를 사용하여 이전 게시물 [vbscript Eval a string to a Variable in a loop?

에서 가져온 솔루션이 같은 명령을 실행하여 시도

방법입니다하지만 VBScript를 지원하지 않습니다. 그래서 아이디어가 없어졌습니다.

!!! 내가 직면 한 문제 !!!

솔직히 "Execute"를 사용하는 논리를 이해하지 못했지만 그럼에도 불구하고 시도했습니다. 슬프게도, 그것은 잘 풀리지 않았다. 코드에서 언급 한 것처럼 실행 명령을 사용하면 환경 변수가 비어있게됩니다.

답변

3

아이디어 :

  • 사용 ExecuteGlobal 당신이 실행하려는 할당을 실행 - 당신이 원하는 그거 ... 경우 . Eval 특히 Execute들이.

  • 대상 변수 (즉 ExecuteGlobal 의해 평가되는 과제 값을 수신하는 변수)이어야 글로벌 변수 살고 범위 관한 미묘한 한계가있다.

  • ExecuteGlobal 호출이 작업의 전역 범위에서 발생하면 대상 변수도 거기에 선언되어야합니다. (나는 생각 .)를 ExecuteGlobal 호출이 함수 라이브러리의 일상에서 일어나는

  • 경우 대상 변수도이 선언해야합니다. (나는 확인합니다.뿐만 읽어 것을 알고있다.)

더 당신을 돕기 위해

, 내가 어떤 문제를 당신이 달성하고 싶은 취소되지 않기 때문에 귀하의 질문에 업데이 트를해야 할 것을 만나다. - Eval은 값을 변경하지 않으므로 문자열로 제공된 표현식을 평가하고 값을 반환합니다. 식에 전역 변수를 설정하는 것과 같은 부작용이있는 경우 운이 좋지 않을 수 있습니다. 왜냐하면 ... 전역 변수가 선언 된 위치와 초기화 된 위치에 따라 다릅니다. ExecuteGlobal 호출이 발생합니다. 작업 및 라이브러리는 마치 보이더라도 하나의 전역 범위를 공유하지 않으며 이로 인해 많은 이상한 동작이 발생할 수 있습니다.

내가 말했듯이, 당신이 달성하려고 시도하고있는 것 (그 중 90 %를 얻었습니다), 어떻게하려고 시도 하느냐 (그 중 40 %를 얻음), 그리고 당신이 직면 한 문제는 10 % 그것의 해결책을 접근한다 그래서 나는이 대답을 새롭게 할 수있다.

' Interpret (execute) a piece of VSH source code consisting of statements -- success? 
' Code: String containing VBS source code. Passed by reference for performance reasons only 
Public Function ExecCode (ByRef Code) 
    Dim ErrNumber 
    Dim ErrDescription 

    On error resume next ' Avoid getting kicked out by errors in the code contained in Code 
    ExecuteGlobal Code 
    ErrNumber=Err.Number 
    ErrDescription=Err.Description 
    On error goto 0 ' Re-enable RTE handling 

    If ErrNumber <> 0 Then 
     ExecCode=false 

     Print "Code execution failed ('" & ErrDescription & "'), code:" & vbNewline & Code & "<eof>" 
    else 
     ExecCode=true 
    End If 
End Function 

Dim GlobalVar 

' Interpret (execute) a piece of VSH source code consisting of a single expression -- success? 
' Expr; String containing a VBS expression. Passed by reference for performance reasons only. 
' Target: Variable receiving the value to which the expression evaluates 
Public Function EvalCodeAndAssign (ByRef Expr, ByRef Target) 

    ' In order to force "Option explicit", we don´t use Eval, but ExecCode (and thus ExecuteGlobal): 
    Dim Code: Code="Option Explicit: GlobalVar=(" & Expr & ")" 
    Dim Result: Result=ExecCode (Code) 
    If Result Then 
     Target=GlobalVar 
    End If 
    EvalCodeAndAssign=Result 

End Function 

업데이트 2 :

** 업데이트 **

나는 모든 런타임 식 평가를 위해이 라이브러리 코드를 사용

, 도서관이나 액션 내에서 그것을 할 당신이 전달하는 if 문 ExecuteGlobal은 따옴표를 포함하고 있습니다 (코드에서 누락 된 것 같습니다). 인용 부호로 묶어야합니다. 즉 문자열을 가지고 VBScript 코드로 해석 : ExecuteGlobal는 /입니다 않습니다/평가를 실행 무엇 때문에 당신은

ExecuteGlobal "x=""This is a string""" 

에서와 같이 큰 따옴표를 사용해야합니다. 인용 부호가 없어서 사용하려는 코드가 유효하지 않습니다.