我有一个函数对我的所有脚本执行相同的操作,但只有存储Pass-Fail值的变量才会改变。 例如,在一个脚本中 - >状态存储在Envrionment.Value(“Current_Status”)中 在另一个脚本中 - >状态存储在DataTable.Value(“Status”,1)中 在另一个脚本中 - >状态存储在objRS(“AddCriteria_Status”)中。值
所以我试图创建一个函数,我将这些参数作为字符串传递,然后将它们用作变量名。以下是示例代码:
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”)的值从“none”变为“InProgress”,然后变为“PASS” 但是在执行“Execute”命令后,Environment变量变为空。
由于VBScript不支持CVar,我无法使用它。
我试过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?
使用“CVar”是一种方法,但VBScript不支持。所以我用完了想法
!!!我遇到的问题!!!
老实说,我不明白使用“执行”的逻辑,但我还是试过了。可悲的是,它没有成功。使用execute命令时(如代码中所述),环境变量变为空。
答案 0 :(得分:3)
思路:
使用ExecuteGlobal
执行您要执行的作业 -
如果那是你想要的。 Eval
,特别是Execute
对他们所居住的范围有微妙的限制。
目标变量(即接收值中的值的变量)
由ExecuteGlobal
评估的分配必须是全局
变量
如果ExecuteGlobal
调用发生在Action的全局范围内,则为
目标变量也必须在那里声明。 (我想。)
如果ExecuteGlobal
调用在函数的例程中发生
库,目标变量也必须在那里声明。 (我肯定知道。但请继续阅读。)
为了进一步帮助您,我需要更新您的问题,因为您不清楚您想要完成什么,以及您看到了什么问题。因为 - Eval
不会更改值,所以它只是计算作为字符串提供的表达式,并返回其值。如果表达式有副作用,比如设置一个全局变量,那么你可能会运气不好因为......好吧......它取决于声明全局变量的位置,并初始化(如果有的话),以及执行全局调用。 动作和库不共享一个全局范围,即使它们看起来像这样,也会产生很多奇怪的行为。
但正如我所说,如果你澄清你想要完成的事情(获得90%),你如何尝试(获得40%),以及你面临的问题(得到10%) ),我确定我可以更新这个答案,以便它接近解决方案。
**更新**
我将这个库代码用于所有运行时表达式评估,无论是来自库中还是Action:
' 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:如果传递给ExecuteGlobal的语句包含引号(我认为代码中缺少引号),则必须引用,即I.e。你必须使用双引号,比如
ExecuteGlobal "x=""This is a string"""
因为ExecuteGlobal / Execute / Eval的作用是:取一个字符串并将其解释为VBScript代码。 由于缺少引号,您尝试使用的代码无效。