Klicken Sie jeweils auf die Bilder, um sie in Originalgröße anzuzeigen. Mit dem "Zurück"-Button Ihres Browsers kehren Sie zum Text zurück.
Beim Windows Script Host (WSH) handelt es sich nicht um eine Programmiersprache, sondern um einen Interpreter. Der WSH ist also eine Plattform, die Ihnen die Möglichkeit bietet, Scripts in verschiedenen Sprachen so auszuführen, dass sie mit Windows zusammenarbeiten, also auf Windows-Funktionen zugreifen und diese ausführen können.
Die Programmiersprachen, in denen diese Scripts abgefasst sein können, werden durch DLLs bereitgestellt: Wollen Sie eine Sprache mit dem Windows Script Host verwenden, muss die entsprechende DLL installiert sein. Standardmäßig finden Sie DLLs für VBScript und JScript auf Ihrem System. Sie können also diese Sprachen sofort einsetzen. Über zusätzliche DLLs lassen sich Sprachen anderer Hersteller nutzen.
VBScript, JScript und andere Sprachen wie Perl, die sich in den WSH integrieren lassen, bezeichnet man besser als Script- statt als Programmiersprachen. Anders als bei Compilern, etwa für C++ oder Pascal, generieren Sie aus einem WSH-Script keine EXE-Datei. Jedes Script wird Schritt für Schritt abgearbeitet. Demzufolge können Sie die Scripts auch nicht direkt ausführen, wie das etwa mit EXE- oder Batchdateien möglich ist. Im Windows-Explorer merken Sie davon allerdings nichts - nach einem Doppelklick auf ein Script startet es. Der Grund: Die Scripts sind mit dem Programm WSCRIPT.EXE verknüpft. Dieses lädt die Scripts und führt sie dann aus. Haben Sie dagegen ein Fenster der Eingabeaufforderung geöffnet, können Sie etwa das Script BEISPIEL.VBS nicht direkt durch Aufruf seines Namens starten. Hier verwenden Sie den Befehl
wscript beispiel.vbs
Für das Ausführen von Scripts steht neben WSCRIPT.EXE auch CSCRIPT.EXE zur Verfügung. Dieses Programm leistet das Gleiche, gibt aber Status- und Fehlermeldungen nicht in einer Dialogbox, sondern in einem Textfenster aus. Daher eignet es sich besser zum Einsatz innerhalb eines Eingabeaufforderungs-Fensters als WSCRIPT.EXE. Außerdem sparen Sie sich während der Entwicklung eines Scripts damit das Wegklicken der Fehlermeldungen.
Die Scripts aus diesem Artikel basieren auf den Windows Script Host 5.6, den Sie mit dem IE 6 bekommen. Bei Windows XP ist es schon enthalten. Wenn Sie nicht genau wissen, welche VBScript-Version Sie haben, führen Sie das Script VERSION.VBS aus. Für die Anzeige der WSH-Version genügt ein einzeiliges VBScript mit der folgenden Zeile
WScript.Echo "WSH-Version:", WScript.Version
Falls Sie den Internet Explorer nicht installieren oder weiter mit einer älteren Version arbeiten wollen: Die VB- und JScript-Versionen 5.6, sowie umfangreiche Dokumentationen finden Sie unterhttp://microsoft.com/germany/scripting. Klicken Sie auf dieser Seite auf den Link Windows Script 5.6 freigegeben. Unter Windows 2000 installieren Sie SCRIPTDE.EXE, unter allen älteren Versionen SCR56DE.EXE. Für alle Betriebssysteme sollten Sie die Dokumentation SCD56DE.EXE installieren.
Version der Windows-Script-Umgebung: Über das Script VERSION.VBS erfahren Sie, ob Ihr System auf dem aktuellen Stand ist |
Standardmäßig unterstützt der Windows Script Host VBScript und JScript. Im Prinzip können Sie beide Sprachen gleichermaßen verwenden, und sich für eine konkrete Programmieraufgabe diejenige heraussuchen, die jeweils am besten passt. Haben Sie bereits Programmiererfahrungen? VBScript ist sehr an VBA orientiert, das heißt: Wenn Sie fit in der Programmierung von Office-Makros sind, ist der Umstieg einfach. Haben Sie dagegen schon mit C++, Java oder Javascript gearbeitet, bietet es sich an, JScript einzusetzen - vieles ist hier ähnlich.
Beginnen Sie eben erst mit dem Programmieren, sollten Sie vor der Entscheidung für eine Sprache bedenken, für welchen Zweck Sie Scripts schreiben wollen: Möchten Sie sie unter Windows einsetzen, empfehlen wir VBScript, weil es leichter zu erlernen ist und Sie mehr Literatur dazu finden. Erstellen Sie dagegen Scripts für Ihre Homepage, ist JScript die bessere Wahl. Es ist primär für den Einsatz auf Web-Seiten konzipiert - und schließlich wollen Sie ja auch Netscape-Benutzer nicht außen vor lassen.
Theoretisch benötigen Sie nur den Windows-Editor, um Scripts zu verfassen. Testen können Sie ein Script per Doppelklick auf das zugehörige Icon im Windows-Explorer. Dabei handelt es sich allerdings um die unkomfortabelste aller denkbaren Varianten. Wenn Sie beim Ausführen eines Scripts einen Fehler angezeigt bekommen, müssen Sie erst umständlich die Nummer der Zeile suchen, in der der Fehler auftrat. Auch bietet dieser Editor keinerlei Zusatzfunktionen, die das Programmieren unterstützen. Sie sollten sich - so unsere Empfehlung - deshalb umsehen, was an Free- und Shareware-Editoren für das Programmieren geboten wird.
Proton ist ein Beispiel für einen Editor, den wir guten Gewissens empfehlen können (deutschsprachige Freeware, http://meybohm.de, 570 KB). Ein wichtiges Merkmal, das dieser Programmiereditor bietet, ist das Syntax-Highlighting. Schlüsselwörter, zusammengehörige Klammern und bestimmte Textelemente, etwa Kommentare oder auszugebende Meldungen, werden dabei durch unterschiedliche Farben gekennzeichnet. Außerdem können Sie ein Script per Menübefehl aus dem Editierfenster heraus starten, so müssen Sie nicht ständig zwischen dem Editor und dem Explorer-Fenster hin- und herschalten.
Die einfachste Variante eines Scripts besteht aus einer einzigen Zeile. Legen Sie im Windows-Explorer eine Datei mit der Endung VBS an, und öffnen Sie diese im Editor. Hier schreiben Sie
MsgBox "Hallo Welt!"
und speichern Ihr Werk. Nach einem Doppelklick auf das fertige Script werden Sie von einer Dialogbox mit dem Inhalt "Hallo Welt!" begrüßt.
Über die Arbeit mit dem WSH sagt dieses Beispiel allerdings noch wenig aus, es gibt nur eine VBScript-Funktion namens MsgBox, die eine Dialogbox aufrufen kann. Der Windows Script Host und seine Funktionen werden hier nicht verwendet. Mit JScript funktioniert dieser Aufruf deshalb nicht in dieser Form: Eine entsprechende Funktion gibt es zwar, doch benötigt JScript immer ein übergeordnetes Programm, innerhalb dessen es seine Funktionen ausführt. Ein JScript innerhalb eines HTML-Dokuments kann also durchaus mittels eines Einzeilers eine Dialogbox aufrufen, wenn das HTML-Dokument in einem Browser angezeigt wird. Diese Dialogbox gehört dann zum Internet Explorer. Ein Aufruf aus Windows heraus funktioniert dagegen nicht.
Wie bereits erwähnt, bietet der Windows Script Host jedoch eine Schnittstelle zu den Windows-Funktionen, die unabhängig von der verwendeten Programmiersprache zur Verfügung steht.
Der folgende Zweizeiler in JScript erzeugt mit Hilfe des WSH eine Dialogbox, die auch beim direkten Aufruf aus dem Explorer heraus funktioniert:
var nachricht = WScript.CreateObject("WScript.Shell"); nachricht.popup("Hallo Welt!");
Schreiben Sie diese beiden Zeilen in eine Datei, und speichern Sie sie mit der Namensendung JS. Wenn Sie sie nun mit einem Doppelklick aus dem Explorer aufrufen, erhalten Sie wieder die gewünschte Dialogbox.
Als VBScript sieht das Ganze bei analoger Vorgehensweise so aus:
Dim ausgabeset ausgabe = WScript.CreateObject("WScript.Shell") ausgabe.popup "Hallo Welt!"
Sie führen es aus, indem Sie den Text in eine Datei mit der Endung VBS übernehmen, speichern und anschließend wieder im Explorer per Doppelklick starten. Die beiden Scripts finden Sie unter HALLO.JS beziehungsweise HALLO.VBS.
Obwohl die Sprachen VBScript und JScript unterschiedlich strukturiert sind, erkennen Sie Gemeinsamkeiten: Es tauchen jeweils die Schlüsselwörter "WScript.CreateObject", "WScript.Shell" und ".popup" auf. Hier handelt es sich um Objekte und Methoden des Windows Script Host, der den Aufruf der Dialogbox mittels Windows-Funktionen zur Verfügung stellt. Das sehen Sie auch an den Dialogboxen selbst: Ihre Titel signalisieren jeweils, woher die Dialogbox stammt. Während bei der ersten Ausgabe die Titelzeile "VBScript" lautet, steht dort bei den beiden folgenden Scripts "Windows Script Host". In allen Dialogbox-Varianten kann man den Titel im Script auch ändern; wir haben das hier unterlassen, um den Unterschied deutlich zu machen.
Dreimal "Hallo Welt!": Für die erste Ausgabe verwenden wir einmal VBScript sowie zweimal den Windows Script Host in Zusammenarbeit mit VBScript und JScript |
Die WSH-Objekte stehen für jede unterstützte Script-Sprache zur Verfügung. Was in einer Dialogbox steht, kann genauso gut aus einer VBScript- beziehungsweise JScript-Funktion oder einer anderen Quelle stammen.
Im folgenden Beispiel setzen wir die Ausgabe in einer Dialogbox aus normalem Text und einer Script-Sprachen-Funktion zusammen. Als Funktion haben wir die Ermittlung des aktuellen Datums gewählt. In VBScript sieht das so aus:
Dim ausgabe Dim heute set ausgabe = WScript.CreateObject("WScript.Shell") heute = Date ausgabe.popup "Heute ist der " & heute, 0,"Aktuelles Datum"
Das analoge JScript hat folgende Form:
var nachricht = WScript.CreateObject("WScript.Shell"); var heute = new Date(); nachricht.popup("Heute ist " + heute.toLocaleDateString(), 0, "Aktuelles Datum");
Wenn Sie beide Scripts ausführen, bemerken Sie eine leicht unterschiedliche Ausgabe: Die JScript-Funktion liefert auch den Wochentag. Bei beiden Scripts wird nämlich der WSH verwendet, um die Dialogbox zu erzeugen, die Datumsfunktion aber stammt jeweils aus der Script-Sprache. Die Scripts finden Sie unter HEUTE.VBS beziehungsweise HEUTE.JS.
Das aktuelle Datum: Die Dialogbox stammt von Windows Script Host, das Datum ermittelt jeweils die benutzte Script-Sprache |
Genug der vorgefertigten Beispiele, nun wollen Sie selbst programmieren. Sie sollten sich jetzt für eine Script-Sprache entscheiden: VBScript oder JScript. (Natürlich können Sie auch mehrgleisig fahren und die Sprachen parallel erlernen.) Anhand unserer (kleineren) Testscripts können Sie dann Ihr Wissen testen und ein fertiges Script aus der ursprünglichen in die andere Sprache übersetzen. Bei größeren Projekten hat das allerdings keinen Sinn mehr. Wir haben uns für diese Einführung für VBScript entschieden, da diese am bequemsten zu benutzen ist - alle Beispiele sind in dieser Sprache geschrieben.
Variablen haben Sie in den vorangegangenen Beispielen bereits kennen gelernt. Einer Variablen weisen Sie innerhalb eines Scripts einen Namen zu. Diese Werte lassen sich später selbstverständlich verändern: Indem der Inhalt einer Variablen aktualisiert wird, erhalten Sie nach Ablauf eines Scripts neue Informationen.
Sobald Sie eine Variable zum ersten Mal innerhalb eines Scripts erwähnen und ihr einen Wert zuweisen, ist sie definiert. Das geht etwa durch die Zeile
x = 0
Danach können andere Teile Ihres Scripts darauf zugreifen. Dabei können sie etwa den ursprünglichen Wert "0" verändern, diesen auslesen, weiterverwenden und so weiter. Es ist gebräuchlich, am Anfang eines Scripts alle verwendeten Variablen mit dem VBScript-Befehl "Dim" zu deklarieren, also zum Beispiel die Variable "x" mit
Dim x
"x" ist dann vorhanden.
Die Übersicht aller verwendeten Variablen erleichtert die Lesbarkeit eines Scripts erheblich, besonders wenn es einen größeren Umfang besitzt. Mit der Zeile
Option Explicit
vor den "Dim"-Anweisungen verpflichten Sie sich selbst, aller Variablen zu deklarieren, bevor Sie sie erstmals verwenden. Wenn Sie wie beim Beispiel oben nachträglich eine Variable einführen, erhalten Sie eine Fehlermeldung. Das mag wie eine Einschränkung aussehen, erspart in der Regel jedoch viel Zeit bei der Fehlersuche.
Variablen eines Scripts haben nur Gültigkeit, solange das Script läuft. Danach verschwinden sie aus dem Speicher. Mit den Environment-Variablen von Windows haben sie nichts zu tun.
VBScript können Sie durch Objekte und deren Methoden erweitern - das haben wir auch schon in den einführenden Beispielen getan. Diese Erweiterungen gehören entweder zur Script-Sprache und/oder werden von außerhalb, etwa vom Windows Script Host, bereitgestellt. Zusätzlich können andere Anwendungen auf Ihrem Rechner Objekte zur Verfügung halten. Unter einem Objekt im programmiertechnischen Sinn versteht man irgendein Element der Software des Rechners plus der Information, was man damit anstellen kann. Der letzte Punkt ist wichtig - eine Datei beispielsweise stellt kein Objekt dar. Die Information darüber, welche Operationen mit allen Elementen möglich sind, die das Kriterium "Datei" erfüllen, dagegen schon. Das wären beispielsweise Kopieren, Verschieben, Ermitteln des Pfadnamens, Öffnen, Lesen, Schreiben und noch viele weitere. Sobald Sie ein Objekt vom Typ "Datei" innerhalb Ihres Scripts anmelden anmelden, stehen auch alle diese Operationen zur Verfügung. Sie werden Methoden dieses Objekts genannt. In VBScript gibt es allerdings kein Objekt "Datei". Stattdessen stellt VBScript das allgemeinere Objekt "Scripting.FileSystemObject" zur Verfügung. Es umfasst nicht nur Dateien, sondern zusätzlich alles, was zu einem Dateisystem gehört: Ordner, spezielle Systemordner und Laufwerke. Welche Methoden zu einem Objekt gehören, erfahren Sie aus den Scripting-Dokumentationen von Microsoft (siehe Abschnitt Das Werkzeug).
So verwenden Sie ein Objekt: Mit Hilfe des VBScript-Befehls "Set" erlangen Sie Zugriff auf das Objekt, indem Sie ihm einen Variablennamen zuweisen, beispielsweise mit der Zeile
Set MyFiles = CreateObject("Scripting.FileSystemObject")
Beim Umgang mit Objekten empfiehlt es sich stets, den eigenen Variablennamen einen Zusatz "My..." oder "Mein..." voranzustellen. So vermeiden Sie es, versehentlich einen Namen zu wählen, der bereits für ein Objekt oder eine Methode vergeben wurde. Das würde zu Fehlern im Script führen, die sich nur schwer aufspüren ließen.
Sie besitzen durch diese Deklaration jetzt ein Objekt "MyFiles". In der VBScript-Dokumentation können Sie nun unter "Scripting-Laufzeitreferenz, Methoden" nachlesen, welche Methoden Ihnen damit zur Verfügung stehen. Als Beispiel nehmen wir die Methode "GetSpecialFolder'", die Informationen über die Lage des Windows-, des System- und des TEMP-Verzeichnisses liefern kann. In der Dokumentation erfahren Sie, dass diese Methode das Windows-Verzeichnis ermittelt, wenn sie mit dem Argument "0" aufgerufen wird. Die entsprechende Befehlszeile lautet also:
Set MyWinDir = MyFiles.GetSpecialFolder(0)
Das folgende Script WINDIR.VBS ermittelt Ihr Windows-Verzeichnis und gibt es anschließend in einer Dialogbox aus:
Option Explicit Dim MyFiles, MyWinDir Set MyFiles = CreateObject("Scripting.FileSystemObject") Set MyWinDir = MyFiles.GetSpecialFolder(0) WScript.Echo "Das Windows-Verzeichnis auf diesem Rechner ist " & MyWinDir
Eine nützliche Anwendung in einem Script ist es etwa, das Windows-Verzeichnis vom Script ermitteln zu lassen und beispielsweise unter dem Namen "MyWinDir" anzusprechen. So können Sie Ihre Scripts an andere Benutzer weitergeben, unabhängig davon, in welchem Pfad deren Windows-Installation liegt. Das Gleiche gilt natürlich auch für die anderen oben genannten Ordner, wie System- oder TEMP-Verzeichnis.
Die Dokumentation der zum Windows Script Host und den unterstützten Script-Sprachen gehörenden Objekte und deren Methoden sind fürs Erste eine sehr ergiebige Schlechtwetterlektüre. Besonderes Augenmerk sollten Sie auf das Objekt "WScript.Shell" haben. Es bietet eine Schnittstelle zu allen Funktionen, die den Windows-Desktop betreffen, inklusive der Bearbeitung der Registry.
So arbeiten Sie mit Objekten: Über "Scripting.FileSystemObject" ermittelt WINDIR.VBS das Windows-Verzeichnis des PCs, auf dem es läuft |
An jeder Stelle Ihres Scripts können Sie die weitere Verarbeitung davon abhängig machen, ob eine bestimmte Bedingung erfüllt ist. Dies geschieht mittels der Schlüsselwörter "If", "Then" und "Else". Hinter "If" tragen Sie eine Bedingung ein. Ist sie erfüllt, setzt das Script seine Arbeit bei den Anweisungen fort, die hinter dem Schlüsselwort "Then" stehen. Ist sie nicht erfüllt, macht es bei den Anweisungen hinter "Else" weiter. Jede "If...Then"- Verzweigung muss mit dem Befehl "End If" abgeschlossen werden. Alle Befehle, die danach folgen, gehören nicht mehr in die Verzweigung und sind von der gesetzten Bedingung unabhängig. Das Script NUMERIC.VBS etwa prüft, ob der Benutzer eine Zahl eingeben hat:
Option Explicit Dim MyNumber MyNumber = InputBox("Bitte geben Sie eine Zahl ein") if IsNumeric(MyNumber) then MsgBox "Eingegebene Zahl: " & MyNumber, 64 else MsgBox "Das war keine Zahl.", 48 end if
Der "Else"-Teil ist keine Pflicht: Lassen Sie ihn weg, fährt das Script bei Nichterfüllung der Bedingung hinter "End If" fort; bei ihrer Erfüllung arbeitet es erst den "Then"-Teil ab und anschließend die Anweisungen hinter "End If".
Eine besondere Form der Verzweigung stellt die "Case"-Anweisung dar. Sie erlaubt etwa die Auswahl aus mehreren angebotenen Zahlenwerten. Ein Beispiel sehen Sie im Script AUSWAHL.VBS:
Option Explicit Dim MyNumber, Ausgabe MyNumber = InputBox("Bitte geben Sie als Auswahl die Zahl 1, 2 oder 3 ein") if IsNumeric(MyNumber) then Select Case MyNumber Case 1 Ausgabe = "die Zahl Eins" Case 2 Ausgabe = "die Zahl Zwei" Case 3 Ausgabe = "die Zahl Drei" Case Else Ausgabe = "keine der vorgegebenen Zahlen" End Select else Ausgabe = "gar keine Zahl" end if MsgBox "Sie wählten " & Ausgabe & chr(46)
Die "Case"-Verzweigung ist hier Bestandteil einer "If"-Schleife. Bei solchen verschachtelten Bedingungen sollten Sie im Editor mit Hilfe der <Tab>-Taste konsequent kenntlich machen, zu welcher Ebene jeweils ein Anweisungsblock gehört. Sonst verlieren Sie beim Programmieren schnell den Überblick.
Um Aufgaben in einem Script mehrfach auszuführen, benutzen Sie Schleifen. VBScript bietet davon mehrere Arten an, die sich für verschiedene Einsatzzwecke eignen. Alle Schleifen beginnen und enden mit bestimmten Schlüsselwörtern. Alle dazwischen liegenden Befehle gehören zu der Schleife. Die einzelnen Schleifenarten sind nach den verschiedenen Schlüsselwortpaaren benannt. Eine "For Each...Next"-Schleife läuft so lange, bis alle Elemente eines Objektes abgearbeitet sind. Diese Elemente können beispielsweise alle Dateien eines bestimmten Ordners sein. Das folgende Script Listwindir.VBSgibt über eine solche Schleife alle Dateien aus, die sich im Windows-Verzeichnis befinden:
Option Explicit Dim MyFiles, MyWinDir, AllFiles, AllFilesItem, Output Set MyFiles = CreateObject("Scripting.FileSystemObject") Set MyWinDir = MyFiles.GetSpecialFolder(0) Set AllFiles = MyWinDir.Files For Each AllFilesItem in AllFiles Output = Output & AllFilesItem.Path & ", " next WScript.Echo "Dateien in " & MyWinDir & ":" & chr(13) & Output
Bei der verwandten "For...Next"-Schleife geben Sie selbst an, wie oft eine Schleife durchlaufen werden soll. Das geschieht in der Form:
For zaehler = 0 to 100 <zu wiederholende Script-Befehle> Next
Innerhalb beider For-Schleifen lässt sich mit der Anweisung "Exit For" das sofortige Verlassen der Schleife auslösen. Das Script setzt dann mit der ersten Anweisung fort, die nach dem Schlüsselwort "Next" steht. In der Praxis wird die "Exit for"-Anweisung natürlich nicht einfach so in der Schleife stehen, sondern an eine Bedingung geknüpft sein.
Eine weiterer wichtiger Typ ist die "Do...Loop"-Schleife. Sie führt Anweisungen so oft aus, bis eine bestimmte Bedingung erfüllt ist. Ein Beispiel: Das folgende Script LISTAUTO.VBS liest die Datei AUTOEXEC.BAT zeilenweise aus, bis das Ende der Datei erreicht ist.
Option Explicit Dim MyFile, Lines Set MyFile = CreateObject("Scripting.FileSystemObject") Set Lines = MyFile.OpenTextFile("C:\autoexec.bat") Do WScript.Echo Lines.ReadLine Loop Until Lines.AtEndOfStream
Das Schlüsselwort "Until" stellt die Bedingung dar, bei der die Schleife verlassen wird. Statt "Until" ist auch "While" erlaubt: In diesem Fall wird die Schleife erst dann verlassen, wenn eine bestimmte Bedingung nicht mehr erfüllt ist. In der oben stehenden Form werden die Anweisungen in der Schleife auf jeden Fall mindestens einmal ausgeführt, erst dann wird die Bedingung geprüft. Die Bedingung kann jedoch auch vor den Anweisungen stehen, und zwar unmittelbar hinter dem Schlüsselwort "Do". Dann ist bereits die erste Ausführung des Schleifeninhalts von der Erfüllung der Bedingung abhängig.
Jede "Do...Loop"-Schleife lässt sich mit der Anweisung "Exit Do" sofort verlassen. Das Script setzt dann mit der ersten Anweisung fort, die nach dem Schlüsselwort "Loop" steht. Auch die "Exit Do"-Anweisung sollte sinnvollerweise an eine Bedingung geknüpft sein.
In einem elegant - sprich übersichtlich - geschriebenen Script sollte es niemals vorkommen, dass Sie ein Stück Code wiederholen müssen. Anweisungsblöcke, die Sie an mehreren Stellen Ihres Scripts benötigen, sind besser in einem Unterprogramm aufgehoben. So brauchen Sie sie nur einmal zu programmieren. Unterprogramme erhalten einen Namen, unter dem sie vom Hauptscript aus aufgerufen werden. Je charakteristischer Sie den Namen wählen, desto einfacher erkennen Sie auch später noch, was in Ihrem Script eigentlich geschieht.
Unterprogramme können Sie auf zwei Arten definieren - über die Befehle "Sub" oder "Function". Der Unterschied: Über Function lässt sich ein Wert zurückgeben, über Sub nicht. Müssen Sie in einem Script mehrfach auf das Windows-Verzeichnis zugreifen, empfiehlt es sich beispielsweise, das unter Objekte und Methoden vorgestellte Script WINDIR.VBSals Unterprogramm zu verwenden. Da es den wirklichen Pfadnamen zurückgeben soll, ist hier eine Function vonnöten.
Das Script FUNCTION.VBS demonstriert den Einsatz eines Unterprogramms:
Option Explicit MsgBox "Das Windows-" + chr(13) + "Verzeichnis " + chr(13) + "auf diesem PC ist " & WinDir Function WinDir
Dim MyFiles, MyWinDir Set MyFiles = CreateObject("Scripting.FileSystemObject") Set MyWinDir = MyFiles.GetSpecialFolder(0) WinDir = MyWinDir End Function
Obwohl dieses Script nicht mehr tut als das ursprüngliche WINDIR.VBS, ist es anders aufgebaut. Das Hauptprogramm besteht nur aus der Anweisung "MsgBox", welche die Ausgabe veranlasst. Innerhalb der Anweisung "MsgBox" taucht die Funktion "WinDir" auf, die es eigentlich in VBScript nicht gibt, die aber weiter unten zwischen "Function" und "End Function" definiert wird. Entscheidend dafür, dass eine Function einen Wert zurückgibt, ist eine Anweisung wie in der vorletzten Zeile: Dem Funktionsnamen muss das zurückzuliefernde Ergebnis übergeben werden, als ob er eine Variable wäre. Innerhalb einer Function oder Sub können eigene Deklarationen für Variablen stehen. Diese Variablen existieren nur innerhalb der Function beziehungsweise Sub, ihre Namen lassen sich also auch in anderen Functions und Subs verwenden. Die Variablen stören sich dabei gegenseitig nicht: Es ist ja jeweils nur eine Function beziehungsweise Sub aktiv. So müssen Sie sich nicht mit einer jeweils unterschiedlichen Benennung der Zähl-Variablen abplagen, wenn Sie mehrere Functions oder Subs anlegen, die jeweils Schleifen beinhalten. Im Hauptprogramm dürfen Sie diese Variablen aber nicht gleichzeitig verwenden.
Entweder gibt es sie hier nicht, da sie ja nur in der Function beziehungsweise Sub deklariert wurden. Oder Sie deklarieren sie im Hauptprogramm - dann sind sie für das gesamte Script gültig und können in der Function beziehungsweise Sub nur mitverwendet, jedoch nicht eigens deklariert werden. Wenn Sie Variablen nur innerhalb eines Unterprogramms benötigen, ist es eleganter, sie nur dort zu deklarieren. Soll ein Unterprogramm nur eine bestimmte Bildschirmausgabe liefern und sonst nichts tun, bietet sich eine Sub an - schließlich benötigen Sie dazu keinen Rückgabewert.
Natürlich könnten Sie einfach trotzdem eine Function verwenden, deren Rückgabewert Sie im Hauptprogramm nicht beachten. Die Unterscheidung zwischen "Sub" und "Function" dient also mehr Ihrer eigenen Übersicht.
Zwar erfüllt das vorgestellte Script FUNCTION.VBS allein keinen großen Zweck, Sie können jedoch den Text zwischen "Function" und "End Function" per Copy&Paste in jedes Script einbauen, in dem Sie mal eben die Lage des Windows-Verzeichnisses in Erfahrung bringen wollen.
Scripts lassen sich nicht nur lokal auf Ihrem Rechner verwenden - Sie können sie auch in Web-Seiten einbinden, um Besuchern einen aktiven Inhalt zu bieten. Dabei gelten jedoch starke Einschränkungen. Aus Sicherheitsgründen dürfen Scripts natürlich weder auf das Dateisystem des fremden Rechners zugreifen noch auf Funktionen wie die Steuerung des Desktops, das Starten von Programmen, das Auslesen oder Schreiben von Dateien und so weiter. Sind die üblichen Sicherheitseinstellungen aktiviert, ist das auch gar nicht möglich.
Sowohl die Objekte des Windows Script Hosts als auch VBScript-Objekte wie "Scripting.FileSystemObject" stehen also nicht zur Verfügung. Harmlos - und somit erlaubt - ist dagegen die Anzeige von Informationen, solange sie nicht von der Festplatte des Besuchers stammen. Zu diesen Informationen zählt beispielsweise die unter Zugriff auf Funktionen bereits beschriebene Datumsanzeige. In HTML eingebettet, sieht ein entsprechendes VBScript so aus:
<HTML> <HEAD><TITLE>Ausgabe des Datums</TITLE> <SCRIPT LANGUAGE="VBScript"> <!-- Sub Button1_OnClick Dim heute heute = Date MsgBox "Heute ist der " & heute, 0,"Aktuelles Datum" End Sub --> </SCRIPT> </HEAD> <BODY> <H3>Ausgabe des heutigen Datums</H3><HR> <FORM><INPUT NAME="Button1" TYPE="BUTTON" VALUE="Aktuelles Datum ausgeben (Klick)"></FORM> </BODY> </HTML>
Sie finden dieses HTML-Beispiel unter DATEVBS.HTML. Hier gibt es kein Hauptprogramm im klassischen Sinn. Das ist auch nicht nötig - der Internet Explorer fungiert als übergeordnetes Programm und ruft die Datumsausgabe als Sub auf, wenn der entsprechende Button aktiviert wird. Mit VBScript erreichen Sie allerdings nur Benutzer des Internet Explorers, was ein wenig unfreundlich ist. Sie sollten deshalb einer JScript-Version den Vorzug geben (DATEJS.HTML):
<HTML> <HEAD><TITLE>Ausgabe des Datums</TITLE> <SCRIPT LANGUAGE="JavaScript"> <!-- function datum(){ var heute = new Date(); window.alert ("Heute ist " + heute.toLocaleDateString(), 0,"Aktuelles Datum"); } //--> </SCRIPT> </HEAD> <BODY> <H3>Ausgabe des heutigen Datums</H3><HR> <FORM><INPUT NAME="Button1" TYPE="BUTTON" onClick="datum()" VALUE="Aktuelles Datum ausgeben (Klick)"></FORM> </BODY> </HTML>
Auch hier fehlt ein eigentliches Hauptprogramm, die Funktion "datum()" wird ebenfalls vom Browser aufgerufen, wenn der Anwender den entsprechenden Button aktiviert. In beiden Fällen ist der Windows Script Host am Abarbeiten der Scripts nicht beteiligt. Als Interpreter dafür fungiert der Internet Explorer.
Scripts in HTML-Dateien: Der Internet Explorer kann sowohl JScript als auch VBScript verarbeiten, für Netscape und Mozilla eignet sich nur JScript |
HTML-Seiten mit eingebundenen Scripts lassen sich nicht nur im Internet, sondern auch lokal am Rechner vielseitig nutzen. Unser Artikel enthält dafür eine Reihe von Beispielen. Für diesen Verwendungszweck kennt Windows einen eigenen Dateityp, die HTML-Applikation. Benennen Sie einfach eine der HTML-Dateien aus dem vorigen Abschnitt so um, dass sie die Endung HTML durch HTA ersetzen und starten Sie deise mit einem Doppelklick. Das Internet-Explorer-Fenster öffnet sich ohne Adress- und Statuszeile, Menü und Symbolleisten; nur der Inhalt erscheint. Eine HTML-Applikation ist nicht von den Sicherheitseinstellungen betroffen: Jeder innewohnende Code wird ohne Rückfrage ausgeführt. Eine HTA-Datei ist also ein HTML-Konstrukt, das von Windows wie eine EXE-Datei behandelt wird. Demzufolge müssen Sie mit HTA-Dateien, die Sie von jemand anderem erhalten, genauso umgehen wie mit EXE-Dateien: Öffnen Sie nur Dateien aus Quellen, denen Sie absolut vertrauen!
Für in HTA-Dateien enthaltene Links öffnet Windows stets ein neues Browserfenster. Für diese gelten dann wieder die von Ihnen festgelegten Sicherheitseinstellungen.
Wie am Anfang des Abschnittes Objekte und Methoden bereits erwähnt, stellen sowohl der WSH als auch andere Anwendungen Objekte bereit, die Sie in Ihre Scripts einbinden und deren Methoden Sie verwenden. Damit Ihnen diese zur Verfügung stehen, mussten deren Programmierer gewisse Regeln beachten, nach denen ein Objekt innerhalb einer Windows-Installation öffentlich gemacht wird. Die DLL- oder OCX-Datei, welche die gewünschten Objekte und Methoden enthält, muss sich mit Namen, Class-ID und Namen der enthaltenen Eigenschaften und Methoden bei Windows registrieren. Dies geschieht bei der Installation des Programmes. Greift dan ein Script auf eine bestimmte Methode oder Eigenschaft zu, weiß Windows, an wen es die Anforderung weiter zu leiten hat.
Das Gleiche können Sie mit Ihrem selbst geschriebenen Code auch machen, wenn Sie bestimmte Methoden innerhalb mehrerer Scripts wieder verwenden wollen. Zum Glück ist es nicht erforderlich, dass Sie Ihre Werke zu diesem Zweck in eine DLL- oder OCX-Datei umwandeln, und sich extra zu diesem Zweck einen teuren Compiler anschaffen. Sie müssen Ihr Script lediglich in ein XML-Dokument verpacken, in dem neben dem Namen und der Class-ID auch die exportierten Eigenschaften und Methoden aufgelistet sind. Die fertige Komponente erhält die Endung WSC. Mit dem Kommando "regsvr32" registrieren Sie die WSC-Datei dann bei Windows und können deren Funktionen nutzen.
Die Formalien, denen das XML-Dokument genügen muss, und die Erstellung einer eindeutigen Class-ID nimmt Ihnen der "Windows Script Component Wizard" ab. Sie können ihn unterhttp://msdn.microsoft.com/scripting/scriptlets/wz10en.exe herunterladen. (englische Freeware, 228 kB). Wie das Ganze funktioniert, zeigt am Besten ein Beispiel. Im Abschnitt "Zugriff auf Funktionen" wurde das aktuelle datum einmal mit JScript und einmal mit VBScript ausgegeben. Die Ausgabe war leich unterschiedlich, weil die zuständige JScript-Funktion den Wochentag mit liefert, die entsprechende VBScript-Funktion dagegen nicht. Wir packen nun die Jscript-Funktion in eine Script-Komponente. Ein VBScript greift dann darauf zu, so dass Sie auch unter VBScript den Wochentag geliefert bekommen. Das Ganze sieht natürlich nicht sehr eindrucksvoll aus - eine Dialogbox mit dem Datum samt Wochentag erhalten Sie auch einfacher. Auf Grund seiner Einfachheit ist es aber zur Demonstration des Prinzips gut geeignet.
Als Erstes rufen Sie den "Windows Script Component Wizard" auf. Tragen Sie unter "Name" den Komponentennamen "myDate" ein und geben Sie unter "Location" das Verzeichnis an, in dem die Komponente erstellt werden soll. Mit "Next" wechseln Sie auf die nächste Seite. Wählen Sie oben in der Sprachenliste "JScript" aus, schalten Sie alle anderen Optionen ab, und gehen Sie so lange mittels "Next" vorwärts, bis Sie auf Seite 4 "Add Windows Script Component methods" sind. Doppelklicken Sie hier auf das Feld unter "Name" und geben Sie einen Methodennamen ein, etwa "heute". Danach klicken Sie sich vor bis zum Ende des Wizards und klicken hier auf "Finish". Das Ergebnis ist eine neue Date "myDate.wsc", die neue Script-Komponente. Diese öffnen Sie mit dem Editor. Der Wizard hat bereits dafür gesorgt, dass Name und Class-ID in der Datei festgelegt sind und dass sie die Methode "heute" exportiert. Sie müssen jetzt lediglich noch festlegen, was diese Methode denn tun soll, nämlich das aktuelle Datum liefern. Das bedeutet, Sie müssen die sich unter "function heute()" befindliche Platzhalter-Zeile
return "Temporary Value";
durch etwas Sinnvolles ersetzen, was genau dies tut. Den erforderlichen Code finden Sie bereits in DATUM.JS. Löschen Sie also die Platzhalter-Zeile und ersetzen Sie sie durch
var datum = new Date(); return datum.toLocaleDateString();
Das ist alles. Speichern Sie die Script-Komponente und melden Sie sie mit dem Befehl
regsvr32 myDate.wsc
bei Windows an. Nun können Sie von jedem anderen Script, egal in welcher Sprache dies geschrieben ist, auf die Script-Komponente zugreifen. Ein VBScript, welches das aktuelle Datum unter Benutzung von myDate.wsc ausgibt, sieht beispielsweise so aus:
Dim ausgabe Dim heute set ausgabe = WScript.CreateObject("WScript.Shell") set datum = WScript.CreateObject("MyDate.WSC") ausgabe.popup "Heute ist " & datum.heute, 0,"Aktuelles Datum"
Es entspricht fast dem ursprünglichen HEUTE.VBS, nur dass Sie ein zusätzliches Objekt "datum" aus der Script-Komponente "myDate.wsc" verwenden. Dessen Methode "datum.heute" liefert dann statt der entsprechenden VBScript-Funktion den Inhalt, den die Dialogbox ausgibt. Das VBScript finden Sie unter datum_component.vbs.
Andreas Kroschel