Der Windows Script Host
von Herfried K. Wagner
Einleitung
Oft vergessen stellt das Windows in aktuellen Versionen optional eine ActiveX-Komponente zur Verfügung, mit der das Durchführen von Systemoperationen vereinfacht wird und über die auch einige Systeminformationen ermittelt werden können. Diese Komponente heisst Windows Script Host (WSH) und ist in der Datei WSHom.ocx implementiert. Über den WSH können folgende Operationen durchgeführt werden:
- Lokationen der Spezialordner ermitteln
- Umgebungsvariablen lesen und setzen
- Netzwerkinformationen ermitteln
- Meldungsfelder anzeigen
- Anwendungen starten (optional mit „Shell and Wait“)
- Schlüssel und Werte in der Systemregistrierung lesen und schreiben
- Verknüpfungen („Shell Links“) erstellen
- Verknüpfungen mit einer URL erstellen
Hinweis:
Die Erstveröffentlichung dieses Tutorials finden Sie unter http://dotnet.mvps.org/vb/articles/wsh/
Einbinden der Komponente
Verweis auf den WSH
Es kann ein Verweis auf die WSHom.ocx erstellt werden. Der Verpackungs- und Weitergabeassistent stellt eine Abhängigkeit zu dieser Datei fest und will sie in das Weitergabepaket integrieren. Wurde der Verweis auf die Komponente hinzugefügt, so kann eine Instanz der Komponente über folgenden Code deklariert werden (frühes Binden):
' '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
Nach Verwendung der Komponente bzw. bei Beenden der Anwendung sollte diese Instanz dann auf das Schlüsselwort Nothing gesetzt werden, damit der Speicher freigegeben wird.
Spätes Binden
Diese Methode kommt ohne einen Verweis auf die ActiveX-Komponente aus, dadurch kommt es zu einem Fehler, sollte die ActiveX-Komponente aus irgendwelchen Gründen nicht verfügbar sein. Hier wird erst zur Laufzeit einer Variable vom Typ Object eine Instanz der WSH-Klasse zugewiesen. Der entsprechende Code würde folgendermassen aussehen:
' 'Wscript.Shell'. Dim WshShell As Object Set WshShell = CreateObject("Wscript.Shell")
Die Deklarationen von einem Environment- und einem Network-Objekt wurden hier nicht angegeben, sehen aber ähnlich aus.
In den folgenden Kapiteln wird davon ausgegangen, dass der Variable WshShell eine Instanz der Klasse Wscript.Shell zugewiesen wurde.
Ermitteln der Lokation von Spezialordnern
Der WSH stellt eine Auflistung SpecialFolders zur Verfügung, die alle im System „bekannten“ Ordnernamen enthält. Über eine Schleife könne alle Objekte dieser Auflistung ermittelt werden:
Dim Folder As Variant For Each Folder In WshShell.SpecialFolders Debug.Print Folder Next Folder
Diese Methode kann verwendet werden, um alle verschiedenen bekannten Namen der Spezialordner auszulesen. Weiters ist jeder der Ordner der Auflistung ist auch über eine bestimmte Konstante vom Typ String ansprechbar. Diese Konstanten sind vordefiniert, „Fonts“ würde zum Beispiel den Font-Ordner bezeichnen und „Desktop“ den Ordner, in dem sich der Desktop befindet. Um den Pfad des Desktop abzufragen, könnte man den Code WshShell.SpecialFolders("Desktop") verwenden.
Es ist dabei zu beachten, dass der String-Parameter ein Wert sein muss und nicht eine Variable, d.h. bei Einsetzung einer Variablen muss diese extra zwischen runde Klammern gestellt werden. Wird dies nicht getan, werden falsche Werte zurückgeliefert.
Lesen und Schreiben von Umgebungsvariablen
Umgebungsvariablen sind systemweit verfügbare Variablen, die Informationen über das System enthalten. Jede dieser Variablen ist über einen speziellen String ansprechbar, sie kann je nach System einen anderen Wert besitzen (deshalb Variable). Diese Variablen gliedern sich in die 4 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
Das Setzen und Löschen der Variablen geschieht wie folgt:
Dim WshEnv As Object Set WshEnv = WshShell.Environment("VOLATILE") WshEnv("EXAMPLE") = "A_VALUE"
Hier wird eine Umgebungsvariable namens „EXAMPLE“ mit dem Wert „A_VALUE“ der „VOLATILE“-Sektion hinzugefügt. Das Löschen der Variablen erfolgt durch Aufruf der Methode Remove, beispielsweise Call WshEnv.Remove("EXAMPLE").
Auch die Umgebungsvariablen befinden sich in einer Auflistung, daher können auch sie über den jeweiligen Variablennamen 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 wird. Folgendes Beispiel würde den Benutzernamen im Netzwerk ermitteln:
Dim WshNet As Object Set WshNet = CreateObject("Wscript.Network") Call MsgBox(WshNet.UserName)
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 WSH zum Anzeigen von Meldungen ist, dass das Meldungsfeld einen eigenen Eintrag in der Taskleiste besitzt. Folgender Code würde eine Meldung anzeigen, die sich nach 3 Sekunden von selbst schliesst:
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
Das automatische Schliessen ist optional, um es zu unterbinden, übergibt man als Zeitlimit den Wert 0.
Starten von Anwendungen
Auch das Windows-API bietet zahlreiche Funktionen, über die andere Anwendungen gestartet werden können. Das praktische an dieser Funktion ist, dass keine Windows-API-Deklarationen erforderlich sind, sondern alles mit einer Zeile Code erledigt werden kann.
Optional kann die Anwendung im „Shell and Wait“-Modus gestartet werden; dabei wird die aufrufende Anwendung so lange blockiert, bis die gestartete Anwendung beendet wird. Im untenstehenden Beispiel wird der Editor mit Shell and Wait 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))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 Fensterstatus-Konstanten der Windows-API-Funktion ShowWindow unterstützt. Diese Konstanten können der Header-Datei WinUser.h oder dem API-Viewer entnommen werden. Der letzte Parameter gibt an, ob „Shell and Wait“ verwendet werden soll.
Zugriff auf die Systemregistrierung
Auch dies ist über Windows-API-Funktionen aus der AdvApi32.dll möglich, wird aber durch die Verwendung des WSH bedeutend vereinfacht. Der WSH kann Schlüssel und Werte vom Typ Integer, String und Binary in der Systemregistrierung schreiben, löschen bzw. lesen. Der folgende Code schreibt beispielsweise 3 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")
Als Registrierungsschlüssel auf höchster Ebene muss „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, es werden folgende Angaben 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 Editor am Desktop. Die Eigenschaften, die angegeben werden können, entsprechen im Allgemeinen denen, die auch beim Assistenten zum Erstellen von Verknüpfungen eingestellt werden können. Hervorzuheben ist, dass bei den Pfadangaben wiederum auch Umgebungsvariablen unterstützt werden und dass 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
Natürlich müssen nicht alle Eigenschaften gesetzt werden, man könnte beispielsweise keinen Beschreibungstext angeben oder die Angabe für das Symbol weglassen.
Erstellen von URL-Verknüpfungen
Diese Funktion ist eigentlich die selbe wie jene zum Erstellen von Verknüpfungen, allerdings wird hier eine Datei mit der Erweiterung .url erstellt:
Dim UrlLink As Object Set UrlLink = WshShell.CreateShortcut( _ WshShell.SpecialFolders("Desktop") & "\Microsoft Web Site.url" _ ) UrlLink.TargetPath = "http://www.microsoft.com/" Call UrlLink.Save
Schlusswort
Ein grosser Teil der vom WSH gebotenen Funktionen kann durch Visual Basic-eigene Mittel und Windows-API-Aufrufe ersetzt werden. Trotzdem bietet diese Komponente eine Möglichkeit, einer Anwendung mehr Struktur zu geben und den Code zu abstrahieren. Da der WSH nicht auf jedem System vorinstalliert ist, zahlt es sich nicht aus, wegen einer einzigen benötigten Funktion eine zusätzliche Abhängigkeit einzugehen. Der WSH ist primär für die Verwendung in Skripten gedacht, weshalb seine Verwendung in Anwendungen zu hinterfragen ist.
Ihre Meinung
Falls Sie Fragen zu diesem Tutorial haben oder Ihre Erfahrung mit anderen Nutzern austauschen möchten, dann teilen Sie uns diese bitte in einem der unten vorhandenen Themen oder über einen neuen Beitrag mit. Hierzu können sie einfach einen Beitrag in einem zum Thema passenden Forum anlegen, welcher automatisch mit dieser Seite verknüpft wird.