2016-04-23 22 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 ... –