Skip to content

3. Grundlagen der VBScript-Programmierung

Nachdem wir die möglichen Ausführungskontexte für ein VBScript-Skript beschrieben haben, werden wir nun die Sprache selbst behandeln. Von hier an gehen wir von folgenden Voraussetzungen aus:

  1. Der Skriptcontainer ist WSH
  2. das Skript befindet sich in einer Datei mit der Erweiterung .vbs

Um ein Konzept vorzustellen, gehen wir im Allgemeinen wie folgt vor:

  • Wir stellen das Konzept bei Bedarf vor
  • Wir stellen ein anschauliches Programm zusammen mit seinen Ergebnissen vor
  • Wir kommentieren die Ergebnisse und das Programm, falls erforderlich

Bei VBScript-Containern wird im Skripttext nicht zwischen Groß- und Kleinschreibung unterschieden. Daher können Sie entweder „wscript.echo „hello““ oder „WSCRIPT.ECHO „hello““ schreiben.

Die unten vorgestellten Programme geben viele Informationen auf dem Bildschirm aus, daher werden wir uns noch einmal die Ausgabemethoden des wscript-Objekts ansehen.

3.1. Anzeigen von Informationen

Wir haben bereits die echo-Methode des wscript-Objekts verwendet, aber es gibt noch weitere Methoden zum Schreiben auf den Bildschirm, wie im folgenden Skript gezeigt:

Programm
Ergebnisse
1
2
3
4
eins
zwei drei
vier
fünf

Die folgenden Punkte sind zu beachten:

  • Jeder Text, der auf ein Apostroph folgt, wird als Skriptkommentar behandelt und von WSH nicht interpretiert (Zeile 1).
  • Die Methode „echo“ gibt ihre Argumente aus und springt zur nächsten Zeile, ebenso wie die Methode „writeLine“ (Zeilen 2 und 6)
  • Die Methode „write“ gibt ihre Argumente aus und springt nicht in die nächste Zeile (Zeile 3).
  • Ein Zeilenendezeichen wird durch die Folge der beiden ASCII-Zeichen 13 und 10 dargestellt. Daher wird Zeile 4 durch den Ausdruck chr(13) & chr(10) dargestellt, wobei chr(i) das ASCII-Zeichen i und & der Zeichenfolgenverknüpfungsoperator ist. Somit ergibt „chat“ & „eau“ die Zeichenfolge „chateau“.
  • Das Zeilenendezeichen lässt sich einfacher durch die Konstante vbCRLF darstellen (Zeile 5)

3.2. : Anweisungen in einem VBScript-Skript schreiben

Standardmäßig wird eine Anweisung pro Zeile geschrieben. Es können jedoch mehrere Anweisungen in einer einzigen Zeile geschrieben werden, indem man sie durch das Zeichen: trennt, wie in inst1:inst2:inst3. Wenn eine Zeile zu lang ist, kann sie in Teile aufgeteilt werden. In diesem Fall müssen die verschiedenen Teile der Anweisung durch die beiden Zeichen (Leerzeichen)_ abgeschlossen werden. Schauen wir uns das vorherige Beispiel noch einmal an, indem wir die Anweisungen anders umschreiben:

Programm
Ergebnisse
1
2
3
4
eins
zwei drei
vier
fünf

3.3. Schreiben mit der Funktion msgBox

Während wir in diesem Dokument das wscript-Objekt fast ausschließlich zur Anzeige von Text auf dem Bildschirm verwenden, gibt es eine komplexere Funktion zur Anzeige von Informationen in einem Fenster. Dies ist die msgbox-Funktion, die im Allgemeinen mit drei Parametern verwendet wird:

msgbox Nachricht, Symbole+Schaltflächen, Titel

  • message ist der Text der anzuzeigenden Meldung
  • icons+buttons (optional) ist eigentlich eine Zahl, die den Typ des Symbols und die Schaltflächen angibt, die im Meldungsfenster platziert werden sollen. Diese Zahl ist meist die Summe zweier Zahlen: Die erste bestimmt das Symbol, die zweite die Schaltflächen
  • title ist der Text, der in der Titelleiste des Meldungsfensters angezeigt werden soll

Die Werte zur Festlegung des Symbols und der Schaltflächen im Anzeigefenster lauten wie folgt:

Konstante
Wert
Beschreibung
vbOKOnly
   0
Zeigt nur die Schaltfläche „OK“ an.
vbOKCancel
   1
Zeigt die Schaltflächen „OK“ und „Abbrechen“ an.
vbAbortRetryIgnore
   2
Zeigt die Schaltflächen „Abbrechen“, „Wiederholen“ und „Ignorieren“ an.
vbYesNoCancel
   3
Zeigt die Schaltflächen „Ja“, „Nein“ und „Abbrechen“ an.
vbYesNo
   4
Zeigt die Schaltflächen „Ja“ und „Nein“ an.
vbRetryCancel
   5
Zeigt die Schaltflächen „Erneut versuchen“ und „Abbrechen“ an.
vbCritical
16
Zeigt das Symbol für kritische Meldungen an.
vbQuestion
32
Zeigt das Symbol für eine Warnanfrage an.
vbExclamation
48
Zeigt das Symbol für eine Warnmeldung an.
vbInformation
64
Zeigt das Symbol für eine Informationsmeldung an.
vbDefaultButton1
   0
Die erste Schaltfläche ist die Standardschaltfläche.
vbDefaultButton2
256
Die zweite Schaltfläche ist die Standardschaltfläche.
vbDefaultButton3
512
Die dritte Schaltfläche ist die Standardschaltfläche.
vbDefaultButton4
768
Die vierte Schaltfläche ist die Standardschaltfläche.
vbApplicationModal
   0
Modale Anwendung; der Benutzer muss auf die Meldung reagieren, bevor er die Arbeit in der aktuellen Anwendung fortsetzen kann.
vbSystemModal
4096
Systemmodal; alle Anwendungen werden angehalten, bis der Benutzer auf die Meldung reagiert.

Hier sind einige Beispiele:

Programm
Ergebnisse
    
     
     

In manchen Fällen wird ein Informationsfenster angezeigt, das gleichzeitig als Eingabefenster dient. Wenn beispielsweise eine Frage gestellt wird, möchten wir wissen, ob der Benutzer auf die Schaltfläche „Ja“ oder „Nein“ geklickt hat. Die Funktion msgBox gibt ein Ergebnis zurück, das wir im vorherigen Programm nicht verwendet haben. Dieses Ergebnis ist eine Ganzzahl, die die Schaltfläche angibt, auf die der Benutzer geklickt hat, um das Anzeigefenster zu schließen:

Konstante
Wert
Ausgewählte Schaltfläche
vbOK
1
OK
vbCancel
2
Abbrechen
vbAbort
3
Abbrechen
vbRetry
4
Wiederholen
vbIgnore
5
Ignorieren
vbYes
6
Ja
vbNein
7
Nein

