VBA-Spezialthema "Windows Script Host (WSH)"
Allgemeines über das Thema "Windows Script Host"
Übersicht über das Windows Script Host-Objektmodell
Windows Script Host Shell Object
Windows Script Host Network Object
Methoden und Eigenschaften der Windows Script Host-Objekte (WScript)
Behandlung von Laufzeitfehlern (Error Handling)
Verknüpfung anlegen (lnk-Datei)
Neue Dateinamenerweiterung mit Dateitypzuordnung registrieren
Meldungsdialog einblenden (mit Timeout)
Meldungsdialog einblenden (systemmodal)
Computer- und User-Informationen abfragen
Datei mit zugeordnetem Programm öffnen
Diese Seite ist teilweise in Bearbeitung! |
Allgemeines über das Thema "Windows Script Host"
Der Windows Script Host stellt eine ganze Reihe nützlicher Funktionalitäten bereit, die in VBA-Programmen (oder auch VB-Programmen) verwendet werden können. Insbesondere das Network- und das Shell-Objekt besitzen viele Eigenschaften und Methoden, die die Verwendung von speziellen Windows API-Funktionen hinfällig machen.
Interessant sind folgende Möglichkeiten:
» Einfacher Zugriff auf die Windows Registry
» Anlegen und Ändern von Verknüpfungen (lnk-Dateien)
» Spezial-Ordner von Windows abfragen (Desktop, Autostart, Favoriten etc.)
» Meldungsdialoge einblenden mit Timeout
» Installierte Drucker abfragen
» Netzlaufwerke abfragen
» Abfragen von Computer-, Domain- und Benutzername
» Registrierte Programme ausführen
» Programme ausführen und auf Beendigung warten
Übersicht über das Windows Script Host-Objektmodell
WSH - Windows Script Host
| Library Name: | "Windows Script Host Object Model (Ver 1.0)" |
| TypeLib File: | "D:\WINNT\System32\wshom.ocx" |
| File Version: | 5.1.0.4615 |
| File Product Name: | "Windows Script Host Runtime Library" |
Windows Script Host Shell Object
Registry-Schlüssel
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\WScript.Shell
CLSID: {F935DC22-1CF0-11D0-ADB9-00C04FD58A0B}
Instanzierung mit VBA/VB (Late Binding)
Dim objWSHShell As Object
Set objWSHShell = CreateObject("WScript.Shell")
Instanzierung mit VBA/VB (Early Binding)
Dim objWSHShell As New IWshRuntimeLibrary.IWshShell_Class
Windows Script Host Network Object
Registry-Schlüssel
HKEY_LOCAL_MACHINE\SOFTWARE\Classes\WScript.Network
CLSID: {F935DC26-1CF0-11D0-ADB9-00C04FD58A0B}
Instanzierung mit VBA/VB (Late Binding)
Dim objWSHNetwork As Object
Set objWSHNetwork = CreateObject("WScript.Network")
Instanzierung mit VBA/VB (Early Binding)
Dim objWSHNetwork As New IWshRuntimeLibrary.IWshNetwork_Class
Methoden und Eigenschaften der Windows Script Host-Objekte (WScript)
| Methode | Objekt | Beschreibung |
| CreateShortcut | IWshShell | Erstellt eine Verknüpfung (lnk-Datei) zu einer Datei oder einem Ordner. |
| Popup | IWshShell | Blendet einen Meldungsdialog ein (ähnlich MsgBox von VBA). |
| RegDelete | IWshShell | Löscht einen Registry-Eintrag. |
| RegRead | IWshShell | Liest einen Registry-Eintrag. |
| RegWrite | IWshShell | Schreibt einen Registry-Eintrag. |
| Run | IWshShell | Führt eine Programmdatei aus (exe-Datei). |
| Save | IWshShortcutClass | Speichert eine Verknüpfungsdatei. |
| Eigenschaft | Beschreibung |
| Environment | Enthält die Umgebungsvariablen. |
| SpecialFolders | Enthält eine Auflistung der Spezialordner. |
Behandlung von Laufzeitfehlern (Error Handling)
Diese Tabelle zeigt eine Liste der Fehlercodes, die unbedingt in einer Fehlerbehandlungsroutine im Programmcode abgefangen und behandelt werden müssen.
| Fehler (Hex) | Fehler (Dec) | Fehlermeldung | Beschreibung |
| - | 429 | ActiveX component can't create object. Objekterstellung durch ActiveX-Komponente nicht möglich. |
Die Objekterstellung ist
fehlgeschlagen. Meistens ist die angegebene Komponente (z.B. die Shell-Klasse) nicht oder nur unvollständig registriert. |
| &H80070002 | -2147024894 | Registrierungsschlüssel "<Key>" kann nicht zum Lesen geöffnet werden. | Der angegebene Registrierungsschlüssel existiert nicht. |
| &H80070002 | -2147024894 | Ungültige Wurzel in Registrierungsschlüssel "<Key>". | Die Wurzel ist ungültig, weil der angegebene Registrierungsschlüssel nicht existiert. |
Bitte beachten Sie, dass der Laufzeitfehler -2147024894 zwei verschiedene Meldungstexte besitzt. Zudem ist der Standard-Meldungstext von Windows für diesen Fehler "Das System kann die angegebene Datei nicht finden".
Anhand der RegRead-Methode kann man sehr einfach auf einen beliebigen Registry-Eintrag zugreifen und seinen Inhalt auslesen.
Zeichenfolge lesen
Dieses Beispiel zeigt, wie der Registry-Eintrag von Microsoft Excel, in welchem die Position und Grösse des Anwendungsfensters abgelegt ist, ausgelesen und anschliessend mit MsgBox angezeigt wird.
Sub ReadRegistry()
Dim strRC As String
Dim objWSHShell As Object
Set objWSHShell = CreateObject("WScript.Shell")
strRC =
objWSHShell.RegRead("HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Excel\Microsoft
Excel\Pos")
MsgBox strRC
Set objWSHShell = Nothing
End Sub
Wurzel-Wert (Standard) lesen
Dieses Beispiel liest den Wert der so genannten Wurzel des Zweiges ".xls" aus. Der Wurzel-Eintrag besitzt immer den Namen "(Standard)".
Sub ReadRegistryStandardKey()
Dim objWSHShell As Object
Set objWSHShell = CreateObject("WScript.Shell")
MsgBox objWSHShell.RegRead("HKEY_CLASSES_ROOT\.xls\")
Set objWSHShell = Nothing
End Sub
DWORD-Wert lesen
varValue ist eine Ganzzahl vom Typ Long.
Sub ReadRegistryDWORDValue()
Dim varValue As Variant
Dim objWSHShell As Object
Set objWSHShell = CreateObject("WScript.Shell")
varValue =
objWSHShell.RegRead("HKEY_CURRENT_USER\Software\Microsoft\MediaPlayer\Control\StatusBar\ClrForeColor")
MsgBox varValue
Set objWSHShell = Nothing
End Sub
Binärwert lesen
varValue ist ein Array vom Typ Variant.
Sub ReadRegistryBinaryValue()
Dim varValue As Variant
Dim objWSHShell As Object
Set objWSHShell = CreateObject("WScript.Shell")
varValue = objWSHShell.RegRead("HKEY_CURRENT_USER\Software\Microsoft\Microsoft
Office\95\FileGroups\mdn;mdz;")
MsgBox varValue(1)
Set objWSHShell = Nothing
End Sub
Das Schreiben eines Registry-Eintrages ist ebenfalls sehr einfach und wird mit der RegWrite-Methode vorgenommen.
Zeichenfolge schreiben
Mit dieser Beispielprozedur werden die Werte des Registry-Eintrages von Microsoft Excel, in welchem die Position und Grösse des Anwendungsfensters gespeichert ist, durch geänderte Werte angepasst.
Sub WriteRegistry()
Dim objWSHShell As Object
Set objWSHShell = CreateObject("WScript.Shell")
objWSHShell.RegWrite
"HKEY_CURRENT_USER\Software\Microsoft\Office\8.0\Excel\Microsoft Excel\Pos",
"20,20,500,250"
Set objWSHShell = Nothing
End Sub
Wurzel-Wert (Standard) schreiben
Dieses Beispiel erstellt einen Registry-Zweig ".aaa" und schreibt den Wert "aaafile" in den Eintrag "(Standard)".
Sub WriteRegistryStandardKey()
Dim objWSHShell As Object
Set objWSHShell = CreateObject("WScript.Shell")
objWSHShell.RegWrite "HKEY_CLASSES_ROOT\.aaa\", "aaafile"
Set objWSHShell = Nothing
End Sub
DWORD-Wert schreiben
Dieses Beispiel schreibt den DWORD-Wert 1 in den Eintrag "bbb".
Sub WriteRegistryDWORDValue()
Dim objWSHShell As Object
Set objWSHShell = CreateObject("WScript.Shell")
objWSHShell.RegWrite "HKEY_CLASSES_ROOT\.aaa\bbb", 1,
"REG_DWORD"
Set objWSHShell = Nothing
End Sub
Binärwert schreiben
Dieses Beispiel schreibt den Binärwert 2 in den Eintrag "bbb".
Sub WriteRegistryBinaryValue()
Dim objWSHShell As Object
Set objWSHShell = CreateObject("WScript.Shell")
objWSHShell.RegWrite "HKEY_CLASSES_ROOT\.aaa\bbb", 2,
"REG_BINARY"
Set objWSHShell = Nothing
End Sub
Ein Registry-Schlüssel oder -Eintrag wird mit der RegDelete-Methode gelöscht.
Eintrag löschen
Sub DeleteRegistryEntry()
Dim objWSHShell As Object
Set objWSHShell = CreateObject("WScript.Shell")
objWSHShell.RegDelete "HKEY_CLASSES_ROOT\.aaa\bbb"
Set objWSHShell = Nothing
End Sub
Schlüssel löschen
Sub DeleteRegistryKey()
Dim objWSHShell As Object
Set objWSHShell = CreateObject("WScript.Shell")
objWSHShell.RegDelete "HKEY_CLASSES_ROOT\.aaa"
Set objWSHShell = Nothing
End Sub
Verknüpfung anlegen (lnk-Datei)
- Datei-Verknüpfung
- Ordner-Verknüpfung
- Internet-Verknüpfung
- E-Mail-Verknüpfung
Verknüpfungen (Dateien mit der Dateinamenerweiterung 'lnk') können ganz einfach erstellt werden.
So wird im Verzeichnis "C:\Programme" eine Verknüpfung mit dem Ordner "C:\Daten" angelegt:
Sub CreateFolderShortcut()
'Early Binding:
'Dim objWSHShell As New IWshRuntimeLibrary.IWshShell_Class
'Dim objWSHShortcut As IWshRuntimeLibrary.IWshShortcut_Class
'Late Binding:
Dim objWSHShell As Object
Dim objWSHShortcut As Object
Set objWSHShell = CreateObject("WScript.Shell")
Set objWSHShortcut =
objWSHShell.CreateShortcut("C:\Programme\FolderLink.lnk")
With objWSHShortcut
.TargetPath = "C:\Daten"
.Description = "Dies ist eine Ordner-Verknüpfung"
.WorkingDirectory = ""
.WindowStyle = 1 '1 = normale
Fenstergrösse
.Save
End With
Set objWSHShortcut = Nothing
Set objWSHShell = Nothing
End Sub
Es gibt viele verschiedene Möglichkeiten, wie das Temp-Verzeichnis von Windows ermittelt werden kann. Auch die Windows Script Host-Bibliothek kennt eine solche. Hier der entsprechende Programmcode:
Sub GetEnvironmentTempDir()
Dim wshShell As Object
Dim strEnv As Variant
Set wshShell = CreateObject("WScript.Shell")
For Each strEnv In wshShell.Environment("PROCESS")
If UCase(Left$(strEnv, 5)) = "TEMP=" Then
MsgBox Mid$(strEnv, 6)
Exit For
End If
Next
Set wshShell = Nothing
End Sub
Weitere Informationen |
|
Beschreibung folgt...
Sub GetSpecialFolders1()
Dim intCounter As Integer
Dim objFolders As Object
Set objFolders = CreateObject("WScript.Shell").SpecialFolders
For intCounter = 0 To objFolders.Count - 1
MsgBox objFolders(intCounter)
Next intCounter
Set objFolders = Nothing
End Sub
Sub GetSpecialFolders2()
Dim objFolders As Object
Set objFolders = CreateObject("WScript.Shell").SpecialFolders
MsgBox objFolders("sendto")
MsgBox objFolders("startmenu")
MsgBox objFolders("recent")
MsgBox objFolders("favorites")
MsgBox objFolders("desktop")
MsgBox objFolders("allusersdesktop")
'Weitere MsgBox-Anweisungen mit den restlichen
Bezeichnern
Set objFolders = Nothing
End Sub
Sub GetSpecialFolders3()
MsgBox CreateObject("WScript.Shell").SpecialFolders("desktop")
End Sub
Neue Dateinamenerweiterung mit Dateitypzuordnung registrieren
Dieses praxisnahe Codebeispiel zeigt, wie man einen neuen Dateityp in Windows registrieren kann. Im Beispiel wird die Dateinamenerweiterung "bwd" als Dateityp "BIFF-Workbench Dump" registriert und mit der Programmdatei BIFF-Workbench.exe verbunden. Nach Ausführen des Programmcodes führt ein Doppelklick auf eine bwd-Datei die Anwendung BIFF-Workbench aus und öffnet die Datei.
Die Variable strAppPath enthält das Programmverzeichnis der Anwendung BIFF-Workbench, z.B. "C:\Programme\BIFF-Workbench".
Sub CreateFileAssociation()
Dim objShell As Object
Set objShell = CreateObject("WScript.Shell")
With objShell
.RegWrite "HKEY_CLASSES_ROOT\.bwd\", "bwdfile"
.RegWrite "HKEY_CLASSES_ROOT\bwdfile\", "BIFF-Workbench
Dump"
.RegWrite "HKEY_CLASSES_ROOT\bwdfile\Shell\", ""
.RegWrite "HKEY_CLASSES_ROOT\bwdfile\Shell\open\command\",
Chr$(34) & strAppPath & "\BIFF-Workbench.exe" & Chr$(34) &
" %1"
End With
Set objShell = Nothing
End Sub
Mit dieser kleinen Prozedur werden nacheinander alle installierten Drucker ausgegeben. Beachten Sie insbesondere den Inhalt des objWSHCollection-Objektes, das auf IWshCollection_Class basiert. Das Objekt enthält eine Auflistung (nullbasierter Index) aller Anschlüsse und Druckernamen, wobei immer zwei aufeinanderfolgende Elemente ein Paar bilden: Zuerst kommt der Anschluss und dann der Druckername.
Sub ShowPrinterConnections()
Dim lngItems As Long
Dim objWSHNetwork As New IWshRuntimeLibrary.IWshNetwork_Class
Dim objWSHCollection As IWshRuntimeLibrary.IWshCollection_Class
Set objWSHCollection = objWSHNetwork.EnumPrinterConnections
For lngItems = 0 To objWSHCollection.Count - 1 Step 2
MsgBox "Printer " & CStr(lngItems / 2 + 1) & ":
" & objWSHCollection(lngItems) & " " &
objWSHCollection(lngItems + 1)
Next lngItems
Set objWSHCollection = Nothing
Set objWSHNetwork = Nothing
End Sub
Meldungsdialog einblenden (mit Timeout)
Anhand der Popup-Methode lässt sich eine Meldung einblenden (analog MsgBox). Wahlweise kann ein Timeout angegeben werden (Ganzzahl für Sekunden). Im folgenden Beispiel wird die Meldungsdialog nach 5 Sekunden automatisch geschlossen (siehe Zahl 5 als zweiter Methoden-Parameter).
Sub ShowMessageSystemModal()
Dim objWSHShell As Object
Set objWSHShell = CreateObject("WScript.Shell")
objWSHShell.Popup "Meldung für 5 Sekunden...", 5, "Meldung",
vbOKOnly
Set objWSHShell = Nothing
End Sub
Meldungsdialog einblenden (systemmodal)
Zwischen einem mit MsgBox und einem mit Popup angezeigten systemmodalen Meldungsdialog gibt es einen Unterschied. Während die mit MsgBox erzeugte Meldung sowohl das Anwendungsfenster von Excel als auch den VBA-Editor sperrt, wird bei Popup nur die aufrufende Anwendung gesperrt. Wenn man die Prozedur mit der Popup-Codezeile aus dem VBA-Editor heraus startet (z.B. mit F5), so wird der VBA-Editor gesperrt, nicht aber das Anwendungsfenster von Excel. Startet man die Prozedur dagegen in Excel über den Menübefehl Extras/Makro/Makros, so wird Excel gesperrt, und der VBA-Editor hingegen nicht.
Sub ShowMessageSystemModal()
Dim objWSHShell As Object
Set objWSHShell = CreateObject("WScript.Shell")
objWSHShell.Popup "Systemmodale Message Box mit Popup.", 0,
"Meldung", vbSystemModal
Set objWSHShell = Nothing
MsgBox "Systemmodale Message Box mit MsgBox.", vbSystemModal,
"Meldung"
End Sub
Computer- und User-Informationen abfragen
Über das Network-Objekt erhält man Zugriff auf verschiedene Informationen zu Computer und Benutzer. Dieses Beispiel zeigt, wie man Computername, Domänenname und Benutzername abfragen kann.
Sub GetMiscInformation()
MsgBox CreateObject("WScript.Network").ComputerName
MsgBox CreateObject("WScript.Network").UserDomain
MsgBox CreateObject("WScript.Network").UserName
End Sub
Folgt in Kürze...
Sub ExecuteProgram()
End Sub
Datei mit zugeordnetem Programm öffnen
Folgt in Kürze...
Sub OpenFileWithProgram()
End Sub
Zuletzt aktualisiert am
14.01.2006 / 21:00 Uhr
© 2002-2006 by Philipp von Wartburg, CH-8916 Jonen
Alle Rechte vorbehalten