Der Windows Script Host

Einleitung

Oft übersehen stellt Windows in aktuellen Versionen optional die ActiveX-Komponente Windows Script Host (WSH) zur Verfügung, die Systemoperationen vereinfacht und mittels derer Informationen über das System ermittelt werden können. Der WSH bietet folgende Möglichkeiten:

Ein Großteil dieser Aufgaben kann auch mit Visual-Basic-eigenen Mitteln oder über Win32-API-Aufrufe gelöst werden.

Einbinden der Komponente

Der WSH ist in der Datei WSHom.ocx implementiert. Zur früh gebundenen Verwendung muß ein Verweis auf diese Komponente aufgenommen werden. Anschließend kann die Klasse direkt im Code verwendet werden.


' 'Wscript.Shell'.
Dim WshShell As IWshShell_Class
Set WshShell = New IWshShell_Class

' 'Wscript.Environment'.
Dim WshEnv As IWshEnvironment_Class
Set WshShell = New IWshEnvironment_Class

' 'Wscript.Network'.
Dim WshNet As IWshNetwork_Class
Set WshShell = New IWshNetwork_Class
Benutzen der WSH-Klassen über frühes Binden.

Alternativ kann die Komponente auch spät gebunden genutzt werden. In diesem Fall muß kein Verweis auf die ActiveX-Komponente gesetzt werden. Fehlt die Komponente auf dem System, führt dies zu einem Laufzeitfehler. Der Code zur spät gebundenen Verwendung könnte folgendermaßen aussehen:

Dim WshShell As Object
Set WshShell = CreateObject("Wscript.Shell")
Benutzen der WSH-Klassen über spätes Binden.

Die Deklarationen von eine Environment- und Network-Objekten wurden hier nicht angegeben, sie sehen analog aus.

In den folgenden Kapiteln wird davon ausgegangen, daß die Variable WshShell einen Verweis auf eine Instanz der Klasse Wscript.Shell enthält.

Ermitteln der Namen von Spezialordnern

Der WSH stellt eine Auflistung SpecialFolders zur Verfügung, die alle im System bekannten Namen von Spezialordnern enthält. Mittels einer Schleife können die Namen der benannten Spezialordner ermittelt werden

Dim Folder As Variant
For Each Folder In WshShell.SpecialFolders
    Debug.Print Folder
Next Folder
Auflisten der Spezialordner.

Daneben ist jeder der Ordner in der Auflistung über einen bestimmten Schlüssel vom Typ String ansprechbar. Diese Konstanten sind vordefiniert, "Fonts" würde zum Beispiel den Schriftartenordner bezeichnen und "Desktop" den Ordner, in dem sich der Desktop befindet. Um den Pfad des Desktops abzufragen, könnte man den Code WshShell.SpecialFolders("Desktop") verwenden. Dabei ist zu beachten, daß es sich beim im String-Parameter übergebenen Argument um einen Wert handeln muß. Wird stattdessen eine Variable übergeben, werden falsche Werte ermittelt. Der Wert einer Variablen kann durch Umschließen des Variablennamens mit runden Klammern im Aufruf ermittelt werden.

Lesen und Schreiben von Umgebungsvariablen

Umgebungsvariablen sind systemweit verfügbare Variablen, die Informationen über das System enthalten. Jede dieser Variablen ist über eine bestimmte Zeichenfolge ansprechbar. Diese Variablen gliedern sich in die Kategorien "SYSTEM", "USER", "VOLATILE" und "PROCESS". Der folgende Beispielcode würde alle Umgebungsvariablen aus dem Bereich "SYSTEM" ausgeben:

Dim VarName As Variant
For Each VarName In WshShell.Environment("SYSTEM")
    Debug.Print VarName
Next VarName
Auflisten der System-Umgebungsvariablen.

Das Setzen und Löschen der Variablen ist wie folgt möglich:

Dim WshEnv As Object
Set WshEnv = WshShell.Environment("VOLATILE")
WshEnv("EXAMPLE") = "A_VALUE"
Setzen einer benuzterdefinierten Umgebungsvariablen.

