带有len和mid的循环的Vbscript

时间:2016-04-23 08:32:17

标签: for-loop vbscript random-sample string-length do-loops

我正在访问Vxheaven.org,而我发现此代码提供了一个随机文件名。

tmpname="" 
randomize(timer) 
namel=int(rnd(1)*20)+1 
For lettre = 1 To namel 
randomize(timer) 
tmpname=tmpname & chr(int(rnd(1)*26)+97) 
Next 
typext = "execombatbmpjpggifdocxlsppthtmhtthta" 
randomize(timer) 
tmpext = int(rnd(1)*11)+1 
tmpname=tmpname & "." & mid(typext,((tmpext-1)*3)+1,3) & ".vbs"

我对这些随机语句和for循环的用法感到困惑。 谁能解释一下这里到底发生了什么?

1 个答案:

答案 0 :(得分:4)

Chr(Int(Rnd(1) * 26) + 97)的目的是选择范围内的随机字符" a"到" z"。它的工作原理是因为" a"的ascii代码。是97,其余的字母依次排列。因此,For循环构建一个随机小写字符串,其长度介于1到20之间。

typext = "execombatbmpjpggifdocxlsppthtmhtthta"

是一个33 = 3x11个字符的字符串。连续三元组是常见的文件扩展名," exe"," com"," bat"等等。表达式

Mid(typext, ((tmpext - 1) * 3) + 1, 3)

提取其中一个三元组。

此代码存在许多问题。

1)Randomize (Timer)第一次是不必要的冗长。 Randomize本身随机数生成器与系统时间一起播种 - 你不需要传递任何东西,除非你希望将来能够重现随机数流,这不是&#39在这里的情况。

2)Randomize (Timer)第二次和第三次真的毫无意义。由于Timer具有1毫秒的分辨率,因此再次使用该行可能会将随机数生成器重置为完全相同的种子。因此,该行的重复很可能减少输出中的随机性。

3)在Rnd(1)中,1毫无意义。它与Rnd

的输出完全相同

4)为什么要在11个特定文件扩展名中加入硬连线以及为什么限制自己使用长度为3的文件扩展名?拥有一个文件扩展数组然后选择数组的随机元素更有意义。类似的东西:

typext = Array("exe","com","bat","bmp","jpg", "gif", "doc", "xls","ppt", "htm", "htt", "hta")
r = Int(Rnd * (1+ UBound(typext)))
tmpname=tmpname & "." & typext(r) & ".vbs"

这样,您可以自由地向数组中添加其他条目,包括" c"等等,其余代码也可以使用。

这是一个清理版本,编写为函数:

Function RandFileName()
    Dim tmpname, namel, lettre, tmpext, typext, r

    Randomize

    tmpname = ""
    namel = Int(Rnd(1) * 20) + 1

    For lettre = 1 To namel
      tmpname = tmpname & Chr(Int(Rnd(1) * 26) + 97)
    Next

    typext = Array("exe", "com", "bat", "bmp", "jpg", "gif", "doc", "xls", "ppt", "htm", "htt", "hta")
    r = Int(Rnd * (1 + UBound(typext)))
    tmpname = tmpname & "." & typext(r) & ".vbs"

    RandFileName = tmpname
End Function

典型输出:bgwkxjvaapr.exe.vbs