2014-12-11 4 views
2

У меня есть функция, выполняющая ту же операцию для всех моих скриптов, но только переменная, в которой сохраняется значение Pass-Fail, изменится. Например, в одном скрипте -> статус хранится в Envrionment.Value («Current_Status») в другом скрипте -> статус хранится в DataTable.Value («Status», 1) в другом скрипте -> status сохраняется в 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» Но после выполнения команды «Выполнение» переменная среды становится пустой.

Поскольку CVar не поддерживается в VBScript, я не могу его использовать.

Я пробовал Eval, но он не работает в другом направлении, то есть: Если вы измените значение Environment.Value («Current_Status»), то значение Eval (varStatus) изменится, но я не смог найти способ изменить значение Eval (varStatus), чтобы изменилось значение Environment.Value («Current_Status»).

Пожалуйста, помогите. Я застрял в этом неделю.

!!! Что я пытаюсь выполнить !!!

В файле .vbs передать любую строку функции в качестве параметра; и преобразовать его в имя переменной в этой функции. Простой пример: передать строку «abc» в качестве параметра функции -> и внутри этой функции преобразовать строку в имя переменной для сохранения значения [скажем, abc = «PASS»]

!!! Как я попытайтесь это сделать !!!

Я попытался с помощью команды Execute, как это решение, которое я получил от предыдущего поста [vbscript Eval a string to a Variable in a loop?

Использование «квар» является способом, но это не поддерживается в VBScript. Поэтому у меня кончились идеи

!!! Проблемы, с которыми я столкнулся !!!

Честно говоря, я не понял логики использования «Выполнить», но я все же пробовал. К сожалению, это не сработало. При использовании команды execute (как указано в коде) переменные среды становятся пустыми.

ответ

3

Идея:

  • Использование ExecuteGlobal для выполнения задания вы хотите выполнить - если that's то, что вы хотите. 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 

Update 2: если заявление, что вы передаете ExecuteGlobal содержит кавычки (которые, как мне кажется, отсутствуют в вашем коде), необходимо указать, т. Е. вы должны использовать двойные кавычки, как в

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

Потому, что ExecuteGlobal/Выполнить/Eval сделать это: взять строку и интерпретировать его как VBScript код. Код, который вы пытаетесь использовать, недействителен из-за отсутствия котировок.

Смежные вопросы