- Offizieller Beitrag
Das WshShell-Objektmodell
Ich habe hier anhand einiger Beispiele die Möglichkeiten des WshShell-Objektmodells dargestellt.
Wie auch schon beim FSO gilt, dass für fast alle Aktionen adäquate Befehle bereits direkt in AutoIt vorhanden sind.
Aber auch hier kann es von Fall zu Fall interessanter sein auf die Objektversion zuzugreifen.
$objShell = ObjCreate("WScript.Shell")
[/autoit]Programme ausführen Run, Exec
Arbeiten mit Spezialordnern SpecialFolders
Arbeiten mit Verknüpfungen CreateShortcut
Arbeiten mit Umgebungsvariablen Environment, ExpandEnvironmentStrings
Arbeiten mit dem Ereignisprotokoll LogEvent
Arbeiten mit der Registrierung RegRead, RegWrite, RegDelete
Tastendrücke an Anwendungen senden AppActivate, SendKeys
Abfragen des aktuellen
Verzeichnisses des Scripts CurrentDirectory
Zeitgesteuerte Dialogfenster erstellen Popup
Programme ausführen
Spoiler anzeigen
Methoden: Run und Exec
Syntax für Run
[autoit]Run('File' [, 'Fensterstil=Integer' [, 'Wait=False']])
[/autoit]
Werte für den Parameter Window-Stil der Methode Run
0 Verstecktes Fenster
1 Aktiviert das Fenster und zeigt es an. Wenn das Fenster
minimiert oder maximiert ist, werden Originalgröße und
-position des Fensters wiederhergestellt.
2 Aktiviert das Fenster und zeigt es minimiert an.
3 Aktiviert das Fenster und zeigt es maximiert an.
4 Zeigt das Fenster mit seiner letzten Größe und Position an.
Das aktive Fenster bleibt aktiv.
5 Aktiviert das Fenster und zeigt es mit seiner aktuellen
Größe und Position an.
6 Minimiert das Fenster und aktiviert das nächste Fenster in Z-Reihenfolge.
Bei der Z-Reihenfolge handelt es sich um eine Liste, in der die
Fenster aktiviert werden. Sie können die Liste sehen, wenn Sie ALT+TAB drücken.
7 Zeigt das Fenster minimiert an. Das aktive Fenster bleibt aktiv.
8 Zeigt das Fenster in seinem Zustand an. Das aktive Fenster bleibt aktiv.
9 Aktiviert das Fenster und zeigt es an. Wen das Fenster minimiert
oder maximiert ist, dann werden seine Originalgröße und
-position wiederhergestellt.
10 Setzt den Anzeigezustand des Fensters auf Basis des
Anzeigezustands des Programms, das die Anwendung gestartet hat.
Alles anzeigen
Die Konstanten-Deklaration der Parameter ist nicht zwingend erforderlich.
Das Einsetzen des numerischen Wertes erfüllt denselben Zweck.
Das Setzen der Konstanten verbessert aber die Lesbarkeit des Codes.
Const $HIDDEN_WINDOW = 0
Const $RESIZEPOS_WINDOW = 1
Const $MINIMIZE_WINDOW = 2
Const $MAXIMIZE_WINDOW = 3
Const $LAST_SIZE_POS_WINDOW_ACTIVE_NO_CHG = 4
Const $CURRENT_SIZE_POS_WINDOW = 5
Const $MINIMIZE_WINDOW_ACTIVATE_NEXT_Z = 6
Const $MINIMIZE_WINDOW_ACTIVE_NO_CHG = 7
Const $SHOW_AS_IS_WINDOW_ACTIVE_NO_CHG = 8
Const $ACTIVATE_WINDOW_RESIZEPOS_AFTER_MIN_MAX = 9
Const $WINDOW_STATE_LIKE_APPL_STATE = 10
Notepad maximiert starten
$objShell = ObjCreate("WScript.Shell")
$objShell.Run("notepad.exe", $MAXIMIZE_WINDOW)
Anmerkung:
Der Parameter Windows-Stil wird nicht von allen Anwendungen verarbeitet.
Die Systemsteuerung (control.exe) wird zum Beispiel immer in der gleichen Form geöffnet -
egal welcher Fensterstil im Script definiert wurde.
Befehlsausführung abwarten
Run akzeptiert als dritten Parameter 'TRUE' oder 'FALSE', voreingestellt ist 'FALSE'.
Wird 'TRUE' gesetzt wird mit der Skriptabarbeitung gewartet, bis das gestartete Programm
beendet wurde.
Rechner aufrufen und erst nach Beendigen Skript fortsetzen
$objShell = ObjCreate("WScript.Shell")
$objShell.Run("calc.exe", 1, True)
MsgBox(0, '', "Script completed.")
Ausführen von Kommandozeilentools
möglich mit Run und Exec
%comspec% /k Kommandozeilenfenster bleibt offen
%comspec% /c Kommandozeilenfenster wird geschlossen
$objShell = ObjCreate("WScript.Shell")
$objShell.Run("%comspec% /K dir", 1, True)
Programm ausführen und auf dessen Ausgaben zugreifen
Methode Exec
Ping absetzen
[autoit]$objShell = ObjCreate("WScript.Shell")
$IP = '192.168.178.1'
$objExecObject = $objShell.Exec("cmd /c ping -n 3 -w 1000 " & $IP)
Do
$strText = $objExecObject.StdOut.ReadLine()
If StringInStr($strText, 'Antwort', 1) = 1 Then
MsgBox(0, '', "Antwort erhalten.")
ExitLoop
EndIf
Until $objExecObject.StdOut.AtEndOfStream
Konfiguration Netzwerkadapter abfragen
$objExecObject = $objShell.Exec("%comspec% /c ipconfig.exe")
$str = ''
Do
$strLine = $objExecObject.StdOut.ReadLine()
If StringInStr($strLine, "Adresse", 1) Then
$str &= $strLine & @LF
ElseIf StringInStr($strLine, "maske", 1) Then
$str &= $strLine & @LF
ElseIf StringInStr($strLine, "gateway", 1) Then
$str &= $strLine & @LF
EndIf
Until $objExecObject.StdOut.AtEndOfStream
MsgBox(0, 'Konfiguration', $str)
Verknüpfungen
Spoiler anzeigen
Objekt WshShortcut
Arguments Zusätzliche Kommandozeilenargumente, die Sie beim
Start der Anwendung verwenden können.
Description Beschreibung der Verknüpfung.
FullName Nur-Lese-Eigenschaft, die den vollständigen Pfad
zur Zielanwendung angibt.
HotKey Tastenkombination: Eine Tastenkombination, über die
die Anwendung gestartet werden kann. Tastenkombinationen
setzen sich normalerweise aus einer der folgenden Tasten
plus einem Buchstaben (a-z), einer Zahl (0-9) oder einer
Funktionstaste (F1-F12) zusammensetzen:
ALT
STRG
HOCHSTELLTASTE
Wenn Sie die Eigenschaft angeben, müssen Sie für
die Taste STRG den Wert CTRL und für die Hochstelltaste
den Wert SHIFT angeben. Für die Tastenkombination STRG
und 9 verwenden Sie beispielsweise den folgenden Wert:
Ctrl + 9
Wenn die Tastenkombination bereits verwendet wird, dann
wird sie überschrieben und der neuen Verknüpfung zugewiesen.
IconLocation Ermöglicht Ihnen die Angabe einen Symbols und eines
Symbolindexes für die Verknüpfung. Wenn nichts angegeben
wird, dann wird das Standardsymbol der Anwendung verwendet.
TargetPath Vollständiger Pfad zur Zielanwendung. Sie müssen einen
vollständigen Pfad (inklusive des Laufwerkbuchstabens)
oder einen UNC-Pfad angeben.
Der angegeben Wert wird nicht überprüft.
WindowStyle Fenstertyp der gestarteten Anwendung. Die möglichen
Werte entsprechen den Werten der Methode Run.
WorkingDirectory Arbeitsverzeichnis der Anwendung.
Alles anzeigen
Verknüpfung zum Windows-Taschenrechner auf dem Desktop
Zusätzlich Tastenkombination STRG-HOCHSTELLTASTE+T
$objShell = ObjCreate("WScript.Shell")
$strDesktopFolder = $objShell.SpecialFolders("AllUsersDesktop")
$objShortCut = $objShell.CreateShortcut($strDesktopFolder & "\Calculator.lnk")
With $objShortCut
.TargetPath = "%SystemRoot%\System32\calc.exe"
.Description = "Taschenrechner starten."
.HotKey = "Ctrl+Shift+T"
.Save
EndWith
Verknüpfung zur AutoIt-URL auf dem Desktop
$objShell = ObjCreate("WScript.Shell")
$strDesktopFld = $objShell.SpecialFolders("Desktop")
$objURLShortcut = $objShell.CreateShortcut($strDesktopFld & "\AutoIt.url")
With $objURLShortcut
.TargetPath = "http://www.autoit.de/jgs_portal.php?sid="
.Save
EndWith
Element zur Schnellstartleiste hinzufügen
$objShell = Objc("WScript.Shell")
$colEnvironmentVariables = $objShell.Environment("Volatile")
$strQLFolder = $colEnvironmentVariables.Item("APPDATA") & _
"\Microsoft\Internet Explorer\Quick Launch"
$objURLShortcut = $objShell.CreateShortcut($strQLFolder & "\AutoIt.url")
With $objURLShortcut
.TargetPath = "http://www.autoit.de/jgs_portal.php?sid="
.Save
EndWith
Löschen von Verknüpfungen
$objShell = ObjCreate("WScript.Shell")
$colEnvironmentVariables = $objShell.Environment("Volatile")
$objFSO = ObjCreate("Scripting.FileSystemObject")
$strQLFolder = $colEnvironmentVariables.Item("APPDATA") & _
"\Microsoft\Internet Explorer\Quick Launch\AutoIt.url"
$objFSO.DeleteFile($strQLFolder)
Spezialordner (Collection SpecialFolders)
Spoiler anzeigen
Hiermit kann AUSSCHLIESSLICH der Pfad des Ordners abgefragt werden.
AllUsersDesktop Desktopinhalte, die allen Benutzern angezeigt werden.
AllUsersStartMenu Startmenüeinträge, die allen Benutzern angezeigt werden.
AllUsersPrograms Einträge im Menü Programme, die allen Benutzern angezeigt werden.
AllUsersStartup Programme, die für alle Benutzer beim Systemstart ausgeführt werden.
Desktop Desktopinhalte, die nur dem aktuellen Benutzer angezeigt werden.
Favorites Einträge in den Favoriten des aktuellen Benutzers.
Fonts Installierte Schriften
MyDocuments Ordner Meine Dokumente des aktuellen Benutzers.
NetHood Objekte, die im Ordner Netzwerkumgebung angezeigt werden.
PrintHood Drucker
Recent Objekte, die unter dem Menüpunkt Dokumente im Startmenü
angezeigt werden (für den aktuellen Benutzer).
SendTo Optionen im Menü Senden an im Kontextmenü nach einem
Rechtsklick im Windows Explorer.
StartMenu Startmenü des aktuellen Benutzers.
Startup Programme, die für den aktuellen Benutzer beim Systemstart
ausgeführt werden.
Templates Anwendungsvorlagen des aktuellen Benutzers.
Alles anzeigen
Speicherort des Spezialordners 'Fonts'
$objShell = ObjCreate("WScript.Shell")
$strFontDirectoryPath = $objShell.SpecialFolders.Item("Fonts")
MsgBox(0, "Pfad zum Ordner Font", $strFontDirectoryPath)
Verknüpfung mit SciTE im Spezialordner 'Senden an' erstellen
um z.B. htm-Dateien per Kontextmenü in SciTE zu öffnen
$objShell = ObjCreate("WScript.Shell")
$Path = RegRead('HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\SciTE.exe', '')
$strSendToFolder = $objShell.SpecialFolders("SendTo")
$strPathToScite = $objShell.ExpandEnvironmentStrings($Path)
$objShortcut = $objShell.CreateShortcut($strSendToFolder & "\SciTE.lnk")
$objShortcut.TargetPath = $strPathToScite
$objShortcut.Save
Umgebungsvariablen und deren Speicherorte
Spoiler anzeigen
Die Eigenschaft Environment des Objekts WshShell gibt die Collection WshEnvironment zurück,
über die das Script Umgebungsvariablen abfragen, einrichten und verändern kann.
User Spezifisch für den angemeldeten Benutzer. HKCU\Environment
Werden zwischen Ab- und Anmeldung des
Benutzers gespeichert.
System Gelten für alle Benutzer des Computers HKLM\System\CurrentControlSet\
und werden zwischen An- und Control\Session Manager\Environment
Abmeldung gespeichert.
Volatile Gelten nur für die aktuelle Sitzung. HKCU\VolatileEnvironment
Werden nicht gespeichert.
Process Gelten nur für den aktuellen Prozess. Werden nicht in der Registrierung gespeichert.
Abfragen von Umgebungsvariablen
Um eine Collection mit den Umgebungsvariablen eines bestimmten Typs zu erhalten,
verwenden Sie die Eigenschaft WshShell.Environment. Ihr übergeben Sie eine String,
der den gewünschten Variablentyp enthält: system, user, process oder volatile.
Danach kann das Script über die Collection WshEnvironment über den Namen der
Umgebungsvariablen auf diese zugreifen.
Name System User Process Process (nur Windows 98/Me)
NUMBER_OF_PROCESSORS x x
PROCESSOR_ARCHITECTURE x x
PROCESSOR_IDENTIFIER x x
PROCESSOR_LEVEL x x
PROCESSOR_REVISION x x
OS x x
COMSPEC x x x
HOMEDRIVE x
HOMEPATH x
PATH x x x x
PATHEXT x x
PROMPT x x
SYSTEMDRIVE x
SYSTEMROOT x
WINDIR x x x
TEMP x x x
TMP x x x
Alles anzeigen
Benutzerspezifische und die Computerspezifische Umgebungsvariable PATH auslesen
$objShell = ObjCreate("WScript.Shell")
$colSystemEnvVars = $objShell.Environment("System")
$colUserEnvVars = $objShell.Environment("User")
$str = _
"Computer-specific PATH Environment Variable:" & @LF & _
$colSystemEnvVars("PATH") & @LF & _
"User-specific PATH Environment Variable:" & @LF & _
$colUserEnvVars("PATH")
MsgBox(0, 'Path - Variablen', $str)
Umgebungsvariablen erstellen
Eine Umgebungsvariable mit dem Namen 'MeineVariable' mit den Anfangswert 0
$objShell = ObjCreate("WScript.Shell")
$colUserEnvVars = $objShell.Environment("User")
$colUsrEnvVars("MeineVariable") = 0
Variablen vom Typ 'user' und 'system' werden bei der Abmeldung des Benutzers gespeichert.
Es wird eine Umgebungsvariable vom Typ user mit dem Namen APP_VARIABLE erstellt und
deren Wert auf Installiert gesetzt. Danach fragt das Script den Wert der neu erstellen
Variable ab, um sicherzustellen, dass diese auch erstellt wurde.
$objShell = ObjCreate("WScript.Shell")
$colUsrEnvVars = $objShell.Environment("USER")
$colUsrEnvVars("APP_VARIABLE") = "Installiert"
MsgBox(0, 'Wert von APP_VARIABLE', $colUsrEnvVars("APP_VARIABLE"))
Änderung einer Umgebungsvariable von Typ user
$objShell = ObjCreate("WScript.Shell")
$colUsrEnvVars = $objShell.Environment("USER")
$strCurrentValue = $colUsrEnvVars("APP_VARIABLE")
$colUsrEnvVars("APP_VARIABLE") = "Aktualisiert"
MsgBox(0, 'Geänderter Wert von APP_VARIABLE', $colUsrEnvVars("APP_VARIABLE"))
Auswerten von Umgebungsvariablen
Über Umgebungsvariablen können Sie Systeminformationen abrufen. Wenn Sie zum Beispiel auf
den temporären Ordner des Benutzers zugreifen möchten, dann brauchen Sie die Pfadangabe für
diesen Ordner (beispielsweise C:\Temp).
Um den Wert einer Umgebungsvariable abzufragen, verwenden Sie die
Methode: WshShell.ExpandEnvironmentStrings.
Diese Methode erwartet als Parameter den in Prozentzeichen (%) eingeschlossenen Namen
der Umgebungsvariable als String und gibt deren Wert zurück.
Den Wert einer Umgebungsvariable und dann die ausgewertete Umgebungsvariable auslesen.
[autoit]
$objShell = ObjCreate("WScript.Shell")
$colEnvVars = $objShell.Environment("User")
$str = _
"Temporärer Ordner:" & @LF & _
$colEnvVars("TEMP") & @LF & _
"Temporärer Ordner (ausgewertet) " & @LF & _
$objShell.ExpandEnvironmentStrings("%TEMP%")
MsgBox(0, 'TEMP', $str)
Einträge im Ereignisprotokoll erzeugen
Spoiler anzeigen
Das WshShell-Objekt stellt hierzu die Methode LogEvent zur Verfügung.
Sie erzeugt einen Eintrag im Anwendungsprotokoll.
Bearbeitung und Auswertung des Protokolls sind hiermit nicht möglich.
LogEvent erwartet zwei Parameter.
Der erste Parameter ist ein Integerwert, der das Ereignis definiert,
der zweite Parameter gibt den Text für den Protokolleintrag an.
Optional als dritten Parameter: der Computername (wird unter Win95/98 ignoriert)
Wert Ereignistyp
0 Erfolgreich
1 Fehler
2 Warnung
4 Information
8 Erfolgsüberwachung
16 Fehlerüberwachung
Test Ereignisprotokoll
$objShell = ObjCreate("WScript.Shell")
With $objShell
.LogEvent(0,"Test Erfolgreich")
.LogEvent(1,"Test Fehler")
.LogEvent(2,"Test Warnung ")
.LogEvent(4, "Test Information ")
.LogEvent(8, "Test Erfolgsüberwachung ")
.LogEvent(16, "Test Fehlerüberwachung ")
EndWith
Schreiben und Lesen in der lokalen Registry
Spoiler anzeigen
Registrierungseinträge lesen
Methode RegRead
Die Betriebssystemversion auslesen
[autoit]
$objShell = ObjCreate("WScript.Shell")
$sngVersion = $objShell.RegRead _
("HKLM\Software\Microsoft\Windows NT\CurrentVersion\CurrentVersion")
MsgBox(0, 'Betriebssystemversion', $sngVersion)
Registry-Datentypen
REG_SZ String
REG_DWORD Number
REG_BINARY Binary Value
REG_EXPAND_SZ Expandable String
REG_MULTI_SZ Array of Strings
Wenn versucht wird mit RegRead nicht unterstützte Datentypen auszulesen,
führt dies zu einem Fehler.
Registrierungswert vom Datentyp Multistring (REG_MULTI_SZ) auslesen.
Die Informationen werden als String-Array zurückgegeben,
der in einer For-Each-Schleife ausgegeben wird.
$objShell = ObjCreate("WScript.Shell")
$arrValues = $objShell.RegRead _
("HKLM\SYSTEM\CurrentControlSet\Services\EventLog\Security\Sources")
$str = ''
For $strValue In $arrValues
$str &= $strValue & @LF
Next
MsgBox(0, 'Multistring', $str)
Registrierungseinträge erstellen oder ändern
Methode: RegWrite
Anmerkung: Der Datentyp REG_MULTI_SZ wird von der Methode RegWrite nicht unterstützt.
Einen DWORD-Eintrag erstellen
[autoit]
$objShell = ObjCreate("WScript.Shell")
$objShell.RegWrite("HKCU\TestKey\Version", 56, "REG_DWORD")
Registrierungseinträge löschen
Methode RegDelete
Löschen eines DWORD-Eintrags aus der Registrierung
$objShell = ObjCreate("WScript.Shell")
$objShell.RegDelete("HKCU\TestKey\Version")
Tastatureingaben an ein Programm schicken
Spoiler anzeigen
Methode: SendKeys (Zeichen als Parameter)
Zeichenkombinationen für Sondertasten mit SendKeys
Taste Wert für SendKeys
Rückschritt {BACKSPACE}, {BS}, oder {BKSP}
Pause {BREAK}
Feststelltaste {CAPSLOCK}
Entf. oder Entfernen {DELETE} oder {DEL}
Pfeil runter {DOWN}
Ende {END}
Eingabe {ENTER} oder ~
ESC {ESC}
Hilfe {HELP}
Pos1 {HOME}
Einf. oder Einfügen {INSERT} oder {INS}
Pfeil Links {LEFT}
NUM {NUMLOCK}
Bild runter {PGDN}
Bild hoch {PGUP}
Druck {PRTSC}
Pfeil links {RIGHT}
Rollen {SCROLLLOCK}
Tabulator {TAB}
Pfeil hoch {UP}
Hochstelltaste +
Steuerung (Strg) ^
Alt %
Alles anzeigen
Alle Funktionstasten werden über den Tastennamen in geschweiften Klammern
angegeben - zum Beispiel {F1} für die Taste F1 usw.
Editor öffnen, warten bis aktiv, dann Text senden
[autoit]
$objShell = ObjCreate("WScript.Shell")
With $objShell
.Run("Notepad.exe")
Do
$Success = $objShell.AppActivate("Editor")
Sleep(500)
Until $Success
.SendKeys("Dies ist ein Test.")
EndWith
Mit AppActivate wird der übergebene String mit allen Fenstertiteln verglichen.
Wenn keine Übereinstimmung gefunden wird, setzt AppActivate den Focus auf das Fenster,
dessen Titel mit dem übergebenen String beginnt. Wenn auch hier keine Übereinstimmung
gefunden werden kann, wird der Focus auf das Fenster gesetzt, dessen Titel mit dem String endet.
So wird sichergestellt, dass AppActivate auch mit Anwendungen funktioniert, in denen Dokumente
geöffnet werden können (wenn Sie zum Beispiel Notepad starten und ein neue Dokument öffnen, dann
lautet der Fenstertitel von Notepad 'Unbenannt -Editor' und nicht 'Editor'.
Nachrichtenfenster anzeigen
Spoiler anzeigen
Methode: Popup
.Popup(Text [,Timeout [,Titel [,Schalter]]])
$objShell = ObjCreate("WScript.Shell")
With $objShell
.Popup("Festplattenprüfung durchgeführt")
.Popup("Speicherprüfung durchgeführt")
.Popup("CPU-Prüfung durchgeführt")
EndWith
Symbole und Schalter in Nachrichtenfenstern
Sie haben die Möglichkeit, unterschiedliche Schalter und Symbole im Nachrichtenfenster anzeigen
zu lassen (zum Beispiel die Schalter Ja und Nein oder die Schalter Abbrechen, Wiederholen, Ignorieren).
Die Angezeigten Schalter und Symbole definieren Sie mit dem vierten Parameter der Methode Popup.
Er setzt sich auch einer Kombination von vordefinierten Konstanten zusammen - die beiden Werte werden einfach addiert.
Symbol Wert
Stop 16
Fragezeichen 32
Ausrufungszeichen 48
Information 64
Schalter Wert
OK 0
OK und Abbrechen 1
Abbrechen,
Wiederholen und Ignorieren 2
Ja, Nein und Abbrechen 3
Ja und Nein 4
Wiederholen und Abbrechen 5
Konstanten für den Standardschalter
Standardschalter Wert
Linker Schalter 0
Mittlerer Schalter 256
Rechter Schalter 512
Rückgabewerte der Tasten
Wert Schalter
1 OK
2 Abbrechen (bei OK, Abbrechen)
3 Abbrechen (bei Wiederholen, Abbrechen, Ignorieren)
4 Wiederholen
5 Ignorieren
6 Ja
7 Nein
Alles anzeigen
Kombinationen von Symbolen und Schaltern anzeigen
[autoit]
Const $TIMEOUT = 5
Const $POPUP_TITLE = "Symbole und Schalter "
$objShell = ObjCreate("WScript.Shell")
With $objShell
.Popup("Stop / Abbrechen(Focus), Wiederholen und Ignorieren ", _
$TIMEOUT,$POPUP_TITLE,16+2)
.Popup("Fragezeichen/ Ja, Nein und Abbrechen(Focus)", _
$TIMEOUT,$POPUP_TITLE,32+3+512)
.Popup("Ausrufungszeichen / Ja und Nein(Focus) ", _
$TIMEOUT,$POPUP_TITLE,48+4+256)
.Popup("Information / Wiederholen und Abbrechen(Focus) ", _
$TIMEOUT,$POPUP_TITLE,64+5+256)
EndWith