提问人:steveOw 提问时间:10/24/2023 最后编辑:steveOw 更新时间:11/3/2023 访问量:181
VB6 中的“Eval”功能:用 Powershell 或其他方式替换 VBScript
"Eval" functionality in VB6: replace VBScript by Powershell or some other means
问:
在 VB6 程序中,我一直在使用 VBScript 来计算字符串中包含的数值数学表达式。
(字符串由编程的、基于字符串的代数操作算法生成,该算法用数值替换数学表达式中的代数变量以检查结果)。
以下代码说明了数值数学表达式字符串的计算:-
vb6
mathEx$="(1+2)*(5^2)"
Set ob = CreateObject("MSScriptControl.ScriptControl")
ob.Language = "VBScript"
result = ob.eval(mathEx$) '---> 75
现在(2023 年 10 月)VBScript 正式从未来的 Windows 版本中排除, 我想知道是否可以以及如何使用 Powershell(或其他一些方式)来提供此功能(从 VB6 程序中)?
编辑 1这个问题没有回答这个问题,这个问题根本没有谈论从 VB6 访问 Powershell。
编辑 2我已经将问题从Powerscript重新聚焦到其他工具/方法。
答:
3赞
wqw
10/28/2023
#1
这是一个使用 JET 引擎 (MS Access) 表达式计算器来完成这项工作的简单函数Eval
Option Explicit
Private Function Eval(sExpression As String) As Variant
Static oConn As Object
Dim sConnStr As String
If oConn Is Nothing Then
sConnStr = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Environ$("TEMP") & "\~eval.tmp"
On Error Resume Next
CreateObject("ADOX.Catalog").Create sConnStr
On Error GoTo 0
Set oConn = CreateObject("ADODB.Connection")
oConn.Open sConnStr
End If
Eval = oConn.Execute("SELECT " & sExpression).Fields(0).Value
End Function
Private Sub Form_Load()
Debug.Print Eval("sin(1+2)*(5^2)")
End Sub
评论
0赞
steveOw
10/28/2023
这似乎在大多数情况下工作正常,但我的 VB6 程序/IDE 崩溃了一次。我明天会进一步测试它。
0赞
steveOw
10/28/2023
做了更多的测试,它对我的计划很有效。大多数情况下,它提供的结果与使用 VBScript 相同,但有时它返回十进制格式,而 VBS 返回科学格式。VBS 始终返回单精度,但有时 Jet 返回双精度,例如“(40/995.791142760368)”。总的来说,它似乎可以满足我的需求,无需链接任何其他库。非常感谢!
评论
Invoke-Expression
iex
) =>$mathEx = "(1+2)*([math]::Pow(5,2))"; iex $mathEx
Eval()
powershell.exe
powershell.exe
^
CreateObject("MSScriptControl.ScriptControl")
Microsoft Access Object Library
.Eval()
MSScriptControl.ScriptControl