Hier wird eine Umgebungsvariable namens "EXAMPLE" mit dem Wert "A_VALUE" dem Abschnitt "VOLATILE" hinzugefügt. Das Löschen der Variablen erfolgt durch Aufruf der Methode Remove, beispielsweise Call WshEnv.Remove("EXAMPLE").

Die Umgebungsvariablen befinden sich in einer Auflistung und können daher auch anhand ihrer Namen abgefragt werden.

Ermitteln von Netzwerkinformationen

Informationen zum Netzwerk können über die Klasse Wscript.Network ermittelt werden, von der die Informationen in den Eigenschaften UserName, ComputerName, UserDomain, Organization, Site und UserProfile offengelegt werden. Folgendes Beispiel würde den Benutzernamen im Netzwerk ermitteln:

Dim WshNet As Object
Set WshNet = CreateObject("Wscript.Network")
Call MsgBox(WshNet.UserName)
Ermitteln des Benutzernamen im Netzwerk.

Wird eine der Eigenschaften vom System nicht unterstützt, so wird ein Fehler ausgelöst.

Anzeigen von Meldungsfeldern

Diese Funktion zeigt eine Meldung an, wobei optional ein Zeitlimit angegeben werden kann, nach dessen Ablaufen das Meldungsfeld automatisch geschlossen wird. Der Nachteil der Verwendung des WSHs zum Anzeigen von Meldungen ist, daß das Meldungsfeld einen eigenen Eintrag in der Taskleiste besitzt. Folgender Code würde eine Meldung anzeigen, die sich nach 3 Sekunden von selbst schließt:

Dim Result As Integer
Const wshClosedByWsh As Integer = -1
Result = WshShell.Popup( _
    "Where do you want to go today?" & vbNewLine & _
    vbNewLine & _
    "I will close after three seconds!", _
    3, _
    "WSH PopUp", _
    64 Or 4 _
)
If Result = wshClosedByWsh Then
    Call MsgBox("The message box has been closed by WSH.")
Else
    Call MsgBox("Return code:  " & CStr(Result))
End If
Anzeigen einer Meldung.

Das automatische Schließen ist optional; um es zu unterbinden, übergibt man als Zeitlimit der Wert 0.

Starten von Anwendungen

Auch die Win32-API bietet zahlreiche Funktionen, über die andere Anwendungen gestartet werden können. Das praktische an der Funktion des WSHs ist, daß keine Win32-API-Deklarationen erforderlich sind.

Optional kann die Anwendung im Starten-und-warten-Modus (engl. shell and wait) gestartet werden. Dabei wird die aufrufende Anwendung so lange blockiert, bis die gestartete Anwendung beendet wird. Im folgenden Beispiel wird der Texteditor mit Starten-und-warten gestartet, wobei die Datei Win.ini geöffnet wird:

Dim ReturnCode As Long
ReturnCode = _
    WshShell.Run( _
        "%windir%\notepad %windir%\win.ini", _
        SW_SHOWNORMAL, _
        True _
    )
Call MsgBox("Application return code:  " & CStr(ReturnCode))
Starten einer Anwendung mit Starten-und-warten.

Umgebungsvariablen im Pfad sind zulässig, sie werden zwischen Prozentzeichen (%) gestellt. Der Wert des zweiten Parameters gibt an, in welchem Modus das Fenster geöffnet werden soll. Es werden die Fensterstatuskonstanten der Win32-API-Funktion ShowWindow unterstützt. Diese Konstanten können der Headerdatei WinUser.h oder dem API-Viewer entnommen werden. Der letzte Parameter gibt an, ob Starten-und-warten verwendet werden soll.

Zugriff auf die Systemregistrierung

Auf die Systemregistrierung kann kann mittels der Win32-API-Funktionen aus der AdvApi32.dll zugegriffen werden. Der Zugriff wird jedoch durch Verwendung des WSH bedeutend vereinfacht. Der WSH kann Schlüssel und Werte der Typen Integer, String und Binary in der Systemregistrierung schreiben, löschen und lesen. Folgender Code schreibt beispielsweise drei Werte unter einem eigenen Schlüssel in die Systemregistrierung:

