【问题标题】:VB Script in Wine doesn't return values for RND functionWine 中的 VB 脚本不返回 RND 函数的值
【发布时间】:2021-07-18 21:58:07
【问题描述】:

我正在尝试使用 Wine 在 Linux 下运行 vbscript,但它不起作用。其他 vbscript 函数按预期工作。

Wine 版本:wine-5.0.3 (Ubuntu 5.0.3-3) 命令:wine cscript ./test_rnd.vbs

VBS:

   On Error Resume Next
WScript.Echo "Before Rnd"

Rnd -1

WScript.Echo "After Rnd"

If Err.Number <> 0 Then
  WScript.Echo "Error : " & Err.Number & ": " & Err.Description
End If

使用 Wine 输出:

此脚本在 Windows 中运行良好。

我需要安装任何其他酒依赖项吗?如果您有任何在 Linux 中执行 VBS 的替代解决方案,请提及。

【问题讨论】:

  • 你能描述一下“不起作用”是什么意思吗?函数返回什么?还是显示错误? Err 设置了吗?
  • 执行在“Rnd -1”行之后不会继续。此函数的目的是根据我们在此处设置的种子值“Randomize 3922004”返回一个随机数
  • 没有继续是什么意思?任何控制台输出? cscript.exe 返回什么退出代码?如果添加On Error 处理程序,Err 包含什么错误?
  • @CherryDT 我用输出更新了问题
  • 在尝试Rnd 之前Randomize 是否有效?我在网上找不到有关此的任何信息,我想可能是它没有实现。也许你也应该在Wine forums 询问。

标签: linux vbscript wine


【解决方案1】:

Rnd() 函数依赖于Randomize statement 生成的种子,Randomize statement 通过操作系统系统计时器(Windows 操作系统的一项功能)生成种子。虽然 Linux 也有类似的东西,但 VBScript 的代码库不知道如何调用它,而是依赖 Wine 来提供一个模仿 Windows 系统计时器的实现。

因为您收到的错误是

Object doesn’t support this action

恐怕在 Wine 提供一个实现之前你会不走运。

【讨论】:

    【解决方案2】:

    虽然 Wine 似乎不支持 VBScript 的 Rnd 函数,但您自己实现的“随机”函数又如何呢?

    Function RndNum(MaxValue)
        RndNum = (((Hour(Now) + 1) * (Minute(Now) + 1) * (Second(Now) + 1) * Right(Timer, 5)) Mod MaxValue)
    End Function
    

    How to manually generate random numbers

    编辑:

    上面的代码在循环运行时没有生成随机数,因为时间戳不够精确。

    更新函数以使用外部种子确实有效,但我不保证这些将是多么独特,我假设这不适用于密码学......

    Function RndNum(Seed, MaxValue)
        RndNum = (((Hour(Now) + 1) * (Minute(Now) + 1) * (Second(Now) + 1) * Right((Seed * Right(Timer, 5)), 8)) Mod MaxValue) 
    End Function
    
    Do
        counter = counter + 1
        Numbers = Numbers & RndNum(counter,1000) & ", "
    Loop While counter < 10
    
    MsgBox Numbers
    

    【讨论】:

    • 虽然是勇敢的尝试,但不是等价的,因为 1. VBScript 计时精度不够准确。 2.系统定时器用于生成种子,或者在生成随机值时取一个起始种子与系统定时器一起使用。
    • @user692942 当然,我确信这些可能不会像 Rnd 函数那样随机,但是在使用循环计数器作为外部种子之后你有什么想法?根据需要,我的想法是这可能足够随机。
    • 这取决于用户使用它的要求。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-01
    • 1970-01-01
    • 2017-10-02
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多