Objekt: WScript.Shell

    • 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.

    [autoit]

    $objShell = ObjCreate("WScript.Shell")

    [/autoit]
    Code
    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


    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.

    [autoit]


    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

    [/autoit]


    Notepad maximiert starten

    [autoit]


    $objShell = ObjCreate("WScript.Shell")
    $objShell.Run("notepad.exe", $MAXIMIZE_WINDOW)

    [/autoit]


    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

    [autoit]


    $objShell = ObjCreate("WScript.Shell")
    $objShell.Run("calc.exe", 1, True)
    MsgBox(0, '', "Script completed.")

    [/autoit]


    Ausführen von Kommandozeilentools
    möglich mit Run und Exec
    %comspec% /k Kommandozeilenfenster bleibt offen
    %comspec% /c Kommandozeilenfenster wird geschlossen

    [autoit]


    $objShell = ObjCreate("WScript.Shell")
    $objShell.Run("%comspec% /K dir", 1, True)

    [/autoit]


    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

    [/autoit]


    Konfiguration Netzwerkadapter abfragen

    [autoit]


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

    [/autoit]

    Verknüpfungen

    Spoiler anzeigen


    Objekt WshShortcut


    Verknüpfung zum Windows-Taschenrechner auf dem Desktop
    Zusätzlich Tastenkombination STRG-HOCHSTELLTASTE+T

    [autoit]


    $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

    [/autoit]


    Verknüpfung zur AutoIt-URL auf dem Desktop

    [autoit]


    $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

    [/autoit]


    Element zur Schnellstartleiste hinzufügen

    [autoit]


    $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

    [/autoit]


    Löschen von Verknüpfungen

    [autoit]


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

    [/autoit]

    Spezialordner (Collection SpecialFolders)

    Spoiler anzeigen


    Hiermit kann AUSSCHLIESSLICH der Pfad des Ordners abgefragt werden.


    Speicherort des Spezialordners 'Fonts'

    [autoit]


    $objShell = ObjCreate("WScript.Shell")
    $strFontDirectoryPath = $objShell.SpecialFolders.Item("Fonts")
    MsgBox(0, "Pfad zum Ordner Font", $strFontDirectoryPath)

    [/autoit]


    Verknüpfung mit SciTE im Spezialordner 'Senden an' erstellen
    um z.B. htm-Dateien per Kontextmenü in SciTE zu öffnen

    [autoit]


    $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

    [/autoit]

    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.

    Code
    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.


    Benutzerspezifische und die Computerspezifische Umgebungsvariable PATH auslesen

    [autoit]


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

    [/autoit]


    Umgebungsvariablen erstellen
    Eine Umgebungsvariable mit dem Namen 'MeineVariable' mit den Anfangswert 0

    [autoit]


    $objShell = ObjCreate("WScript.Shell")
    $colUserEnvVars = $objShell.Environment("User")
    $colUsrEnvVars("MeineVariable") = 0

    [/autoit]


    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.

    [autoit]


    $objShell = ObjCreate("WScript.Shell")
    $colUsrEnvVars = $objShell.Environment("USER")
    $colUsrEnvVars("APP_VARIABLE") = "Installiert"
    MsgBox(0, 'Wert von APP_VARIABLE', $colUsrEnvVars("APP_VARIABLE"))

    [/autoit]


    Änderung einer Umgebungsvariable von Typ user

    [autoit]


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

    [/autoit]


    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)

    [/autoit]

    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)

    Code
    Wert   Ereignistyp
     0     Erfolgreich
     1     Fehler
     2     Warnung
     4     Information
     8     Erfolgsüberwachung
    16     Fehlerüberwachung


    Test Ereignisprotokoll

    [autoit]


    $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

    [/autoit]

    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)

    [/autoit]



    Registry-Datentypen

    Code
    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.

    [autoit]


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

    [/autoit]


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

    [/autoit]


    Registrierungseinträge löschen
    Methode RegDelete
    Löschen eines DWORD-Eintrags aus der Registrierung

    [autoit]


    $objShell = ObjCreate("WScript.Shell")
    $objShell.RegDelete("HKCU\TestKey\Version")

    [/autoit]

    Tastatureingaben an ein Programm schicken

    Spoiler anzeigen


    Methode: SendKeys (Zeichen als Parameter)

    Zeichenkombinationen für Sondertasten mit SendKeys


    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

    [/autoit]


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

    [autoit]


    $objShell = ObjCreate("WScript.Shell")
    With $objShell
    .Popup("Festplattenprüfung durchgeführt")
    .Popup("Speicherprüfung durchgeführt")
    .Popup("CPU-Prüfung durchgeführt")
    EndWith

    [/autoit]


    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.

    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

    [/autoit]
  • :klatschen:
    Wirklich, 1a erklärt, habe sogar ich begriffen, ... glaub' ich doch :D

    Wenn das ganze nochmal anhand von FSO erkärt werden kann, dann wäre das spitze ...

    Danke BugFix, klasse Arbeit !!!


    Gruß
    Greenhorn