Die Community zu .NET und Classic VB.
Menü

Der Windows Script Host

 von 

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
Ein Grossteil dieser Funktionen kann auch mit Visual Basic-eigenen Mitteln oder über Windows-API-Aufrufe realisiert werden.

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

Listing 1: Benutzen der WSH-Klassen über frühes Binden.

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")

Listing 2: Benutzen der WSH-Klassen über spätes Binden.

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

Listing 3: Enumeration der Spezialordner

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

Listing 4: Enumerieren der System-Umgebungsvariablen.

Das Setzen und Löschen der Variablen geschieht wie folgt:

Dim WshEnv As Object
Set WshEnv = WshShell.Environment("VOLATILE")
WshEnv("EXAMPLE") = "A_VALUE"

Listing 5: Setzen einer benuzterdefinierten Umgebungsvariablen.

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)

Listing 6: Ermitteln des Benutzernamens 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 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

Listing 7

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))

Listing 8: Starten einer Anwendung mit „Shell and Wait“.

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")

Listing 9: Schreiben von Werten in die Systemregistrierung.

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

Listing 10: Erstellen einer Dateiverknüpfung.

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

Listing 11: Erstellen einer URL-Verknüpfung

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.

Downloads  

Beispielprojekt (WshComponent.zip) [7434 Bytes]

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.