2016-04-23 24 views
-1

我正在访问Vxheaven.org,而我发现这个代码想出一个随机的文件名。Vbscript for循环与len和中间

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循环的用法感到困惑。 任何人都可以解释我在这里发生了什么?

回答

4

Chr(Int(Rnd(1) * 26) + 97)目的是挑选的范围内的随机字符“a”到“Z”。它的工作原理是,“a”的ascii代码是97,其余的字母顺序依次排列。因此,对于环积聚随机小写其长度的字符串某处1和20

typext = "execombatbmpjpggifdocxlsppthtmhtthta" 

之间

是33 = 3x11字符的字符串。连续的三元组是共同的文件扩展名,“执行”,“COM”,“球棒”等的表达的那些三元

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

提取物之一。

这段代码有很多问题。

1)Randomize (Timer)所述第一时间是不必要的冗长。 Randomize本身将随机数发生器与系统时间结合在一起 - 除非您希望能够在未来再现随机数字流,否则您不需要传递任何数字,这里就不是这种情况。

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

+0

MID(typext,((tmpext - 1)* 3)+ 1,3) 以上的数字是如何提取这些扩展名的?这样的乘法和加法将如何产生这样的结果? – Akki

+0

中间参数'((tmpext - 1)* 3)+ 1'的值为1,4,7,...,31之一(取决于随机值tmpext)。例如,如果'tmpext'是2,那么这将评估为7,然后'Mid(typext,7,3)'将提取从位置7开始的3个字符。这将是子字符串“bat”。正如我在答复中所表明的那样,我认为这不是一个好办法。我提到我认为它太不灵活。这也是不必要的晦涩难懂。 –

+0

由于减1,在上面的评论中,我应该说,如果'tmpext'是* 3 *那么表达式计算为7 ... –