Das folgende Programm zeigt, wie man das Ergebnis der Funktion „msgBox“ verwendet. Es wird viermal ein Fenster mit den Schaltflächen „Ja“, „Nein“ und „Abbrechen“ angezeigt. Sie reagieren wie folgt:

  1. Klicken Sie auf „Ja“
  2. Klicken Sie auf „Nein“
  3. Klicken Sie auf „Abbrechen“
  4. Schließen Sie das Fenster, ohne eine Schaltfläche zu verwenden. Das Programm zeigt, dass dies der Verwendung der Schaltfläche „Abbrechen“ entspricht.
Programm
Ergebnisse

3.4. In VBScript verwendbare Datentypen

VBScript erkennt nur einen Datentyp: den Variant. Der Wert eines Variants kann eine Zahl (4, 10,2), eine Zeichenfolge („hello“), ein Boolescher Wert (true/false), ein Datum (#01/01/2002#), die Adresse eines Objekts oder eine Sammlung all dieser Datentypen sein, die in einer als Array bezeichneten Struktur angeordnet sind.

Betrachten wir das folgende Programm und seine Ergebnisse:

Programm
Ergebnisse
4
i=4
10,2
r1=10,2
0,014
r2=0,014
c1=Hallo
01.10.02
d1=01.10.02
01.10.02
d2=01.10.02
-1
b1=True
0
b2=Falsch
v=4
v=10,2
v=Hallo
v=01.10.02
v=True

Kommentare:

  • In einer Reihe von Programmiersprachen (C, C++, Pascal, Java, C# usw.) muss eine Variable vor ihrer Verwendung deklariert werden. Bei dieser Deklaration werden der Name der Variablen und der Datentyp, den sie aufnehmen kann (Ganzzahl, Gleitkomma, Zeichenkette, Datum, Boolescher Wert usw.), angegeben. Die Deklaration von Variablen ermöglicht verschiedene Dinge:
    • den für die Variable benötigten Speicherplatz zu bestimmen, da verschiedene Datentypen unterschiedliche Speicherplatzmengen erfordern
    • die Konsistenz des Programms zu überprüfen. Wenn beispielsweise i eine Ganzzahl und c eine Zeichenkette ist, ergibt die Multiplikation von i mit c keinen Sinn. Wenn die Typen der Variablen i und c vom Programmierer deklariert wurden, kann das Programm, das für die Analyse des Codes vor der Ausführung zuständig ist, eine solche Inkonsistenz kennzeichnen.

Wie die meisten Skriptsprachen mit einem einzigen Datentyp (Perl, Python, JavaScript usw.) erlaubt VBScript die Verwendung von Variablen ohne Deklaration. Genau das wurde im obigen Beispiel getan.

  • Beachten Sie die Syntax der verschiedenen Datentypen
    • 10,2 in Zeile 10 (Dezimalpunkt, kein Komma). Beachten Sie, dass 10,2 auf dem Bildschirm angezeigt wird.
    • 1,4e-2 in Zeile 13 (wissenschaftliche Notation). Die Zahl 0,014 wird
    • [#01/10/2002#] (Zeile 26), um das Datum 10. Januar 2002 darzustellen. VBScript verwendet daher das Format #mm/tt/jjjj#, um das Datum tt des Monats mm des Jahres jjjj darzustellen
    • die Booleschen Werte true und false in den Zeilen 31 und 34. Diese beiden Werte werden jeweils durch die Ganzzahlen -1 und 0 dargestellt, wie in der Ausgabe der Zeilen 32 und 35 zu sehen ist. Wenn ein Boolescher Wert mit einer Zeichenkette verkettet wird, werden diese Werte zu den Zeichenketten „True“ bzw. „False“, wie in den Zeilen 33 und 36 gezeigt. Beachten Sie, dass der Verkettungsoperator & nicht nur zum Verketten von Zeichenketten verwendet werden kann.
  • Da einer Variablen v kein Typ zugewiesen ist, kann sie im Laufe der Zeit nacheinander Werte unterschiedlicher Typen enthalten.

3.5. L : Untertypen des Variant-Typs

Hier ist, was die offizielle Dokumentation über die verschiedenen Datentypen sagt, die ein Variant enthalten kann:

Über die einfache Unterscheidung zwischen Zahlen und Zeichenfolgen hinaus kann ein Variant zwischen verschiedenen Arten numerischer Informationen unterscheiden. Beispielsweise stellen manche numerischen Informationen ein Datum oder eine Uhrzeit dar. Wenn diese Informationen zusammen mit anderen Datums- oder Zeitangaben verwendet werden, wird das Ergebnis stets als Datum oder Uhrzeit ausgedrückt. Es gibt auch andere Arten numerischer Informationen, die von booleschen Werten bis hin zu großen Gleitkommazahlen reichen. Diese verschiedenen Kategorien von Informationen, die in einem Variant enthalten sein können, sind Untertypen. In den meisten Fällen fügen Sie Ihre Daten einfach in ein Variant ein, und es verhält sich entsprechend diesen Daten auf die am besten geeignete Weise.

Die folgende Tabelle listet die verschiedenen Untertypen auf, die in einem Variant enthalten sein können.

Untertyp
Beschreibung
Leer
Die Variante ist nicht initialisiert. Ihr Wert ist Null für numerische Variablen und eine leere Zeichenkette („“) für Zeichenfolgenvariablen.
Null
Die Variant enthält absichtlich falsche Daten.
Booles
Enthält „True“ oder „False“.
Byte
Enthält eine Ganzzahl von 0 bis 255.
Ganzzahl
Enthält eine Ganzzahl von -32.768 bis 32.767.
Währung
-922.337.203.685.477,5808 bis 922.337.203.685.477,5807.
Long
Enthält eine Ganzzahl von -2.147.483.648 bis 2.147.483.647.
Single
Enthält eine Gleitkommazahl mit einfacher Genauigkeit im Bereich von -3,402823E38 bis -1,401298E-45 für negative Werte; von 1,401298E-45 bis 3,402823E38 für positive Werte.
Double
Enthält eine Gleitkommazahl mit doppelter Genauigkeit im Bereich von -1,79769313486232E308 bis -4,94065645841247E-324 für negative Werte; von 4,94065645841247E-324 bis 1,79769313486232E308 für positive Werte.
Datum (Uhrzeit)
Enthält eine Zahl, die ein Datum zwischen dem 1. Januar 100 und dem 31. Dezember 9999 darstellt.
Zeichenkette
Enthält eine Zeichenfolge variabler Länge, die auf etwa 2 Milliarden Zeichen begrenzt ist.
Objekt
Enthält ein Objekt.
Fehler
Enthält eine Fehlernummer.

3.6. C- : Den genauen Typ der in einer Variablen enthaltenen Daten ermitteln

Eine Variable vom Typ variant kann Daten verschiedener Typen enthalten. Manchmal müssen wir die genaue Beschaffenheit dieser Daten kennen. Wenn wir in einem Programm product = number1 \* number2 schreiben, gehen wir davon aus, dass number1 und number2 beide numerische Werte sind. Manchmal sind wir uns jedoch nicht sicher, da diese Werte aus einer Tastatureingabe, einer Datei oder einer anderen externen Quelle stammen können. Wir müssen dann die Art der in number1 und number2 gespeicherten Daten überprüfen. Mit der Funktion typename(var) können wir den in der Variablen var enthaltenen Datentyp ermitteln. Hier sind einige Beispiele:

Programm
Ergebnisse
var=1,type=Integer
var=two, type=String
var=True, Typ=Boolean
var=4,5,type=Double
var=11.10.01,type=Date

Eine weitere mögliche Funktion ist vartype(var), die eine Zahl zurückgibt, die den Typ der in der Variablen var enthaltenen Daten angibt:

Konstante
Wert
Beschreibung
vbEmpty
0
Leer (nicht initialisiert)
vbNull
1
Null (keine gültigen Daten)
vbInteger
2
Ganzzahl
vbLong
3
Ganze Zahl (Long)
vbSingle
4
Gleitkommazahl mit einfacher Genauigkeit
vbDouble
5
Gleitkommazahl mit doppelter Genauigkeit
vbCurrency
6
Währung
vbDate
7
Datum
vbString
8
Zeichenfolge
vbObject
9
Automatisierungsobjekt
vbError
10
Fehler
vbBoolean
11
Boolesche Variable
vbVariant
12
Variant (wird nur bei Variant-Arrays verwendet)
vbDataObject
13
Nicht-Automation-Objekt
vbByte
17
Byte
vbArray
8192
Array

Hinweis: Diese Konstanten sind in VBScript definiert. Daher können die Namen an beliebiger Stelle in Ihrem Code anstelle der tatsächlichen Werte verwendet werden.

Die obigen Informationen stammen aus der VBScript-Dokumentation. Diese sind manchmal fehlerhaft, wahrscheinlich aufgrund von Kopier- und Einfügevorgängen aus der VB-Dokumentation. Die VBScript-Funktion „vartype“ erfüllt nur einen Teil der oben beschriebenen Aufgaben.

Das vorherige Programm, umgeschrieben für „vartype“, liefert die folgenden Ergebnisse:

Programm
Ergebnisse
var=1,type=2
var=two,type=8
var=True,type=11
var=4,5,type=5
var=11.10.01,type=7

3.7. D Deklaration der vom Skript verwendeten Variablen

Wir haben erwähnt, dass es nicht zwingend erforderlich ist, die vom Skript verwendeten Variablen zu deklarieren. In diesem Fall, wenn wir schreiben:


1) somme=4
...
2) somme=smme+10

Wenn in Zeile 2 ein Tippfehler vorliegt – beispielsweise „smme“ statt „somme“ –, meldet VBScript keinen Fehler. Es geht davon aus, dass „smme“ eine neue Variable ist. Es legt diese an und verwendet sie im Kontext von Zeile 2, indem es sie auf 0 initialisiert.

Solche Fehler können sehr schwer zu finden sein. Daher ist es ratsam, die Variablendeklaration mithilfe der Anweisung option explicit am Anfang des Skripts zu erzwingen. Dann muss jede Variable vor ihrer ersten Verwendung mit einer dim-Anweisung deklariert werden:


option explicit
...
dim somme
1) somme=4
...
2) somme=smme+10