Call WshShell.RegWrite("HKCU\Test\String", "Hello World!", "REG_SZ")
Call WshShell.RegWrite("HKCU\Test\DWord", 1984, "REG_DWORD")
Call WshShell.RegWrite("HKCU\Test\Binary", 815, "REG_BINARY")
Schreiben von Werten in die Systemregistrierung.

Als Registrierungsschlüssel auf höchster Ebene muß "HKCU", "HKLM", "HKCR", "HKEY_CURRENT_USER", "HKEY_LOCAL_MACHINE", "HKEY_CLASSES_ROOT", "HKEY_USERS" oder "HKEY_CURRENT_CONFIG" verwendet werden. Der letzte Parameter gibt den Typ des Wertes an. Folgende Angaben werden unterstützt: "REG_SZ", "REG_EXPAND_SZ", "REG_DWORD", "REG_BINARY".

Die Werte können über die Methode RegRead gelesen werden (z. B. WshShell.RegRead("HKCU\Test\String")); das Löschen wird durch Aufruf der Methode RegDelete (z. B. Call WshShell.RegDelete("HKCU\Test\String") bewerkstelligt.

Erstellen von Verknüpfungen

Erstellen von Dateiverknüpfungen

Das folgende Beispiel erstellt eine Verknüpfung mit dem Texteditor am Desktop. Die Eigenschaften, die angegeben werden können, entsprechen im Allgemeinen denen, die auch im Assistenten zum Erstellen von Verknüpfungen eingestellt werden können. Hervorzuheben ist, daß in den Pfadangaben wiederum auch Umgebungsvariablen unterstützt werden und daß die Eigenschaft WindowStyle eine der ShowWindow-Konstanten erwartet. Der Aufruf der Methode Save erstellt letztendlich die Verknüpfung:

DesktopPath = WshShell.SpecialFolders("Desktop")
Dim MyShortcut As Object
Set MyShortcut = WshShell.CreateShortcut( _
    WshShell.SpecialFolders("Desktop") & "\Start Notepad.lnk" _
)
Call MsgBox("FullName:  " & MyShortcut.FullName)
MyShortcut.TargetPath = "%windir%\notepad.exe"
MyShortcut.IconLocation = "%windir%\notepad.exe,1"
MyShortcut.Arguments = "%windir%\hardware.txt"
MyShortcut.Description = "Windows Text Editor"
MyShortcut.WindowStyle = SW_SHOWMAXIMIZED
MyShortcut.WorkingDirectory = "%temp%"
MyShortcut.HotKey = "ALT+CTRL+F"
Call MyShortcut.Save
Erstellen einer Dateiverknüpfung.

Eigenschaften, die nicht benötigt werden, müssen nicht gesetzt werden. So könnte beispielsweise kein Beschreibungstext angegeben oder die Angabe für das Symbol weggelassen werden.

Erstellen von URL-Verknüpfungen

Diese Funktion unterscheidet sich von jener zum Erstellen von Verknüpfungen lediglich darin, daß eine Datei mit der Dateinamenserweiterung .url erstellt wird:

Dim UrlLink As Object
Set UrlLink = WshShell.CreateShortcut( _
    WshShell.SpecialFolders("Desktop") & "\VB.Any Web Site.url" _
)
UrlLink.TargetPath = "https://dotnet.currifex.org/"
Call UrlLink.Save
Erstellen einer URL-Verknüpfung.

Schlußwort

Ein großer Teil der vom WSH gebotenen Funktionen kann durch Visual-Basic-eigene Mittel und Win32-API-Aufrufe ersetzt werden. Dennoch kann mittels des WSHs mit weniger Code eine Lösung gefunden werden. Da der WSH nicht auf jedem System vorinstalliert ist und vorwiegend für die Verwendung in Skripten gedacht ist, zahlt es sich nicht aus, wegen einer einzigen benötigten Funktion eine zusätzliche Abhängigkeit einzugehen.

Downloads

Beispielprojekt (WshComponent.zip)

Projekt im Visual-Basic-6.0-Format.