AutoIt: Terminal

Aus Wikibooks
Wikipedia hat einen Artikel zum Thema:
Wird von mir gemacht, bitte nur wenn's fertig ist was ändern.
Danke!!

--MatthiasG.

Was ist ein Teminal?[Bearbeiten]

Ein Terminal ist ein Programm, dass Kurzbefehle interpretiert (wie z.B. cmd.exe von Microsoft). Wir wollen nun selber ein ähnliches Programm schreiben.

Aufbau[Bearbeiten]

Als erstes machen wir eine grobe Strukturierung mit Regionen:

#Region Head
; hier kommen Includings, Optionen etc. hin.
#EndRegion Head

#Region GUI
; Hier schreiben wir später die GUI hinein
#EndRegion GUI

#Region Interpret
; Hier werden die Eingaben später interpretiert
#EndRegion Interpret

#Region Funktionen
; Hier kommen Funktionen hinein.
#EndRegion Funktionen

Die GUI[Bearbeiten]

Als nächstes bauen wir die GUI auf:

Wir definieren zunächst in der Region Head folgendes:

Opt("GUIOnEventMode", 1)
; Die einzelnen Elemente sollen Funktionen aufrufen.

In die Region GUI gehört erst ein Formular:

$Form1 = GUICreate("Command", 616, 269, -1, -1)
; das Fenster soll zentriert werden.
GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
; beim schließen soll die Funktion Form1Close ausgeführt werden
Global $Input1 = GUICtrlCreateInput("", 8, 240, 601, 21)
; Das Texteingabefeld, in das die Befehle eingetippt werden können.
GUICtrlSetOnEvent(-1, "Input1Change")
; Bei Änderung (also wenn ENTER gedrückt wird), soll der Befehl interpretiert werden
Global $Edit1 = GUICtrlCreateEdit("", 8, 8, 601, 225)
; Hier kommt die History rein.

Wir müssen nun die Includings einbinden:

#include <GuiEdit.au3>
#include <GUIConstantsEx.au3>

Starten des Terminals[Bearbeiten]

Das Terminal soll folgendermaßen aufgerufen werden: Eine beliebige Tastenkombination wird betätigt und die GUI wird angezeigt. Das setzt folgendes voraus:

  1. Das Programm muss im Hintergrund laufen
  2. Eine Tastenkombination muss definiert werden
  3. Das Programm muss die GUI immer zeigen wenn die Tastenkombination aufgerufen wird.
  4. Genau so sollte die GUI auch versteckt werden.

Als erstes definieren wir die Tastenkombination in der Region Head:

HotKeySet("^+c", "_show")
; Tastenkombination: Strg + SHIFT + c

Nun definieren wir die Funktionen _show und Form1Close in der Region GUI, da das noch zur GUI gehört!

Func _show()
	GUISetState(@SW_SHOW, $Form1)
EndFunc   ;==>_show

Func Form1Close()
	GUISetState(@SW_HIDE, $Form1)
EndFunc   ;==>Form1Close

Ein Vorteil von $GUI_EVENT_CLOSE ist: Die Funktion wird auch ausgeführt, wenn ALT + F4 oder STRG + W etc. gedrückt wird.

In die Region GUI gehört unter die GUI noch folgendes:

While 1
	Sleep(100)
WEnd

Das ist ein Leerlauf, der dafür sorgt, dass das Programm sich nicht beendet, wenn keine Befehle anstehen.

Interpretation[Bearbeiten]

Nun haben wir folgendes Skript:

#Region Head
#include <GuiEdit.au3>
#include <GUIConstantsEx.au3>

Opt("GUIOnEventMode", 1)
Opt("TrayIconHide", 1) ;Tray-Icon verstecken.

HotKeySet("^+c", "_show")
#EndRegion Head

#Region GUI
$Form1 = GUICreate("Command", 616, 269, -1, -1)
GUISetOnEvent($GUI_EVENT_CLOSE, "Form1Close")
Global $Input1 = GUICtrlCreateInput("", 8, 240, 601, 21)
GUICtrlSetOnEvent(-1, "Input1Change")
Global $Edit1 = GUICtrlCreateEdit("", 8, 8, 601, 225)

While 1
	Sleep(100)
WEnd

Func _show()
	GUISetState(@SW_SHOW, $Form1)
EndFunc   ;==>_show

Func Form1Close()
	GUISetState(@SW_HIDE, $Form1)
EndFunc   ;==>Form1Close
#EndRegion GUI

#Region Interpret

#EndRegion Interpret

#Region Funktionen

