2016-04-23 5 views
-1

Ich besuchte Vxheaven.org, während ich diesen Code gefunden, um mit einem zufälligen Dateinamen zu kommen.Vbscript für Schleife mit len ​​und Mitte

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" 

Ich bin verwirrt zwischen diesen zufälligen Anweisungen und seine Verwendung mit for-Schleife. Kann mir jemand erklären, was hier eigentlich passiert?

Antwort

4

Der Zweck von Chr(Int(Rnd(1) * 26) + 97) ist, ein zufälliges Zeichen im Bereich "a" bis "z" auszuwählen. Es funktioniert, weil der ASCII-Code für "a" 97 ist und der Rest des Alphabets der Reihe nach folgt. Somit baut die for-Schleife eine zufällige String für Kleinbuchstaben, deren Länge sich irgendwo zwischen 1 und 20.

typext = "execombatbmpjpggifdocxlsppthtmhtthta" 

ist eine Kette von 33 = 3x11 Zeichen. Aufeinander folgende Tripel sind gemeinsame Dateierweiterungen, "exe", "com", "Fledermaus", etc. Der Ausdruck

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

Extrakte einer dieser Tripel.

Es gibt viele Probleme mit diesem Code.

1) Randomize (Timer) das erste Mal ist unnötig ausführlich. Randomize selbst sät den Zufallszahlengenerator mit der Systemzeit - Sie müssen nichts weiterleiten, es sei denn, Sie möchten in Zukunft den Strom von Zufallszahlen reproduzieren können, was hier nicht der Fall ist.

2) Randomize (Timer) das zweite und dritte Mal ist wirklich sinnlos. Da Timer eine Auflösung von 1 Millisekunde hat, ist es bei einer erneuten Verwendung dieser Zeile wahrscheinlich, dass der Zufallszahlengenerator genau auf den gleichen Seed zurückgesetzt wird. Daher könnten die Wiederholungen dieser Zeile die Menge der Zufälligkeit in der Ausgabe verringern.

3) In Rnd(1) ist die 1 sinnlos. Es hat genau die gleiche Ausgabe wie Rnd

4) Warum hardwire in 11 bestimmten Dateierweiterungen und warum beschränken Sie sich auf Dateiendungen der Länge 3? Es macht mehr Sinn, ein Array von Dateierweiterungen zu haben und dann ein zufälliges Element des Arrays auszuwählen. Etwas wie:

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" 

Auf diese Weise können Sie frei andere Einträge in das Array hinzufügen, einschließlich solcher Dinge wie „c“ und der Rest des Codes arbeiten.

Hier ist eine aufgeräumte Version als Funktion geschrieben:

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 

typische Ausgabe: bgwkxjvaapr.exe.vbs

+0

Mid (typext, ((TmpExt - 1) * 3) + 1, 3) Was genau ist über Zahlen, die die Extraktion dieser Erweiterung durchführen? Wie wird eine solche Multiplikation und Addition zu einem solchen Ergebnis führen? – Akki

+0

Das mittlere Argument '((tmpext - 1) * 3) + 1' ergibt eine der Zahlen 1,4,7, ..., 31 (abhängig vom Zufallswert' tmpext'). Wenn 'tmpext' zum Beispiel 2 ist, dann wird dies zu 7 ausgewertet und dann würde 'Mid (typext, 7,3)' die 3 Zeichen extrahieren, die an Position 7 beginnen. Das wäre der Teilstring" bat ". Wie ich in meiner Antwort angedeutet habe, glaube ich wirklich nicht, dass dies ein guter Weg ist, dies zu tun. Ich erwähnte, dass ich es zu unflexibel fand. Es ist auch unnötig unklar. –

+0

Wegen der Subtraktion um 1, in dem obigen Kommentar hätte ich sagen sollen, dass, wenn 'tmpext' * 3 * ist, der Ausdruck zu 7 ... –