Sesame Script Schleifen

Von The Microsoft Scripting Guys

Dn308957.6A5AAD34598D72DB8BEFD4A5A0F1971E(de-de,TechNet.10).png

Willkommen zu Sesame Script, der Kolumne für Anfänger in der Skriptprogrammierung. In dieser Reihe werden erste grundlegende Kenntnisse zur Skriptprogrammierung vermittelt, durch die Sie viele Aufgaben der Systemadministration unter Windows automatisieren können. Durch die vorgestellten Konzepte der Skriptprogrammierung werden Sie in der Lage sein, Skripte zu lesen und zu verstehen und Ihre ersten eigenen Änderungen oder Erweiterungen in Skripts vorzunehmen. Sollte Ihnen ein spezieller Aspekt der Skriptprogrammierung Schwierigkeiten bereiten, lassen Sie es uns wissen (in englischer Sprache). Sehr wahrscheinlich sind Sie nicht der einzige, der vor einem bestimmten Problem steht.

Lesen Sie auch die bisherigen Artikel im Sesame Script-Archiv.

Auf dieser Seite

Dn308957.ACDCF196BC98A92A7E35715F19C8C405(de-de,TechNet.10).png Schleifen

Dn308957.ACDCF196BC98A92A7E35715F19C8C405(de-de,TechNet.10).png Auflistungen

Dn308957.ACDCF196BC98A92A7E35715F19C8C405(de-de,TechNet.10).png Arrays

Dn308957.ACDCF196BC98A92A7E35715F19C8C405(de-de,TechNet.10).png For-Schleifen

Dn308957.ACDCF196BC98A92A7E35715F19C8C405(de-de,TechNet.10).png Bonus-Informationen

Dn308957.ACDCF196BC98A92A7E35715F19C8C405(de-de,TechNet.10).png Folgen Sie auch nächstes Mal wieder unseren Ausführungen…

Schleifen

Nach einer Woche in einer Holzhütte in den Wäldern am Fuße des Grand Tetons (das liegt übrigens in Wyoming, USA, nur so nebenbei erwähnt) und einer weiteren äußerst erholsamen Woche Urlaub kehrt ein "Scripting Guy" zurück zur Hektik und Geschäftigkeit der Großstadt und widmet sich wieder seiner Arbeit. Was aber hat das mit der Kolumne in diesem Monat zu tun? Nun, eigentlich nicht sehr viel, und deswegen verlassen wir jetzt unsere beschauliche Holzhütte und widmen uns dem eigentlichen Thema dieser Ausgabe: der Schleifenprogrammierung.

Schleifen werden Sie in Ihren Skripts immer wieder brauchen, vor allem, da viele Objekte und Eigenschaften als Auflistungen von Objekten und Eigenschaften zurückgegeben werden. Als erstes sollten wir also das Thema Auflistungen ein wenig behandeln und dann zu den Schleifen übergehen. Oh, und nicht zu vergessen: Arrays, die ebenfalls häufig in Schleifen vorkommen. Wir beginnen also mit Auflistungen, sprechen anschließend über Arrays und widmen uns dann den Schleifen. Ja, genau in dieser Reihenfolge.

Sie sehen schon, nach so einer Woche in den Bergen braucht es doch ein bisschen, um sich wieder zu sammeln. Aber keine Sorge (nein, das hat nichts zu tun mit den Bären, die wir in den Tetons zwar gesucht, aber dann doch nicht gefunden haben), wir werden sofort etwas Ordnung in diese Kolumne bringen.

Dn308957.590B5404BFEA7F06684DB47B00539355(de-de,TechNet.10).png Zum Seitenanfang

Auflistungen

Auflistungen sind recht einfach zu verstehen, sobald Sie mit Objekten und Eigenschaften vertraut sind. Wenn dies nicht der Fall ist, lesen Sie den Artikel Class is in Session (in englischer Sprache).

Hinter Auflistungen verbirgt sich keine komplexe Definition. Wie der Name schon sagt, handelt es sich schlicht um Auflistungen bzw. Sammlungen. Während einige Leute Briefmarken, Baseballkarten oder Keksdosen sammeln, verwenden Skripts Sammlungen (Auflistungen) von – Moment, denken Sie selbst kurz nach, bevor wir es Ihnen sagen. Welche Art von Auflistungen könnten Sie in einem Skript verwenden? Die Antwort finden Sie verkehrt herum am Ende dieser Kolumne.