In diesem Beispiel weist VBScript darauf hin, dass in 2) eine nicht deklarierte Variable „smme“ vorhanden ist, wie im folgenden Beispiel gezeigt:

Programm
Ergebnisse
dim1.vbs(9, 1) Microsoft-Laufzeitfehler
 VBScript: Undefinierte Variable: 'smme'

Zwar sind die Variablen in den kurzen Beispielen dieses Dokuments meist nicht deklariert, doch sobald wir unsere ersten aussagekräftigen Skripte schreiben, müssen wir sie deklarieren. Die Anweisung „Option Explicit“ wird dann systematisch verwendet.

3.8. Konvertierungsfunktionen

VBScript konvertiert Variant-Daten je nach Kontext in Zeichenfolgen, Zahlen, Boolesche Werte usw. Meistens funktioniert dies gut, doch manchmal führt es zu unerwarteten Ergebnissen, wie wir später sehen werden. Daher möchten Sie möglicherweise den Datentyp des Variants „erzwingen“. VBScript verfügt über Konvertierungsfunktionen, die einen Ausdruck in verschiedene Datentypen umwandeln. Hier sind einige davon:

Cint (Ausdruck)
konvertiert Ausdruck in eine kurze Ganzzahl
Clng (Ausdruck)
konvertiert Ausdruck in eine lange Ganzzahl
Cdbl (Ausdruck)
konvertiert Ausdruck in einen Double
Csng (Ausdruck)
konvertiert Ausdruck in eine Gleitkommazahl mit einfacher Genauigkeit (single)
Ccur (Ausdruck)
konvertiert Ausdruck in eine Währung

Hier sind einige Beispiele:

Programm
Ergebnisse
var=4,Code-Typ=8,Typname=String
var=4,Code-Typ=2,Namens-Typ=Ganzzahl
var=1000000,Typcode=8,Typname=Zeichenkette
var=1000000,Typcode=3,Typname=Long
var=3,4e-5,Typcode=8,Typname=Zeichenkette
var=0,000034,Typcode=5,Typname=Double
var=3,4e-5,Typcode=8,Typname=Zeichenkette
var=0,000034,Typcode=4,Typname=Single
var=1000,45,Typcode=8,Typname=Zeichenkette
var=1000,45,Typcode=6,Typname=Währung
var=14,Typcode=2,Typname=Ganzzahl
var=14,Typcode=8,Typname=Zeichenkette
var=1000,45,Typcode=5,Typname=Double
var=1000,Typcode=2,Typname=Ganzzahl
var=1000,75,Typcode=5,Typname=Double
var=1001,Typcode=2,Typname=Ganzzahl

3.9. Über die Tastatur eingegebene Daten

Das wscript-Objekt ermöglicht es einem Skript, über die Tastatur eingegebene Daten abzurufen. Die Methode wscript.stdin.readLine liest eine Textzeile ein, die über die Tastatur eingegeben und durch Drücken der „Enter“-Taste bestätigt wurde. Diese eingelesene Zeile kann einer Variablen zugewiesen werden.

Programm
Ergebnisse

Geben Sie Ihren Namen ein: st
Hallo st

Kommentare:

  • In der Ergebnisspalte und in der Zeile [Geben Sie Ihren Namen ein: st] ist „st“ der vom Benutzer eingegebene Text.

Wenn der über die Tastatur eingegebene Text eine Zahl darstellt, wird er dennoch in erster Linie als Zeichenfolge behandelt, wie im folgenden Beispiel gezeigt:

Programm
Ergebnisse
Geben Sie eine Zahl ein: 14
Gelesene Zahl=14, Typ=Zeichenkette

Wenn diese Zahl in einer arithmetischen Operation verwendet wird, wandelt VBScript die Zeichenfolge automatisch in eine Zahl um, jedoch nicht immer. Sehen wir uns das folgende Beispiel an:

