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
。第二种解释是测试x
和y
是否具有相同值的表达式。如果他们这样做,结果是True
;如果不是,则结果为False
。 Eval
方法总是使用第二种解释,而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 执行和评估命令的主要内容,如果未能解决你的问题,请参考以下文章