Oh, wir konnten leider nicht herausfinden, wie wir Text verkehrt herum in den Artikel einfügen können, also geben wir die Antwort einfach selbst. In Skripts werden Auflistungen von Objekten und Eigenschaften verwendet. Wofür? Danke, dass Sie gefragt haben.

Beispiel einer Auflistung

Nehmen Sie an, Sie möchten alle Laufwerke eines Computers auflisten. Diese Informationen finden Sie auf dem lokalen Computer, wenn Sie, wie in der folgenden Codezeile, auf FileSystemObject zugreifen:

Set objFSO = CreateObject("Scripting.FileSystemObject")

Hiermit erhalten Sie eine Instanz von FileSystemObject in der Variablen objFSO. Anschließend müssen Sie die Laufwerke suchen. Sie könnten versuchen, auf ein Objekt (ja, Objekte können wiederum Objekte enthalten) oder auf eine Eigenschaft mit der Bezeichnung Drive in FileSystemObject zuzugreifen:

Set objDrive = objFSO.Drive

Allerdings werden Sie damit nicht erfolgreich sein. Der Grund hierfür ist schnell gefunden: Die meisten Computer haben mehr als ein Laufwerk. Heutzutage wird jeder Computer mindestens über eine Festplatte und ein CD-Laufwerk verfügen. Wenn lediglich ein einzelnes Laufwerksobjekt zurückgegeben würde, wie sollte FileSystemObject dann wissen, welches Laufwerk es zurückgeben muss? Statt zufällig eines der Laufwerke zurückzugeben, stellt FileSystemObject eine Drives-Auflistung bereit:

Set colDrives = objFSO.Drives

Die Variable colDrives liefert eine Auflistung aller Laufwerke, die FileSystemObject auf dem Computer gefunden hat.

Wie kann nun auf die Eigenschaften der einzelnen Laufwerke zugegriffen werden? Vielleicht mit folgendem Befehl:

Wscript.Echo colDrives.DriveLetter

Nein. Wie der Befehl genau aussieht, werden wir in ein paar Minuten erläutern, wenn wir zum Thema "Schleifen" kommen. Zunächst jedoch ein paar Überlegungen zu Arrays.

Bevor wir das Thema wechseln, sollten noch ein paar andere Dinge zu Auflistungen erwähnt werden. Zuallererst werden Sie bei der Skriptprogrammierung nur selten Zuweisungen zu einer Auflistung vornehmen. Wie im vorigen Beispiel, bei dem FileSystemObject eine Auflistung der Laufwerke zurückgegeben hat, werden Sie Auflistungen lediglich abfragen.

Zweitens ist es möglich, dass eine Auflistung nur ein Element enthält. Sogar Auflistungen, die kein Element enthalten, sind möglich. Wenn Ihr Computer keine Laufwerke hätte (nicht sehr wahrscheinlich, aber diese Annahme erspart uns die Suche nach einem anderen Beispiel), wäre die colDrives-Auflistung leer.

Weitere Informationen

Collections (Sammlungen) – Microsoft Windows 2000 – Scripting-Handbuch

Collections ohne Elemente – Microsoft Windows 2000 – Scripting-Handbuch

Dn308957.590B5404BFEA7F06684DB47B00539355(de-de,TechNet.10).pngZum Seitenanfang

Arrays

Bevor wir damit beginnen, auf einzelne Elemente in einer Auflistung zuzugreifen, werden wir uns einem anderen Datentyp widmen, der ebenfalls häufig in Schleifen durchlaufen wird: Arrays. Ein Array enthält, wie eine Auflistung, verschiedene Sammlungen von Elementen. Worin liegt also der Unterschied zwischen einer Auflistung und einem Array?