Programm
Ergebnisse
1
2
3
4
5
6
Zahl1: 3
Zahl2: 4
3+4=34
3-4=-1
3 × 4 = 12
3/4 = 0,75

In den Ergebnissen sehen wir, dass Zeile 8 des Skripts nicht wie erwartet ausgeführt wurde, da der Operator + in VBScript (leider) zwei Bedeutungen hat: die Addition zweier Zahlen oder die Verkettung zweier Zeichenfolgen (die beiden Zeichenfolgen werden miteinander verbunden). Wir haben zuvor gesehen, dass über die Tastatur eingegebene Zahlen als Zeichenfolgen gelesen wurden und dass VBScript sie bei Bedarf in Zahlen umwandelte. Dies funktionierte korrekt für die Operationen -, *, /, die nur Zahlen beinhalten können, nicht jedoch für den Operator +, der auch Zeichenfolgen beinhalten kann. Hier ging das Skript davon aus, dass wir Zeichenfolgen verketten wollten.

Eine einfache Lösung für dieses Problem besteht darin, die Zeichenfolgen sofort nach dem Einlesen in Zahlen umzuwandeln, wie in der folgenden Verbesserung des vorherigen Programms gezeigt wird:

Programm
Ergebnisse
Zahl1: 3
Zahl1=3,Typ=Zeichenkette
Zahl1=3,Typ=Long
Zahl2: 4
Zahl2=4,Typ=String
Zahl2=4,Typ=Long
3+4=7
3-4=-1
3 × 4 = 12
3/4=0,75

3.10. S Eingabe von Daten mit der Funktion inputBox

Möglicherweise möchten Sie Daten über eine grafische Oberfläche statt über die Tastatur eingeben. Verwenden Sie in diesem Fall die Funktion inputBox. Diese Funktion akzeptiert viele Parameter, aber üblicherweise werden nur die ersten beiden verwendet:

response = inputBox(message, title)

  • message: die Frage, die Sie dem Benutzer stellen
  • title (optional): der Titel, den Sie dem Eingabefenster geben
  • response: der vom Benutzer eingegebene Text. Wenn der Benutzer das Fenster geschlossen hat, ohne zu antworten, ist response eine leere Zeichenkette.

Hier ist ein Beispiel, in dem wir nach dem Namen und dem Alter einer Person fragen. Für den Namen geben wir Informationen ein und klicken auf „OK“. Für das Alter geben wir ebenfalls Informationen ein, klicken aber auf „Abbrechen“.

Programm
Ergebnisse

3.11. U n strukturierte Objekte

Mit VBScript lassen sich Objekte mit Methoden und Eigenschaften erstellen. Der Einfachheit halber stellen wir hier ein Objekt mit Eigenschaften, aber ohne Methoden vor. Nehmen wir eine Person als Beispiel. Sie hat viele Eigenschaften, die sie charakterisieren: Größe, Gewicht, Hautfarbe, Augenfarbe, Haarfarbe usw. Wir konzentrieren uns hier auf nur zwei: ihren Namen und ihr Alter. Bevor Sie Objekte verwenden können, müssen Sie die Vorlage erstellen, mit der Sie diese erstellen können. In VBScript geschieht dies mithilfe einer Klasse. Die Klasse „Person“ könnte wie folgt definiert werden:


class personne
    Dim nom,age
End class

Es ist die Anweisung [Dim name, age], die die beiden Eigenschaften der Klasse Person definiert. Um Kopien (sogenannte Instanzen) der Klasse Person zu erstellen, schreiben wir:

set personne1=new personne
set personne2=new personne

Warum nicht schreiben

personne1=new personne
personne2=new personne

Da eine Variable kein Objekt enthalten kann. Sie kann nur die Adresse des Objekts enthalten. Wenn Sie „set person1 = new person“ schreiben, geschieht Folgendes:

  1. Ein Person-Objekt wird erstellt. Das bedeutet, dass ihm Speicher zugewiesen wird.
  2. Die Adresse dieses Person-Objekts wird der Variablen person1 zugewiesen

Wir haben dann die folgende Speicheranordnung für die Variablen person1 und person2:

Bildlich gesprochen könnte man sagen, dass person1 ein Personenobjekt ist. Wir können diese bildliche Darstellung akzeptieren, wenn wir bedenken, dass person1 tatsächlich die Adresse eines Personenobjekts ist und nicht das Personenobjekt selbst.

Wir haben gesagt, dass ein Person-Objekt zwei Eigenschaften hat: name und age. Wie greifen wir auf diese Eigenschaften zu? Mit der Notation object.property, wie zuvor erläutert. Somit

bezieht sich person1.name auf den Namen von Person 1 und person1.age auf deren Alter. Hier ist ein kurzes Programm zur Veranschaulichung:

Programm
Ergebnisse
p1=(dupont,18)

Das vorherige Programm könnte wie folgt geändert werden:

Programm
Ergebnisse
name=dupont
Alter=18

Hier haben wir die Struktur with ... end with verwendet, die es uns ermöglicht, Objektnamen in Ausdrücken „herauszulösen“. Die Struktur with p1 ... end with* in den Zeilen 9–12 und 15–18 ermöglicht es uns, die Syntax .name anstelle von p1.name* und .age* anstelle von p1.age* zu verwenden. Dies vereinfacht das Schreiben von Anweisungen, in denen derselbe Objektname wiederholt verwendet wird.

3.12. Zuweisen eines Werts zu einer Variablen

Es gibt zwei Anweisungen zum Zuweisen eines Werts an eine Variable:

  1. variable=ausdruck
  2. set variable=Ausdruck

Form 2 ist für Ausdrücke reserviert, deren Ergebnis eine Objektreferenz ist. Für alle anderen Arten von Ausdrücken ist Form 1 geeignet. Der Unterschied zwischen den beiden Formen ist wie folgt:

  • In der Anweisung variable=Ausdruck erhält die Variable einen Wert. Sind v1 und v2 zwei Variablen, wird durch die Schreibweise v1=v2 der Wert von v1 der Variablen v2 zugewiesen. Dies führt zur Duplizierung eines Werts an zwei verschiedenen Stellen. Wird der Wert von v2 anschließend geändert, bleibt der Wert von v1 unverändert.
  • In der Anweisung `set variable=expression` wird `variable` die Adresse eines Objekts zugewiesen. Wenn `v1` und `v2` zwei Variablen sind und `v2` die Adresse eines Objekts `obj2` ist, weist die Schreibweise `set v1=v2` `v2` den Wert von `v1` zu, d. h. die Adresse des Objekts `obj2`. Wenn das Skript anschließend v1 und v2 manipuliert, werden nicht die „Werte“ von v1 und v2 manipuliert, sondern die Objekte, auf die v1 und v2 „zeigen“ – in diesem Fall dasselbe Objekt. Wir sagen, dass v1 und v2 zwei Verweise auf dasselbe Objekt sind, und es macht keinen Unterschied, ob man es über v1 oder v2 manipuliert. Mit anderen Worten: Das Ändern des Objekts, auf das v2 verweist, ändert auch dasjenige, auf das v1 verweist.

