VBScript 执行和评估命令

Posted

技术标签:

【中文标题】VBScript 执行和评估命令【英文标题】:VBScript Execute and Eval Commands 【发布时间】:2015-04-23 19:02:10 【问题描述】:

我有一个 vbscript,它将从文本文件中读取命令。我正在考虑使用 Execute 和 Eval 命令来执行文件中的命令。显然,我会将文件作为字符串读入,并将字符串解析为 Eval 和 Execute 命令。但是,我不确定这是否可能,以及如何去做?

例如,假设我有以下文件:

x = 3
y = 4
z = x + y

Print z

在我的 vbscript 中,我想要如下内容:

' Read in file to string
' Split the string at the newline (commandList)
For Each str in commandList:
    Execute(str)
Next str

输出将是:

7

我尝试了以下方法来获得概念证明:

执行("x = 1")

但是,我不断收到“函数在评估期间终止”错误。不知道我做错了什么。我对vbscript不太熟悉。

【问题讨论】:

确定您的问题是在vbscript 上吗?请edit您的问题并显示您的文本文件,其中包含要执行的命令和足够的代码sn-p(请参阅How to Ask)。 无法重现“函数在评估期间终止”错误(使用 cscript.exe)所以可能不是 Execute("x = 1") 中的错误。尝试将其中一个空格更改为不间断空格 (U+00A0),得到“语法错误”。尝试定义函数/子 x(),得到“非法分配”。尝试将 x 预设为一个对象,只是用该值覆盖它。我怀疑样本输入中可能有线索。哪个主机环境提供“打印”语句?可能是环境不喜欢Execute语句吧。 【参考方案1】:

我认为最好的解释在这里:Link-1 简而言之,Eval() 命令接受一个表达式并返回它的值,而 Execute() 命令接受一组语句并执行它们(我认为在全局范围内)。 一般来说,Eval() 需要一些表达式的结果,而Execute() 不需要。 有关详细说明,请参见上面的链接。 保罗

【讨论】:

1) Eval 不期望表达式的 result。它需要一个字符串表示 of 一个 expression 并返回对该表达式求值的结果。同样,Execute[Global] 需要一个语句列表的字符串表示形式并执行它(它们)。请注意,在 VBScript 中,表达式本身是 NOT 语句,不能由 Execute[Global] 计算。详细解释见this答案。 2) Execute 在本地范围内运行,ExecuteGlobal 在全局范围内运行。【参考方案2】:

您的概念似乎是正确的。

==>type D:\VB_scripts\SO\29832173.vbs
option explicit
Dim commandList(2), str
commandList(0)= "x = 3"
commandList(1)= "y = 4"
commandList(2)= "z = x + y"
For Each str in commandList
  Execute str
Next
Wscript.echo x, y, z

==>cscript D:\VB_scripts\SO\29832173.vbs
3 4 7

==>

Explanation (Execute vs. Eval):

在 VBScript 中,x = y 可以用两种方式解释。第一个是作为赋值语句,其中y 的值被赋值给x。第二种解释是测试xy 是否具有相同值的表达式。如果他们这样做,结果是True;如果不是,则结果为FalseEval 方法总是使用第二种解释,而Execute 语句总是使用第一种。

编辑关于OP's comment:当我进入 For 循环时,这给了我一个类型不匹配的错误。加上一些额外的调试 echo 和 @ 987654334@循环改成For...Next迭代:

==>type D:\VB_scripts\SO\29832173.vbs
option explicit
Dim commandList(2), str, ii
commandList(0)= "x = 3"
commandList(1)= "y = 4"
commandList(2)= "z = x + y"
For ii = 0 To UBound( commandList)
  Wscript.Echo "To execute: " & commandList( ii), CStr( Eval( commandList( ii)))
  Execute commandList( ii)
  Wscript.Echo "  Executed: " & commandList( ii), CStr( Eval( commandList( ii)))
Next
Wscript.Echo x, y, z

==>cscript D:\VB_scripts\SO\29832173.vbs
To execute: x = 3 False
  Executed: x = 3 True
To execute: y = 4 False
  Executed: y = 4 True
To execute: z = x + y False
  Executed: z = x + y True
3 4 7

==>

【讨论】:

进入 For 循环时,这给了我一个类型不匹配的错误。 它仍然告诉我执行行上的“函数在评估期间终止”。如果我在命令 ("""COMMAND""") 周围添加三引号,我不会收到错误消息,但不会打印任何内容。

以上是关于VBScript 执行和评估命令的主要内容,如果未能解决你的问题,请参考以下文章

vbscript 损失评估线计算(获取动态数据并计算它们)

如何在执行期间保持 VBScript 命令窗口打开

如何在vbscript中以变量为路径执行命令

来自 VBscript 的带有空格的 Cmd 命令

vbscript 提供基于损失评估线的动态数据值的覆盖选择规则

评估COM接口返回的非变量数组引起的VBScript类型不匹配错误可以通过更改语言来解决吗?