Eine Auflistung enthält Elemente, die innerhalb einer Klasse definiert werden, also Eigenschaften und Objekte (jedoch keine Methoden: Es würde keinen Sinn ergeben, eine Methode zu besitzen. Methoden werden aufgerufen). Auflistungen sind zudem selbst Objekte eines bestimmten Typs, die mehrere Elemente enthalten. Wie im vorhergehenden Abschnitt über Auflistungen verwenden Sie in der Regel die Set-Anweisung, um eine Auflistung einer Variablen zuzuweisen. Ein Array hingegen enthält eine Reihe von Elementen, die von jedem beliebigen Datentyp sein können. Es kann Objekte enthalten, aber auch Zeichenfolgen, einzelne Zeichen, Zahlen und jeden anderen Datentyp, der in VBScript verfügbar ist. Sie können einer Arrayvariablen Werte zuweisen, ohne die Set-Anweisung zu verwenden. Arrays sind lediglich Container für Informationen, die Sie als Gruppe zusammenfassen möchten.

Beispiel für ein Array

Wir werden noch nicht mit einem praktischen Beispiel für Arrays beginnen. So ein Beispiel würde ohne eine Schleife sehr umständlich wirken. Aber wir können die Funktionsweise an einem Beispiel erläutern. Beginnen wir damit, einem Array Zeichen zuzuweisen und anschließend diese Zeichen auszugeben:

Dim arrArray(7)

arrArray(0) = "m"
arrArray(1) = "y"
arrArray(2) = " "
arrArray(3) = "a"
arrArray(4) = "r"
arrArray(5) = "r"
arrArray(6) = "a"
arrArray(7) = "y"

Wscript.Echo arrArray(0) & arrArray(1) & arrArray(2) & arrArray(3) & _
    arrArray(4) & arrArray(5) & arrArray(6) & arrArray(7)

Wie Sie sehen, wird in der ersten Zeile eine Dim-Anweisung verwendet. Diese Anweisung wurde im Artikel zu Variablen und Konstanten nicht besprochen, obwohl dies wahrscheinlich sinnvoll gewesen wäre. (Wir werden dies eines Tages nachholen.) Im Moment reicht es zu wissen, dass Sie Ihrem VBScript-Programm mit der Dim-Anweisung mitteilen, dass Sie später im Skript genau diese Variable verwenden werden. Sie können vor der Verwendung für jede Variable eine Dim-Anweisung einfügen. Es gibt mehrere Gründe, die bei verschiedenen Datentypen für die Verwendung einer Dim-Anweisungen sprechen. Hier ist jedoch nur zu beachten, dass die Dim-Anweisung bei Arrays zwingend ist (bis auf einige spezielle Fälle, die später behandelt werden). Durch Verwenden der Dim-Anweisung teilen Sie VBScript mit, dass Sie die angegebene Variable (hier: arrArray) im Skript verwenden werden. Außerdem geben Sie durch die Klammern hinter dem Variablennamen an, dass es sich bei dieser Variable um ein Array handelt.

Die Dim-Anweisung ist notwendig, da Klammern hinter einem Namen normalerweise anzeigen, dass es sich um eine Methode handelt:

DoSomethingNow(x)

Wenn Sie einem Array einen Wert zuweisen, geben Sie in den Klammern die Position im Array an, an der der Wert gespeichert werden soll. In diesem Fall speichern wir den Buchstaben "m" an Position 0 (null) (Arrays beginnen in VBScript immer bei 0):

arrArray(0) = "m"

Gleichzeitig muss VBScript jedoch wissen, dass arrArray keine aufzurufende Methode, sondern tatsächlich ein Array ist. Daher müssen Sie vor der Zuweisung die Dim-Anweisung verwenden.

Ein weiterer wichtiger Aspekt der Dim-Anweisung: Beachten Sie die Zahl in den Klammern. Diese Zahl gibt die Größe des Arrays an, also die Zahl der Elemente, die später im Array gespeichert werden sollen.

Was, wenn die Größe im Vorfeld nicht bekannt ist?

Diese Frage werden wir am Ende des Artikels beantworten. Zunächst weiter im Beispielskript.

Durch die Dim-Anweisung weiß VBScript, dass wir ein Array für sieben Elemente benötigen. Nun, das ist nicht ganz richtig: Diese Dim-Anweisung teilt VBScript mit, dass das Array acht Elemente enthalten soll.

Was? Wie kommen Sie auf acht Elemente?

Auch diese Frage wird in Kürze beantwortet. Einen kurzen Moment noch.