Hier ist ein Beispiel:

Programm
Ergebnisse
i=4
j=4
i=4
j=5
p1.Nachname=dupont
p1.Alter=18
p1.Nachname=dupont
p1.Alter=19
p2.Vorname=dupont
p2.Alter=19

3.13. E- e zur Auswertung von Ausdrücken

Die wichtigsten Operatoren zur Auswertung von Ausdrücken sind folgende:

Art der Operatoren
Operatoren
Beispiel
Arithmetik
+,-,*,/
 
  
  
  
   
Vergleich
<, <=
>, >=
=,<>
a<>b ist wahr, wenn a nicht gleich b ist
a=b ist wahr, wenn a gleich b ist
a und b können beide Zahlen oder beide Zeichenfolgen sein. Im letzteren Fall gilt string1<string2, wenn string1 in alphabetischer Reihenfolge vor string2 steht. Beim Vergleich von Zeichenfolgen stehen Großbuchstaben in alphabetischer Reihenfolge vor Kleinbuchstaben.
  
   
Logik
und, oder, nicht, XOR
Alle Operanden sind hier boolesch.
bool1 oder bool2 ist wahr, wenn bool1 oder bool2 wahr ist
bool1 und bool2 ist wahr, wenn sowohl bool1 als auch bool2 wahr sind
not bool1 ist wahr, wenn bool1 falsch ist, und umgekehrt
bool1 xor bool2 ist wahr, wenn nur einer der Booleschen Werte bool1 oder bool2 wahr ist
   
Verkettung
&, +
Es wird nicht empfohlen, den Operator + zum Verketten zweier Zeichenfolgen zu verwenden, da dies mit der Addition zweier Zahlen verwechselt werden kann. Verwenden Sie daher ausschließlich den Operator &.

3.14. C- : Steuerung der Programmausführung

3.14.1. E : Aktionen bedingt ausführen

Die VBScript-Anweisung, mit der Aktionen je nachdem ausgeführt werden, ob eine Bedingung wahr oder falsch ist, lautet wie folgt:

if Ausdruck then
    wahr-Aktion-1
    wahr-Aktion-2
    ..
sonst
    Aktion-falsch-1
    Aktion-falsch-2
    ...
end if
Der Ausdruck wird zuerst ausgewertet. Dieser Ausdruck muss einen booleschen Wert haben. Wenn er als wahr ausgewertet wird, werden die Aktionen im then-Block ausgeführt; andernfalls werden die Aktionen im else-Block ausgeführt, sofern vorhanden.

Hier ist ein Programm, das verschiedene Varianten der if-then-else-Anweisung demonstriert:

Programm
Ergebnisse
1
2
3
4
5
3 ist größer als 0
3 ist größer als 2
i=4
4 ist kleiner als 10
i=3

Anmerkungen:

  • In VBScript können Sie Anweisung1:Anweisung2:... : Anweisungn schreiben, anstatt eine Anweisung pro Zeile zu schreiben. Diese Funktion wird beispielsweise in Zeile 10 verwendet.

3.14.2. E- Wiederholte Ausführung von Aktionen

Schleife mit bekannter Anzahl von Iterationen

für i = Start bis Ende Schritt Schritt
    Aktionen
weiter
  1. Die Variable i wird hier als Schleifenvariable bezeichnet. Sie kann einen beliebigen Namen haben
  2. i nimmt den Wert start an
  3. Der Wert von i wird mit ifin verglichen. Wenn i <= ifin ist, werden die Aktionen zwischen for... next ausgeführt
  4. i wird um den Wert ipas erhöht (i = i + ipas)
  5. Wir kehren zu Schritt 3 oben zurück. Nach einer endlichen Anzahl von Schritten wird der Wert von i ifin überschreiten. Das Skript fährt mit der Anweisung nach next fort
  6. Wenn die Inkrementierung ipas negativ ist, ändert sich die Bedingung in Schritt 3. Die Aktionen innerhalb von for...next werden nur ausgeführt, wenn i >= ifin ist.
Sie können eine for-Schleife jederzeit mit der Anweisung exit for verlassen.
Schleife mit unbekannter Anzahl von Iterationen
do while-Bedingung
    Aktionen
Schleife
  1. Der Bedingungsausdruck wird ausgewertet. Ist er wahr, werden die Aktionen in der while...-Schleife ausgeführt
  2. Die ausgeführten Aktionen haben möglicherweise den Wert der Bedingung verändert. Der Prozess kehrt zu Schritt 1 oben zurück.
  3. Wenn der Bedingungsausdruck falsch wird, endet die Schleife
Sie können eine do-while-Schleife jederzeit mit der Anweisung exit do verlassen.

Das folgende Programm veranschaulicht diese Punkte:

Programm
Ergebnisse

i=0,array[i]=10,sum=10
i=1,array(i)=20,sum=30
i=2,array(i)=30,summe=60
i=3,array(i)=40,summe=100
i=0,array(i)=10,sum=10
i=1,array(i)=20,sum=30
i=2,array(i)=30,sum=60
i=1
i=2
i=3
i=4
i=5
i=6
i=7
i=8
i=9
i=10
i=11
i=1
i=2
i=3
i=4
i=5
i=6

Hinweis: Während der Entwicklungsphase eines Programms kommt es nicht selten vor, dass ein Programm in eine „Schleife“ gerät, d. h. niemals stoppt. Im Allgemeinen führt das Programm eine Schleife aus, deren Abbruchbedingung nicht überprüft werden kann, wie im folgenden Beispiel:


' infinite loop
i=0
Do While 1=1
  i=i+1
  wscript.echo i
Loop
 
' another of the same kind
i=0
Do While true
  i=i+1
  wscript.echo i
Loop

Wenn Sie das vorherige Programm ausführen, wird die erste Schleife niemals von selbst enden. Sie können sie zwangsweise beenden, indem Sie auf der Tastatur STRG-C drücken (halten Sie die STRG- und die C-Taste gleichzeitig gedrückt).

3.14.3. Beenden der Programmausführung

Die Anweisung ***wscript.quit n*** beendet das Programm, indem sie einen Fehlercode zurückgibt, der gleich n ist. Unter DOS kann dieser Fehlercode mit der Anweisung if ERRORLEVEL n überprüft werden, die den Wert „true“ ergibt, wenn der vom zuletzt ausgeführten Programm zurückgegebene Fehlercode >=n ist. Betrachten Sie das folgende Programm und seine Ergebnisse:

  
Start

Unmittelbar nach dem Ausführen des Programms werden die folgenden drei DOS-Befehle ausgegeben:

1
2
3
4
5
6
7
C:\>if ERRORLEVEL 5 echo 5

C:\>if ERRORLEVEL 4 echo 4
4

C: >if ERRORLEVEL 3 echo 3
3

