VB6 中的“Eval”功能:用 Powershell 或其他方式替换 VBScript

"Eval" functionality in VB6: replace VBScript by Powershell or some other means

提问人:steveOw 提问时间:10/24/2023 最后编辑:steveOw 更新时间:11/3/2023 访问量:181

问:

在 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重新聚焦到其他工具/方法。

Powershell VB6

评论

1赞 Santiago Squarzon 10/24/2023
您可以使用(别名Invoke-Expressioniex) => $mathEx = "(1+2)*([math]::Pow(5,2))"; iex $mathEx
2赞 Joel Coehoorn 10/24/2023
用它来处理数学表达式真的很糟糕。这是因为 Eval() 不仅限于数学,而是开放了语言可以做的任何事情,包括违反安全规定的事情。你真正想要的是一个专用的数学解析库,其中有几个。Eval()
2赞 mklement0 10/25/2023
为每个评估调用一个子进程会非常慢。原则上,您可以保持进程打开并通过 stdin 重复传递命令(有关 Nodej.js 解决方案,请参阅此答案),但我想这在 VB6 中并非易事。您还必须考虑 PowerShell 的不同语法,特别是 for 指数运算的不可用。powershell.exepowershell.exe^
2赞 mklement0 10/25/2023
您说 VBScript 将停用,但我想知道这是否也适用于相关的 COM (ActiveX) 组件,这些组件不是特定于 VB 的。换句话说:也许会继续工作?官方公告非常简洁CreateObject("MSScriptControl.ScriptControl")
2赞 mklement0 10/27/2023
@steveOw,根据 tek-tips.com/viewthread.cfm?qid=275908(无法自己验证)。但是,您能否假设运行应用程序的所有计算机都安装了 MS Access?是否可以仅捆绑此库以实现功能?同样,我将研究该控件是否真的会与 VBScript 一起删除。JScript 的状态如何,它也可以使用此控件?(我知道它已在浏览器中被禁用,但它会像 VBScript 一样被完全删除吗?Microsoft Access Object Library.Eval()MSScriptControl.ScriptControl

答:

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)”。总的来说,它似乎可以满足我的需求,无需链接任何其他库。非常感谢!