Jedes Element in einem Array hat eine bestimmte Position. Das ist nicht anders als bei einem Karton mit Eiern aus dem Lebensmittelgeschäft. Jedes Ei hat sein Fach im Karton. Bei 12 Eeiern braucht der Karton selbstverständlich 12 Fächer. Also definieren Sie den Karton als ein Array mit 11.

Nein, das ist falsch, oder? Es hieß doch 12.

Okay, der Nächste, der ungeduldig fragt, muss in die Ecke, bis wir fertig sind.

In VBScript beginnt die Nummerierung der Positionen bei 0 (null). 12 Fächer erhalten damit die Positionen 0 bis 11. Bei der Deklaration eines Arrays mit der Dim-Anweisung geben Sie nicht die Zahl der Elemente, sondern die Position des letzten Elements im Array an. Die Größe eines Arrays ist immer definiert als die Zahl der Elemente im Array minus eins.

In einigen Situationen ist die spätere Größe eines Arrays nicht bekannt, wenn Sie mit einem Skript beginnen. In diesem Fall verwenden Sie dennoch die Dim-Anweisung (zur Deklaration des Arrays), lassen die Klammern jedoch leer:

Dim arrArray()

Sobald innerhalb des Skripts die genaue Anzahl der benötigten Elemente bekannt ist, deklarieren Sie das Array mit der ReDim-Anweisung neu:

ReDim arrArray(5)

Das sind alle Aspekte, die ohne die Besprechung von Schleifen behandelt werden können. Jetzt werden Ihre Fragen beantwortet. Keine Fragen mehr? Wunderbar, dann machen wir weiter.

Weitere Informationen

Arrays (Felder) – Microsoft Windows 2000 – Scripting-Handbuch

ReDim Statement – VBScript Language Reference (in englischer Sprache)

Dn308957.590B5404BFEA7F06684DB47B00539355(de-de,TechNet.10).pngZum Seitenanfang

For-Schleifen

Nachdem wir jetzt wissen, welche Arten von Elementen in Schleifen durchlaufen werden, können wir zwei verschiedene Schleifenvarianten betrachten: die "For Each"-Schleife und die "For Next"-Schleife.

For Each

Eine "For Each"-Schleife wird wie folgt erstellt:

For Each <element> in <collection>
    ' do something
Next

Wie Sie sehen, ist dies die übliche Vorgehensweise zum Durchlaufen von Auflistungen. Ersetzen Sie <collection> einfach durch den Namen Ihrer Auflistungsvariable, und wählen Sie einen beliebigen (noch nicht verwendeten) Variablennamen für <element>. Und nun zurück zu unserem Laufwerksbeispiel vom Anfang. So weit waren wir:

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set colDrives = objFSO.Drives

Unsere Auflistungsvariable ist colDrives, und da es sich um eine Auflistung von Objekten handelt, wählen wir für <element> den Variablennamen objDrive:

For Each objDrive in colDrives
    ' do something
Next

Als Satz formuliert bedeutet diese Anweisung: Für jedes Laufwerksobjekt in der Auflistung der Laufwerke wird eine bestimmte Aktion ausgeführt. Beim ersten Ausführen der "For Each"-Zeile weist VBScript der Objektvariablen objDrive das erste Laufwerk in der Auflistung zu. Anschließend werden die Zeilen innerhalb der Schleife ausgeführt. Mit der Next-Anweisung wird das Ende der Schleife angezeigt. Alle Aktionen, die für dieses eine Laufwerk ausgeführt werden sollen, wurden abgeschlossen. Da das aktuelle Objekt in der Objektvariablen jetzt nicht mehr benötigt wird, kann die Ausführung mit dem nächsten Objekt in der Auflistung fortgesetzt werden. An diesem Punkt springt das Skript zurück zur "For Each"-Anweisung, holt das nächste Objekt in der Auflistung und weist dieses Objekt der Variablen objDrive zu. Dieser Prozess wird fortgesetzt, bis die "For Each"-Anweisung kein weiteres Objekt mehr aus der Auflistung abrufen kann. Sobald dieser Punkt erreicht ist, wird die Schleife verlassen, und die Ausführung des Skripts wird mit der nächsten Zeile nach der Next-Anweisung fortgesetzt.

Probieren Sie folgendes Beispiel aus:

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set colDrives = objFSO.Drives