Der DOS-Befehl 1 prüft, ob der vom Programm zurückgegebene Fehlercode >=5 ist. Ist dies der Fall, gibt er 5 aus (echo); andernfalls nichts.

Der DOS-Befehl 3 prüft, ob der vom Programm zurückgegebene Fehlercode >=4 ist. Ist dies der Fall, wird 4 ausgegeben; andernfalls nichts.

Der DOS-Befehl 5 prüft, ob der vom Programm zurückgegebene Fehlercode >=3 ist. Ist dies der Fall, gibt er 3 aus; andernfalls nichts.

Aus den angezeigten Ergebnissen lässt sich ableiten, dass der vom Programm zurückgegebene Fehlercode 4 war.

3.15. L- t Daten-Arrays in einer Variante

Ein Variant T kann eine Liste von Werten enthalten. Wir sagen dann, dass es sich um ein Array handelt. Ein Array T hat verschiedene Eigenschaften:

  • Wir greifen auf das Element i des Arrays T mit der Syntax T(i) zu, wobei i eine ganze Zahl ist, die als Index bezeichnet wird und zwischen 0 und n-1 liegt, wenn T n Elemente hat.
  • Der Index des letzten Elements des Arrays T kann mit dem Ausdruck ubound(T) ermittelt werden. Die Anzahl der Elemente im Array T ist dann ubound(T)+1. Diese Zahl wird oft als Größe des Arrays bezeichnet.
  • Eine Variable T kann mit einem leeren Array unter Verwendung der Syntax T=array() oder mit einer Folge von Elementen unter Verwendung der Syntax T=array(element0, element1, ...., elementn) initialisiert werden
  • Sie können einem bereits erstellten Array T Elemente hinzufügen. Verwenden Sie dazu die Anweisung redim preserve T(N), wobei N der neue Index des letzten Elements des Arrays T ist. Dieser Vorgang wird als Größenänderung (redim) bezeichnet. Das Schlüsselwort preserve gibt an, dass bei dieser Größenänderung der aktuelle Inhalt des Arrays erhalten bleiben muss. Fehlt dieses Schlüsselwort, wird T in der Größe angepasst und seine Elemente werden gelöscht.
  • Ein Element T(i) des Arrays T ist vom Typ variant und kann daher jeden beliebigen Wert enthalten, einschließlich eines anderen Arrays. In diesem Fall bezieht sich die Notation T(i)(j) auf das j-te Element des Arrays T(i).

Diese verschiedenen Eigenschaften von Arrays werden durch das folgende Programm veranschaulicht:

Programm
Ergebnisse
Das Array t1 hat 5 Elemente
t1(0)=1
t1(1)=-4,5
t1(2)=2
t1(3)=True
t1(4)=1/10/02
t1=1:-4,5:zwei:True:01.10.02
t1(5)=10:20:30
t1(5)(1)=20
t1=1 ~ -4,5 ~ 2
t1=:::

Kommentare

  • Hier haben wir eine Funktion namens „join“ verwendet, die weiter unten näher erläutert wird.

3.16. Deklaration von Array-Variablen

In VBScript gibt es eine weitere Möglichkeit, ein Array zu verwenden: durch die Verwendung einer Array-Variablen. Im Gegensatz zu skalaren Variablen muss eine solche Variable mit einer „dim“-Anweisung deklariert werden. Es sind verschiedene Deklarationen möglich:

  • dim array(n) deklariert ein statisches Array mit n+1 Elementen, die von 0 bis n nummeriert sind. Die Größe dieses Array-Typs kann nicht geändert werden
  • dim array() deklariert ein leeres dynamisches Array. Es muss zur Verwendung mit der redim-Anweisung in der Größe angepasst werden, genau wie bei einem Variant, das ein Array enthält
  • dim array(n,m) deklariert ein zweidimensionales Array mit (n+1)*(m+1) Elementen. Das Element (i,j) des Arrays wird als array(i,j) bezeichnet. Beachten Sie den Unterschied zu einer Variablen, bei der dasselbe Element als array(i)(j) bezeichnet worden wäre.

Warum gibt es zwei Arten von Arrays, die sich letztlich sehr ähnlich sind? Die VBScript-Dokumentation geht darauf nicht ein und gibt keinen Hinweis darauf, ob eine davon effizienter ist als die andere. Im weiteren Verlauf werden wir in unseren Beispielen fast ausschließlich Arrays innerhalb von Varianten verwenden. Es ist jedoch erwähnenswert, dass VBScript von der Sprache Visual Basic abgeleitet ist, die selbst typisierte Daten enthält (Integer, Double, Boolean usw.). Wenn wir in diesem Fall beispielsweise ein Array mit reellen Zahlen verwenden müssen, ist die Array-Variable effizienter als die Variant-Variable. Wir würden dann etwas wie dim array(1000) as double deklarieren, um ein Array mit reellen Zahlen zu definieren, oder einfach dim array() as double, wenn das Array dynamisch ist.

Hier ist ein Beispiel, das die Verwendung von Array-Variablen veranschaulicht:

Programm
Ergebnisse
Das Array t1 hat 5 Elemente
t1(0)=1
t1(1)=-4,5
t1(2)=2
t1(3)=True
t1(4)=1/10/02
t1=1:-4,5:2:True:01.10.02
Das Array t1 hat 5 Elemente
t2(0)=0
t2(1)(2)=30
t2=:::
t3(0,0)=0
t3(0,1) = 1
t3(1,0)=10
t3(1,1)=11

3.17. L : die Funktionen „split“ und „join“

Mit den Funktionen split und join können Sie eine Zeichenkette in ein Array umwandeln und umgekehrt:

  • Wenn T ein Array und car eine Zeichenkette ist, ist join(T,car) eine Zeichenkette, die durch Verknüpfung aller Elemente des Arrays T gebildet wird, wobei jedes Element durch die Zeichenkette car vom nächsten getrennt ist. Somit ergibt join(array(1,2,3),"abcd") die Zeichenkette "1abcd2abcd3"
  • Wenn C eine Zeichenkette ist, die aus einer Folge von Feldern besteht, die durch die Zeichenkette car getrennt sind, gibt die Funktion split(C,car) ein Array zurück, dessen Elemente die einzelnen Teile der Zeichenkette C sind. Somit gibt split("1abcd2abcd3", "abcd") das Array (1,2,3) zurück

Hier ist ein Beispiel:

Programm
Ergebnisse

' Konvertierung von Array zu String und umgekehrt

' Array --> Zeichenkette
array = array("eins", 2, "drei")
Zeichenkette = join(Array, ",")
wscript.echo string

' Zeichenkette --> Array
array2 = split(string, ",")
For i=0 To ubound(array2)
  wscript.echo array2(i)
Next


eins, zwei, drei
eins
2
drei

3.18. Wörterbücher