#EndRegion Funktionen

Ich habe noch das Tray-Icon versteckt. Nun müssen wir einen Interpreter einbauen. Das geschieht in der Funktion Input1Change(): Wenn ENTER gedrückt wird, sollen die Daten angenommen und interpretiert werden.

Ab jetzt werde ich immer die ganze Region Interpret angeben. Zuerst muss der Befehl in eine Variable geschrieben werden, dann wird er ins Edit geschrieben. Dann wird Input1 geleert. Wir werden anstelle der Variable ein Array nehmen, dann können der Funktion gleich Optionen mitgeliefert werden (wie z.B. shutdown \? in der Windows-Konsole).

#Region Interpret
Func Input1Change()
	Local $Answer = StringSplit(GUICtrlRead($Input1), " ")
	GUICtrlSetData($Input1, "")
	_GUICtrlEdit_AppendText($Edit1, "> " & _ArrayToString($Answer, " ", 1) & @CRLF)
EndFunc    ;==>Input1Change
#EndRegion Interpret

Als nächstes kommt der eigentliche Interpreter in Form einer Switch-Schleife:

#Region Interpret
Func Input1Change()
	Local $Answer = StringSplit(GUICtrlRead($Input1), " ")
	GUICtrlSetData($Input1, "")
	_GUICtrlEdit_AppendText($Edit1, "> " & _ArrayToString($Answer, " ", 1) & @CRLF)
	Switch $Answer[1] ; Die Main Funktion "switchen"
		Case "exit" ;  Wenn "exit", dann komplett beenden.
			Exit
		Case "execute" ; Zum ausführen von AutoIt-Zeilen.
			If $Answer[0] > 1 Then ; Wenn ein Befehl mitgeliefert wurde, dann...
				$Answer2 = _ArrayToString($Answer, "", 2)
			Else ; ...sonst...
				$Answer2 = InputBox("Input", "Command execute:", "", " ", "-1", "-1", "-1", "-1")
			EndIf
			Execute($Answer2) ; Zeile ausführen.
		Case "clear"
			GUICtrlSetData($Edit1, "") ; Edit1 löschen.
		Case "print"
			_GUICtrlEdit_AppendText($Edit1, _ArrayToString($Answer, "", 2)) ; Text anzeigen, der eingetippt wurde
		Case Else ;falls nichts zutrifft:
			_GUICtrlEdit_AppendText($Edit1, 'Fehler: "' & $Answer[1] & '" ist eine unbekannte Funktion!' & @CRLF)
	EndSwitch
EndFunc    ;==>Input1Change
#EndRegion Interpret

Das waren jetzt nur ein paar Grundfunktionen, die mir gerade eingefallen sind. Später mehr...

Funktionen[Bearbeiten]

Shutdown[Bearbeiten]

Wir werden nun eine Funktion anlegen, die den Computer herunterfahren oder was auch immer kann ;)

In die Switch-Schleife fügen wir einfach folgenden Code ein:

Case "shutdown"
	If Not $Answer[0] > 1 Then $Answer[2] = InputBox("Input", "Command Shutdown:", "shutdown", " ", "-1", "-1", "-1", "-1") ;Wenn nichts mitgelifert wurde, InputBox anzeigen.
	Switch $Answer[2] ; Zusatzbefehle:
		Case "logoff" ; Abmelden
			Shutdown(0)
		Case "shutdown" ; Herunterfahren
			Shutdown(1)
		Case "restart" ; Neustarten
			Shutdown(2)
		Case "energy" ; Energiesparmodus
			Shutdown(32)
		Case "sleep" ; Ruhezustand
			Shutdown(64)
		EndSwitch

Für diese Funktion benutzen wir AutoIts Shutdown()-Funktion.

Infos[Bearbeiten]

Nun wollen wir eine Funktion machen, die infos zu einem beliebigen Befehl anzeigt: In die Switch-Abfrage gehört folgender Code:

Case "info"
	If $Answer[0] > 1 Then ; Wenn kein Parameter mitübergeben wurde, else Teil ausführen: InputBox
		$Answer2 = _ArrayToString($Answer, "", 2)
	Else
		$Answer2 = InputBox("Input", "Command info:", "", " ", "-1", "-1", "-1", "-1")
	EndIf
	_GUICtrlEdit_AppendText($Edit1, $Answer2 & ": " & _info($Answer2) & @CRLF); Als nächstes wird derRückgabewert einer Funktion angezeigt (s.u.).

Die im Skript beschriebene Funktion müssen wir erst einmal definieren (und das in der Region Funktionen):