For Each objDrive in colDrives
    Wscript.Echo "Drive letter: " & objDrive.DriveLetter
Next

Wscript.Echo "Done"

For Next

Als nächstes werden wir die ähnliche "For Next"-Schleife betrachten. Diese Schleifenvariante wird häufiger für Arrays verwendet, insbesondere wenn bekannt ist, wie oft die Schleife durchlaufen werden soll. Eine "For Next"-Schleife wird wie folgt erstellt:

For <counter> = <start> to <end>   
     ' do something
Next

Der <counter> (Zähler) ist eine beliebige Variable. (Üblicherweise wird hierfür ein einzelner Buchstabe verwendet, z. B. "i".) Der <start>-Wert gibt den Wert an, mit dem die Zählung in der Schleife begonnen wird, und <end> legt das Ende der Zählung fest. Hier ein Beispiel:

For i = 0 to 3
    ' do something
Next

Wir hätten die Schleife auch mit jedem anderen Wert beginnen können:

For i = 9 to 12
    ' do something
Next

Mit welchem Wert Sie beginnen, ist abhängig davon, welche Aktionen Sie in einer Schleife ausführen möchten und ob Sie sich innerhalb der Schleife auf die Zählervariable beziehen. Aus dem folgenden Beispiel wird sofort deutlich, in welchen Fällen diese Schleifenvariante gerade für Arrays geeignet ist:

Dim arrCount()

size = 3
ReDim arrCount(size)

For i = 0 to size
    arrCount(i) = i
    Wscript.Echo arrCount(i)
Next

Wscript.Echo "Done "

Das Beispiel erzeugt folgende Ausgabe:

0
1
2
3
Done

Die "For Next"-Anweisung ist der "For Each"-Anweisung sehr ähnlich. Der Unterschied liegt darin, dass Sie festlegen können, wie oft die Schleife durchlaufen werden soll. Beim ersten Durchlaufen der Schleife wird der Startwert der Variablen i zugewiesen. In diesem Fall enthält i beim ersten Durchlauf also den Wert 0 (null). Daraufhin werden alle folgenden Zeilen bis zur Next-Anweisung ausgeführt. Beim Erreichen der Next-Anweisung wird zur For-Anweisung zurückgesprungen. Bei der zweiten Ausführung der For-Anweisung wird der Wert von i um 1 (eins) erhöht, und i erhält damit den Wert 1. Die For-Anweisung erhöht den Wert solange bei jedem Schleifendurchlauf, bis dieser gleich dem angegebenen Endwert ist. Sobald der Endwert erreicht ist (hier der Wert von size, also 3), werden die Anweisungen innerhalb der Schleife ein letztes Mal ausgeführt. Mit der Next-Anweisung wird wiederum zur For-Anweisung zurückgesprungen. Dieses Mal ist der Endwert jedoch bereits überschritten: Die Schleife wird verlassen, und es wird die nächste Zeile nach der Next-Anweisung ausgeführt.

Die Schrittweite ist nicht zwingend auf 1 festgelegt. Dies ist lediglich der Standardwert. Stattdessen kann die Zählervariable mit jedem Schleifendurchlauf um einen beliebigen ganzzahligen Wert erhöht werden:

Dim arrCount()

size = 3
ReDim arrCount(size)

For i = 0 to size Step 2
    arrCount(i) = i
    Wscript.Echo arrCount(i)
Next

Wscript.Echo "Done "

Beim ersten Durchlauf wird der Startwert (0) zugewiesen. Anschließend wird die Zählervariable um 2 erhöht, und es ergibt sich folgende Ausgabe:

0
2
Done

Sie können sogar rückwärts zählen. (Denken Sie aber daran, dass der Startwert dabei größer sein muss als der Endwert. Andernfalls wird die Schleife sofort beendet und nicht durchlaufen.) Probieren Sie Folgendes aus:

Dim arrCount()

size = 3
ReDim arrCount(size)

For i = size to 0 Step -1
    arrCount(i) = i
    Wscript.Echo arrCount(i)
Next

Wscript.Echo "Done "

Weitere Informationen

For Each – Microsoft Windows 2000 – Scripting-Handbuch

For Each…Next Statement – VBScript Language Reference (in englischer Sprache)