Wir können auf ein Element eines Arrays T zugreifen, wenn wir dessen Index i kennen. Der Zugriff erfolgt dann über die Notation T(i). Es gibt Arrays, auf deren Elemente nicht über einen Index, sondern über eine Zeichenkette zugegriffen wird. Ein typisches Beispiel für diese Art von Array ist ein Wörterbuch. Wenn wir die Bedeutung eines Wortes in „Larousse“ oder „Le petit Robert“ nachschlagen, greifen wir über das Wort darauf zu. Wir könnten dieses Wörterbuch als zweispaltiges Array darstellen:

Wort1
Beschreibung1
Wort2
Beschreibung2
Wort3
Beschreibung3
....
 

Wir könnten dann beispielsweise Folgendes schreiben:

dictionary("Wort1") = "Beschreibung1"

dictionary("Wort2") = "Beschreibung2"

...

Dies ähnelt der Funktionsweise eines Arrays, mit dem Unterschied, dass die Array-Indizes keine Ganzzahlen, sondern Zeichenfolgen sind. Diese Art von Array wird als Dictionary (oder assoziatives Array, Hash-Tabelle) bezeichnet, und die Zeichenfolgenindizes werden als Dictionary-Schlüssel bezeichnet. Dictionaries werden in der Welt der Informatik extrem häufig verwendet. Wir alle haben eine Sozialversicherungskarte mit einer Nummer darauf. Diese Nummer identifiziert uns eindeutig und ermöglicht den Zugriff auf Informationen über uns. Im Modell dictionary("key")="information" wäre „key“ die Sozialversicherungsnummer und „information“ wären alle Informationen, die über uns in den Sozialversicherungssystemen gespeichert sind.

In Windows gibt es ein ActiveX-Objekt namens „Scripting.Dictionary“, mit dem Sie Wörterbücher erstellen und verwalten können. Ein ActiveX-Objekt ist eine Softwarekomponente, die eine Schnittstelle bereitstellt, die von Programmen in verschiedenen Sprachen genutzt werden kann, sofern diese dem ActiveX-Objektstandard entsprechen. Das Scripting.Dictionary-Objekt kann daher von Windows-Programmiersprachen wie JavaScript, Perl, Python, C, C++, VB, VBA und anderen verwendet werden – nicht nur von VBScript.

1
Ein Scripting.Dictionary-Objekt wird mit der folgenden Anweisung erstellt
set dico=wscript.CreateObject("Scripting.Dictionary")
oder einfach
set dico=CreateObject("Scripting.Dictionary")
CreateObject ist eine Methode des WScript-Objekts, die zum Erstellen von Instanzen von ActiveX-Objekten verwendet wird. Version 2 zeigt, dass wscript ein implizites Objekt sein kann. Wenn eine Methode nicht zu einem Objekt „aufgelöst“ werden kann, versucht der WSH-Container, sie zum wscript-Objekt aufzulösen.
2
Sobald das Wörterbuch erstellt ist, können wir ihm mithilfe der add-Methode Elemente hinzufügen:
dico.add „key“,value
erstellt einen neuen Eintrag im Wörterbuch, der mit dem Schlüssel „key“ verknüpft ist. Der zugehörige Wert ist ein Variant, der beliebige Daten enthalten kann.
3
Um den mit einem bestimmten Schlüssel verknüpften Wert abzurufen, verwenden wir die Methode „item“ des Wörterbuchs:
var = dic.item("key")
oder set var = dic.item("key"), wenn der mit dem Schlüssel verknüpfte Wert ein Objekt ist.
4
Alle Schlüssel im Wörterbuch können mithilfe der Methode `keys` in einem variablen Array abgerufen werden:
keys = dic.keys
`keys` ist ein Array, dessen Elemente durchlaufen werden können.
5
Alle Werte im Wörterbuch können mithilfe der Methode `items` in ein Array-Variable abgerufen werden:
values = dic.items
`items` ist ein Array, dessen Elemente durchlaufen werden können.
6
Die Existenz eines Schlüssels kann mit der Methode `exists` überprüft werden:
dico.exists("key") ist wahr, wenn der Schlüssel „key“ im Wörterbuch vorhanden ist
7
Sie können einen Eintrag aus dem Wörterbuch (Schlüssel+Wert) mit der Methode „remove“ entfernen:
dico.remove("key") entfernt den Eintrag aus dem Wörterbuch, der mit dem Schlüssel „key“ verknüpft ist. dico.removeall entfernt alle Schlüssel, d. h., es leert das Wörterbuch.

Das folgende Programm nutzt diese verschiedenen Optionen:

Programm


' creating and using a dictionary
Set dico=CreateObject("Scripting.Dictionary")
 
' dico filling
dico.add "clé1","valeur1"
dico.add "clé2","valeur2"
dico.add "clé3","valeur3"
 
' number of elements
wscript.echo "Le dictionnaire a " & dico.count & " éléments"
 
' kEY LIST
wscript.echo "liste des clés"
cles=dico.keys
For i=0 To ubound(cles)
  wscript.echo cles(i)
Next
 
' list of values
wscript.echo "liste des valeurs"
valeurs=dico.items
For i=0 To ubound(valeurs)
  wscript.echo valeurs(i)
Next
 
' list of keys and values
wscript.echo "liste des clés et valeurs"
cles=dico.keys
For i=0 To ubound(cles)
  wscript.echo "dico(" & cles(i) & ")=" & dico.item(cles(i))
Next
 
' item search
' key1
If dico.exists("clé1") Then
    wscript.echo "La clé clé1 existe dans le dictionnaire et la valeur associée est " & dico.item("clé1")
  Else
    wscript.echo "La clé clé1  n'existe pas dans le dictionnaire"
  End If
' key4
If dico.exists("clé4") Then
    wscript.echo "La clé clé4 existe dans le dictionnaire et la valeur associée est " & dico.item("clé4")
  Else
    wscript.echo "La clé clé4  n'existe pas dans le dictionnaire"
  End If
 
' remove key 1
dico.remove("clé1")
 
' list of keys and values
wscript.echo "liste des clés et valeurs après suppression de clé1"
cles=dico.keys
For i=0 To ubound(cles)
  wscript.echo "dico(" & cles(i) & ")=" & dico.item(cles(i))
Next
 
' we do away with everything
dico.removeall
 
' list of keys and values
wscript.echo "liste des clés et valeurs après suppression de tous les éléments"
cles=dico.keys
For i=0 To ubound(cles)
  wscript.echo "dico(" & cles(i) & ")=" & dico.item(cles(i))
Next
 
' end
wscript.quit 0

Ergebnisse

Le dictionnaire a 3 éléments
liste des clés
clé1
clé2
clé3
liste des valeurs
valeur1
valeur2
valeur3
liste des clés et valeurs
dico(clé1)=valeur1
dico(clé2)=valeur2
dico(clé3)=valeur3
La clé clé1 existe dans le dictionnaire et la valeur associée est valeur1
La clé clé4  n'existe pas dans le dictionnaire
liste des clés et valeurs après suppression de clé1
dico(clé2)=valeur2
dico(clé3)=valeur3
liste des clés et valeurs après suppression de tous les éléments

3.19. Sortieren eines Arrays oder eines Dictionaries

