带有 len 和 mid 的循环的 Vbscript
Vbscript for loop with len and mid
我在访问 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 循环中的用法感到困惑。
谁能给我解释一下这里到底发生了什么?
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
本身用系统时间为随机数生成器播种——你不需要传递任何东西给它,除非你希望将来能够重现随机数流,但事实并非如此这里。
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
我在访问 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 循环中的用法感到困惑。 谁能给我解释一下这里到底发生了什么?
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
本身用系统时间为随机数生成器播种——你不需要传递任何东西给它,除非你希望将来能够重现随机数流,但事实并非如此这里。
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