For Next – Microsoft Windows 2000 – Scripting-Handbuch

For…Next Statement – VBScript Language Reference (in englischer Sprache)

Dn308957.590B5404BFEA7F06684DB47B00539355(de-de,TechNet.10).pngZum Seitenanfang

Bonus-Informationen

Na gut, es handelt sich nicht wirklich um Bonus-Informationen. Das klingt jedoch besser als "Eine Menge weiterer Informationen zu Auflistungen/Arrays/Schleifen".

"For Each" mit Arrays

Wir haben die Verwendung der "For Each"-Schleife für Auflistungen und der "For Next"-Schleife für Arrays behandelt. Es sollte erwähnt werden, dass auch die "For Each"-Schleife für Arrays verwendet werden kann:

Dim arrArray(3)

arrArray(0) = 100
arrArray(1) = 150
arrArray(2) = 200
arrArray(3) = 250

For Each intArray in arrArray
    Wscript.Echo intArray
Next

Das Verfahren ist dasselbe wie bei Auflistungen. Beim ersten Durchlaufen der Schleife wird intArray der Wert zugewiesen, der im ersten Element des Arrays, arrArray(0), gespeichert ist. Anschließend wird dieses Element ausgegeben. Beim nächsten Durchlauf enthält intArray den Wert des zweiten Elements, arrArray(1), usw.

Erstellen von Arrays ohne Dim

Zuvor wurde erwähnt, dass die Dim-Anweisung zur Deklaration von Arrays verwendet wird und dass diese Deklaration zwingend ist. Es geht aber auch anders. Es gibt eine weitere Möglichkeit, den Elementen in einem Array Werte zuzuweisen. Sie können hierfür die Array-Methode verwenden:

arrArray = Array("m","y"," ","a","r","r","a","y")

Wscript.Echo arrArray(0) & arrArray(1) & arrArray(2) & arrArray(3) & _
    arrArray(4) & arrArray(5) & arrArray(6) & arrArray(7)

Kopieren Sie dieses Skript in Notepad bzw. Editor, und führen Sie es aus (wenn Sie nicht wissen, wie Sie ein Skript ausführen können, lesen Sie den Artikel Scripting: Your First Steps (in englischer Sprache)). Sie werden dieses Skript ohne Fehlermeldungen ausführen können. Die Dim-Anweisung ist in diesem Fall nicht erforderlich, da die Array-Methode ein Array zurückgibt. VBScript weiß also, dass die arrArray-Variable ein Array enthalten soll.

Beenden einer Schleife

Angenommen, Sie möchten eine Auflistung nach einem bestimmten Wert durchsuchen. Sobald der Wert gefunden wurde, gibt es keinen Grund, die Schleife für die verbleibenden Elemente der Auflistung fortzusetzen. Das wäre reine Zeitverschwendung. Wie kann eine Schleife vorzeitig beendet werden? Ganz einfach folgendermaßen:

For i = 0 to 3
    Wscript.Echo i
    Exit For
Next

Dieser Code erzeugt folgende Ausgabe:

0

Beim Erreichen der "Exit For"-Anweisung im Skript wird die Schleife sofort verlassen und direkt die Anweisung ausgeführt, die auf die Next-Anweisung folgt.

Weitere Informationen

Exit Statement – VBScript Language Reference (in englischer Sprache)

Dn308957.590B5404BFEA7F06684DB47B00539355(de-de,TechNet.10).pngZum Seitenanfang

Folgen Sie auch nächstes Mal wieder unseren Ausführungen…

Hiermit beschließen wir den heutigen Artikel. Wir haben unser Bestes gegeben, jedenfalls wenn Sie bedenken, dass wir gerade erst wieder aus dem Urlaub zurück sind. Vielleicht nicht beim nächsten Mal, aber in einer der folgenden Ausgaben werden wir einige weitere Schleifenvarianten behandeln, die Sie in VBScript verwenden können. Wenn Sie das Thema sofort vertiefen möchten, werfen Sie einen Blick in den VBScript User’s Guide (in englischer Sprache) auf der MSDN-Website.

Dn308957.590B5404BFEA7F06684DB47B00539355(de-de,TechNet.10).pngZum Seitenanfang

| Home | Technische Artikel | Community