Häufig möchte man ein Array oder ein Dictionary in aufsteigender oder absteigender Reihenfolge nach seinen Werten oder, im Falle eines Dictionaries, nach seinen Schlüsseln sortieren. Während die meisten Sprachen über Sortierfunktionen verfügen, scheint es in VBScript keine zu geben. Dies ist ein Manko.

3.20. Programmargumente

Es ist möglich, ein VBScript-Programm aufzurufen, indem man ihm Parameter übergibt, wie in:

cscript prog1.vbs arg1 arg2 .... argn

Auf diese Weise kann der Benutzer Informationen an das Programm übergeben. Wie ruft das Programm diese Informationen ab? Sehen wir uns das folgende Programm an:

Programm
Ergebnisse
C:\>cscript arg1.vbs a b c

Es gibt 3 Argumente
a
b
c

Kommentare

  • WScript.Arguments ist die Sammlung der an das Skript übergebenen Argumente
  • Eine C-Sammlung ist ein Objekt, das
    • eine „count“-Eigenschaft, die die Anzahl der Elemente in der Sammlung angibt
    • eine Methode C(i), die das i-te Element der Sammlung zurückgibt

3.21. Eine erste Anwendung: STEUERN

Wir schlagen vor, ein Programm zu schreiben, das die Steuer eines Steuerzahlers berechnet. Wir betrachten den vereinfachten Fall eines Steuerzahlers, der nur sein Gehalt angeben muss:

  • Die Anzahl der Anteile für den Arbeitnehmer wird wie folgt berechnet: nbParts = nbEnfants / 2 + 1, wenn der Arbeitnehmer unverheiratet ist, oder nbEnfants / 2 + 2, wenn der Arbeitnehmer verheiratet ist, wobei nbEnfants die Anzahl der Kinder ist.
  • Wir berechnen sein zu versteuerndes Einkommen R = 0,72 * S, wobei S sein Jahresgehalt ist
  • Wir berechnen den Familienkoeffizienten Q = R / N

Wir berechnen ihre Steuer I auf der Grundlage der folgenden Daten

12620,0
0
0
13.190
0,05
631
15.640
0,1
1.290,5
24.740
0,15
2.072,5
31.810
0,2
3.309,5
39.970
0,25
4.900
48.360
0,3
6.898,5
55.790
0,35
9.316,5
92.970
0,4
12.106
127.860
0,45
16.754,5
151.250
0,50
23.147,5
172.040
0,55
30.710
195.000
0,60
39.312
0
0,65
49.062

Jede Zeile enthält 3 Felder. Um die Steuer I zu berechnen, suchen wir nach der ersten Zeile, in der QF <= Feld1 ist. Wenn beispielsweise QF = 30000 ist, finden wir die Zeile

    24740        0.15        2072.5

Steuer I ist dann gleich 0,15*R – 2072,5*nbParts. Wenn QF so ist, dass die Bedingung QF<=field1 nie erfüllt ist, werden die Koeffizienten aus der letzten Zeile verwendet. Hier:

    0                0.65        49062

was die Steuer I = 0,65*R - 49062*nbParts ergibt.

Das Programm lautet wie folgt:

Programm

' calculating a taxpayer's tax liability
' the program must be called with three parameters: married children salary
' married: character Y if married, N if unmarried
' children: number of children
' salary: annual salary without cents

' no verification of data validity is performed, but we do
' check that there are three of them

' mandatory variable declaration
Option Explicit

' we check that there are 3 arguments
Dim nbArguments
nbArguments=wscript.arguments.count
If nbArguments<>3 Then
    wscript.echo "Syntaxe : pg marié enfants salaire"
    wscript.echo "marié : caractère O si marié, N si non marié"
    wscript.echo "enfants : nombre d'enfants"
    wscript.echo "salaire : salaire annuel sans les centimes"
    ' stop with error code 1
    wscript.quit 1
End If

' retrieve arguments without checking their validity
Dim marie, enfants, salaire
If wscript.arguments(0) = "O" Or wscript.arguments(0)="o" Then
    marie=true
Else
    marie=false
End If
' children is an integer
enfants=cint(wscript.arguments(1))
' salary is a long integer
salaire=clng(wscript.arguments(2))

' we define the data needed to calculate the tax in 3 tables
Dim limites, coeffn, coeffr
limites=array(12620,13190,15640,24740,31810,39970,48360, _
55790,92970,127860,151250,172040,195000,0)
coeffr=array(0,0.05,0.1,0.15,0.2,0.25,0.3,0.35,0.4,0.45, _
0.5,0.55,0.6,0.65)
coeffn=array(0,631,1290.5,2072.5,3309.5,4900,6898.5,9316.5, _
12106,16754.5,23147.5,30710,39312,49062)

' the number of shares is calculated
Dim nbParts
If marie=true Then
    nbParts=(enfants/2)+2
Else
    nbParts=(enfants/2)+1
End If
If enfants>=3 Then nbParts=nbParts+0.5

' we calculate the family quotient and taxable income
Dim revenu, qf
revenu=0.72*salaire
qf=revenu/nbParts

' tax calculation
Dim i, impot
i=0
Do While i<ubound(limites) And qf>limites(i)
    i=i+1
Loop
impot=int(revenu*coeffr(i)-nbParts*coeffn(i))

' the result is displayed
wscript.echo "impôt=" & impot

' leave without error
wscript.quit 0

Ergebnisse

C:\>cscript impots1.vbs o 2 200000

impôt=22504

C:\>cscript impots1.vbs o 2 20000

impôt=0

C:\>cscript impots1.vbs o 2 2000000

impôt=746064

C:\>cscript impots1.vbs n 2 200000

impôt=33388

C:\>cscript impots1.vbs n 3 200000

impôt=22504

C:\>cscript impots1.vbs

Syntaxe : pg marié enfants salaire
marié : caractère O si marié, N si non marié
enfants : nombre d'enfants
salaire : salaire annuel sans les centimes

Anmerkungen:

  • Das Programm nutzt die zuvor behandelten Themen (Variablendeklarationen, Argumente, Typkonvertierungen, Prüfungen, Schleifen, Array in einer Variablen)
  • Es überprüft nicht die Gültigkeit der Daten, was in einem echten Programm ungewöhnlich wäre
  • Nur die while-Schleife stellt eine Herausforderung dar. Es versucht, den Index i des Arrays „limits“ zu ermitteln, für den limits(i) > qf gilt, und zwar für i < ubound(limits) (d. h. hier i < 13), da das letzte Element des Arrays „limits“ nicht von Bedeutung ist. Es wurde ausschließlich hinzugefügt, damit die Prüfung [Do While i<ubound(limits) And qf>limits(i)] für i=13 durchgeführt werden kann. Der Test lautet dann 13<13 und qf>limits(13), und daher muss (in VBScript) limits(13) existieren. Beim Verlassen der while-Schleife wird der zuletzt berechnete Wert von i zur Berechnung der Steuer verwendet: [tax = Int(income * coeffr(i) - nbParts * coeffn(i))].