Windows

Anleitung: Windows-GUIs für Kommandozeilen-Tools bauen

Echte Programmierer müssen jetzt ganz stark sein: Es folgt eine Anleitung, um Kommandozeilen-Tools unter Windows mit einer grafischen Oberfläche zu nutzen. Mit einem ganz armseligen Programmierkonzept. Aber: Es können auch Einsteiger sinnvolle Tools basteln. Es geht nicht darum, großartige Funktionen selbst zu programmieren. Sondern darum, fertige Programme in eine grafische Oberfläche einzubinden. Das können eigene/kopierte einfache/komplexe Skripte sein oder Tools, die sonst in der Eingabeaufforderung von Windows genutzt werden.

Was braucht es dazu?

Für unseren Supersimpel-Ansatz benötigt Ihr drei Dinge: Erstens ein Programm – als Beispiel nehmen wir das simple Tool tr, mit dem sich Zeichen in Texten austauschen lassen. Zweitens benötigt Ihr ein Batch-Skript, das das Programm mit Parametern (hier: Text, auszutauschende Zeichen) ausführt. Und zum Dritten fehlt noch die GUI, über die Ihr die Parameter eingebt und das Skript aufruft.

Warum der Umweg über Batch-Skripte? Ganz einfach: A, zum Aufrufen von externen Programmen sind Batch-Skripte nun mal gedacht. B, es ist einfach. C, Ihr könnt Skripte unabhängig von der GUI bearbeiten und es muss nie etwas kompiliert werden. Ihr könntet sogar alle Skripte komplett ändern – sofern die Namen bestehen bleiben, funktioniert auch die GUI.

Womit? Und wie viel Programmiererei? Für die GUI kommt AutoHotkey zum Einsatz. Das dürfte eine der einfachsten und definitiv eine der zuverlässigsten Möglichkeiten sein. Die Open Source Software gibt es schon ewig, ist hier auf dem Rechner nicht mehr wegzudenken und ist vor allem einfach, einfach, einfach. (Kleines Beispiel: Mit folgendem Code, ohne sonstigen Text, hättet Ihr bereits ein funktionierendes Skript, das die Abkürzung „u.a.“ automatisch in „unter anderem“ ändert, sobald Ihr sie tippt: „u.a.::unter anderem“.) Mehr AutoHotkey-Spielereien haben wir hier.

Projekt im Detail: Gebaut wird eine AutoHotkey-GUI mit dem WYSIWYG-Editor AutoGUI – installiert also beides. Ihr seht, wie man eine Datei auswählt sowie Buttons und Eingabefelder einbaut, über welche dann Skripte mit Parametern gestartet werden. Anzahl der Code-Zeilen: 6. Hinzu kommt ein Skript mit 3 Zeilen. Hier seht Ihr, wie man von der GUI übergebene Werte aus den Eingabeldern im Batch-Skript nutzt. Zudem lernt Ihr den Umgang mit tr – was ungefähr 2 Sekunden dauert. tr findet Ihr als Teil des Pakets UnxUtils – gemeinsam mit 117 weiteren Tools, die wir Euch hier vorstellen. Ihr könnt die tr.exe in denselben Pfad legen wie das Skript, besser Ihr fügt solche Tools dem Windows-Pfad hinzu.

autohotkey gui windows
Das fertige Programm: Die GUI und im Hintergrund der Dateiauswahl-Dialog.

1. Batch-Skript erstellen

Das macht das Skript: Die über die GUI übergebene Datei wird zunächst mit der Endung „.bak“ als Backup gespeichert – könnt Ihr natürlich weglassen. Anschließend tauscht tr zwei Buchstaben in der angegebenen Datei. Dann wird alles in eine temporäre Datei mit der Endung „.tmp“ geschrieben, die dann wieder zum originalen Dateinamen (also ohne .tmp) umbenannt wird. Einfach weil das Skript die Datei nicht direkt verändern kann.

copy %3 %3.bak
tr %1 %2 < %3 > %3.tmp && move %3.tmp %3

Wichtig: Das %3 ist die Variable, in der der Name der in der GUI gewählten Datei gespeichert ist. Ihr könntet eine Datei auch per Drag&Drop auf Skripte ziehen – da es dann nur ein Argument gibt, würde der Dateiname (samt Pfad) in %1 landen. In den Variablen %1 und %2 landen das auszutauschende Zeichen und das neue Zeichen. So dass der tr-Aufruf dann in etwa „tr x u datei.txt“ lautet.

Beispiel: In der GUI werdet Ihr später über zwei Eingabefelder x und u eingeben und über einen normalen Windows-Dateiauswahl-Dialog etwa die Datei C:\foo\bar.txt auswählen. Folgendes würde dann ausgeführt:

copy C:\foo\bar.txt C:\foo\bar.txt.bak
tr x u < C:\foo\bar.txt > C:\foo\bar.txt.tmp && move C:\foo\bar.txt.tmp C:\foo\bar.txt

Die Befehle sollten klar sein: copy erstellt die .bak-Kopie, tr tauscht die Buchstaben, „< “ liest die übergebene Datei ein, „>“ speichert das Ergebnis von tr in der temporären .tmp-Datei und move benennt die .tmp-Datei wieder um, entfernt also das .tmp.

Auf diese Weise könnt Ihr natürlich andere Tools nutzen, tauschen müsst Ihr nur den tr-Aufruf. Wenn das Skript nur eine Datei bekommt, aber keine weiteren Parameter, ist es noch einfacher. Wenn Ihr beispielsweise alle Tabs gegen Leerzeichen tauschen wollt, genügt in der GUI ein einziger Button und das Skript sähe so aus:

copy %1 %1.bak
tr \t " " < %1 > %1.tmp && move %1.tmp %1

Dieses mal landet der Dateiname (also „C:\foo\bar.txt“) in der Variablen %1. Bei tr steht das \t für Tabs und “ “ eben für Leerzeichen. Für dieses Tutorial fahren wir aber mit dem obigen Beispiel fort, schließlich sollen auch Eingabefelder mit rein.

2. GUI erstellen

AutoGUI ist übrigens selbst ein AutoHotkey-Skript, startet also die AutoGUI.ahk-Datei. Startet eine neue GUI über das Datei-Menü, den Button mit dem + oder ALT+G.

autohotkey gui windows
Eine neue leere GUI.

Klickt jetzt links in der Liste auf den Button und dann in das leere Fenster, um ihn zu platzieren. Ruft das Kontextmenü auf und wählt Properties aus.

autohotkey gui windows
WYSIWYG-Editor für Programmoberflächen – so einfach kann Entwicklung sein ;)

Vergebt einen Text für den Button, etwa Tauschen und tragt bei g-Label ebenfalls tauschen ein (muss aber nicht derselbe Text sein). Über den g-Label wird der Button später angesprochen.

autohotkey gui windows
Über den g-Label wird ein Button später angesprochen.

Fügt nun zwei Elemente vom Typ Edit Box ein und vergebt wiederum Vorgabetexte; das g-Label braucht Ihr nicht vergeben.

autohotkey gui windows
Im Properties-Dialog findet Ihr alle Elemente der GUI.

Und damit ist die GUI soweit fertig. Natürlich könnt Ihr das Fenster noch ausgestalten, Schriftarten ändern, Bilder einfügen und überhaupt, eine schöne GUI bauen – aber funktionieren wird es auch jetzt schon.

autohotkey gui windows
Zwei Edit Fields für die Eingabe, fertig ist die GUI.

3. Funktionen in GUI bauen

Nun geht es an den Code. Ein wichtiger Warnhinweis: Im von AutoGUI erstelltem Code steht unten die Zeile „Do not edit above this line“. Ändert nichts überhalb der Zeile! Ansonsten wird das Vorschaufenster für immer verschwinden – es kommt nicht wieder, versprochen. Auch nicht mit Strg+Z. Lasst es einfach ;) Und überhaupt: Erstellt regelmäßig Backups.

Hier zunächst der ganze Code für unterhalb der Zeile:

tauschen:
ControlGet, OriginalVar, Line, 1, Edit1
ControlGet, SubstituteVar, Line, 1, Edit2

FileSelectFile, file , , , Suche eine Datei
if file =
{
    MsgBox, Du willst also nicht.
    return
}

Run tauschen.bat %OriginalVar% %SubstituteVar% %file%
return

Über tauschen: wird der g-Label des Buttons angesprochen – wird der Button geklickt, wird der folgende Code ausgeführt.

ControlGet holt den Wert eines Control-Elements, hier also den Buchstaben, den Ihr später in das Eingabefeld (Edit Field) eingebt. Gespeichert wird in der Variablen OriginalVar, die Ihr aber beliebig benennen könnt. Über Line, 1 wird die erste Zeile abgefragt (hier irrelevant) und Edit1 ist der Name des Eingabefelds.
Tipp: Die Namen der Elemente seht Ihr in der Statusleiste des Hauptfensters, wenn Ihr den Mauszeiger über die Elemente im Vorschaufenster bewegt. Alternativ könnt Ihr im Properties-Dialog blättern.
Anschließend wird das zweite Feld mit dem einzusetzenden Buchstaben abgefragt und der Wert in SubstituteVar gespeichert.

autohotkey gui windows
Unten seht Ihr die Bezeichnung für das Feld unter dem Mauszeiger.

FileSelectFile ruft den Standard-Dateiauswahl-Dialog von Windows auf und speichert den Dateinamen (beziehungsweise -Pfad) in der Variablen file. Es folgen ein paar ausgelassene Optionen und der Fenstertitel Suche eine Datei.

Die if-Abfrage ist nur für den Fall gedacht, dass Ihr keine Datei auswählt und auf Abbrechen klickt: Wenn die Variable file also leer ist (wegen Abbruch), erscheint eine Hinweis-Box (MsgBox) mit dem Text „Du willst also nicht.“.

Run ruft dann das gewünschte Skript auf und zwar mit den drei Variablen: %OriginalVar% beinhaltet den Original-Buchstaben und landet in der Batch-Datei in der Variablen %1. %SubstituteVar% beinhaltet den neuen Buchstaben und landet in der Batch-Datei folgerichtig in der Variablen %2. Und, Ihr ahnt es, %file% beinhaltet den Dateipfad und wird in der Batch über %3 angesprochen.

return beendet das ganze. Im Verzeichnis der Originaldatei „bar.txt“ findet Ihr nun also eine geänderte „bar.txt“ sowie eine „bar.txt.bak“ mit dem originalen Inhalt.

Folgende verwirrende Grafik zeigt links das AutoGui-Skript, in der Mitte die fertige GUI, direkt darunter den Dateiauswahl-Dialog und rechts das Batch-Skript. Alle Einzelteile, Buttons, Funktionen und Variablen, sind jeweils in farbigen Kästen. Alles was die gleiche Farbe hat, hängt zusammen. Ja, das könnte man schöner aufbereiten, aber immerhin; ist auch nur ein Nachtrag ;)

verwirrbild
Gleiche Farben gehren zusammen. Ja, nehmt Euch ruhig ein paar Sekunden Zeit …

4. Testen und erstellen

Ihr könnt das Programm jederzeit direkt mit F9 starten und ausprobieren. Wenn Ihr zufrieden seid, habt Ihr zwei Möglichkeiten: Entweder Ihr startet einfach direkt das erstellte AHK-Skript – geht natürlich nur, wenn AutoHotkey installiert ist. Oder Ihr kompiliert das Skript, wandelt es also zu einer EXE-Datei um. Diese könntet Ihr dann mit den Skripten und den Kommandozeilen-Tools in ein ZIP packen und überall benutzen. Oder ohne die Tools, sofern sie auf dem Zielsystem installiert/im Windows-Pfad sind.

autohotkey gui windows
Beim Kompilieren könnt Ihr auch ein eigenes Icon verwenden.

Wie geht es weiter?

Mit AutoHotkey könnt Ihr auch GUIs erstellen, die Drag&Drop unterstützen – bei Interesse einfach einen Kommentar hinterlassen, Anleitung folgt dann. Ihr könnt wunderbar mit mächtigen Werkzeugen wie dem Texteditor sed arbeiten, was allein schon Tausende praktische Tools ermöglicht. Generell könnt Ihr so eine Simpel-GUI schlicht als Starter für ein einziges Tool nutzen und beispielsweise Eure 10 Lieblings-sed-Befehle auf Buttons legen.

Das Wichtigste habt Ihr aber gelernt: Variablen einlesen (ControlGet), Button-Aktionen auslösen (g-Label), Skripte aus der GUI starten (Run) und Variablen externen Skripten zu übergeben (%Variable1% aus der GUI wird %1 im Batch-Skript). Einfachere Syntax werdet Ihr nicht finden, AutoHotkey ist hier ein König! Und die Batch-Skripte erledigen ja nur das Schreiben der Dateien. Die eigentliche Arbeit findet in den aufgerufenen Tools, hier tr, statt.

Klugscheisser-Nachtrag

An diesem Vorgehen gibt es bestimmt Vieles zu verbessern oder komplett umzukrempeln. Aber nochmal: Es sollte einfach sein. Der wohl offensichtlichste Einwand: Was tr oben leistet, leistet auch sed – wenn auch mit komplizierterer Syntyax. Dafür bietet sed automatische Backups und kann direkt in Dateien schreiben, was dieses ständige Erstellen von Dateien eindämmen würde. Jedoch: Nicht nur die Syntyax spricht dagegen, die Windows-Version von sed ist leider nicht identisch mit der Linux-Variante, so fehlt etwa die Backup-Funktion. Und Tabs ansprechen geht auch nicht. Schade eigentlich.

Und ja, bestimmt kann man das alles viel performanter, eleganter und professioneller mit Python lösen, oder AutoIT, oder BlaFooScript. Aber wer hier geht es ja vor allem um Menschen, die Kommandozeilen-Tools hier und da nutzen, aber nicht unbedingt ITler sind. Doof ist zum Beispiel, dass man die Syntax von CLI-Tools ständig vergisst, wenn man sie nur drei mal im Jahr nutzt. Über so eine GUI lassen sich Standardaufgaben wunderbar vereinfachen. Und generell ist Batch einfach einfach. Und da AutoHotkey auf so ziemlich jede überflüssige Syntax verzichtet, ist das eine super Kombi.

Ein paar praktische Ideen gefällig? Wie wäre es mit dem Umwandeln von Tabs in Leerzeichen? Oder dem Extrahieren von URLs aus 400 Dokumenten? Oder dem Vergleichen von Texten? Oder wilden Formatierungen?

Mirco Lang

Freier Journalist, Exil-Sauerländer, (ziemlich alter) Skateboarder, Dipl.-Inf.-Wirt, Einzelhandelskaufmann, Open-Source-Nerd, Checkmk-Handbuchschreiber. Ex-Saturn'ler, Ex-Data-Becker'ler, Ex-BSI'ler. Computer-Erstkontakt: ca. 1982 - der C64 des großen Bruders eines Freunds. Wenn Ihr hier mehr über Open Source, Linux und Bastelkram lesen und Tutonaut unterstützen möchtet: Über Kaffeesponsoring via Paypal.freue ich mich immer. Schon mal im Voraus: Danke! Nicht verpassen: cli.help und VoltAmpereWatt.de. Neu: Mastodon

2 Kommentare

  1. Hey, ich danke dir für dieses Tutorial. Ich bin zur Zeit am Anfang meines ersten Lehrjahres als auszubildender Anwendungsentwickler und habe die Aufgabe bekommen, eine GUI zu erstellen. Du hast geschrieben, dass man diese Datei dann mit den Skripten und den Kommandozeilen-Tools in ein ZIP packen und überall benutzen kann, könntest du mir erklären, wie es funktioniert?
    Ich hoffe, ich kann dich überhaupt noch erreichen. ^^

    Danke vielmals
    Robin Hallmann

    1. Du hast ja am Ende drei Teile:
      – die GUI selbst (zum Beispiel als EXE),
      – das Batch-Skript, das über den GUI-Code aufgerufen wird
      – und das Tool „tr.exe“ (Link im Abschnitt „Projekt im Detail“).

      Sofern die drei Dateien in Deinem Projekt alle im selben Pfad liegen, kannst Du sie einfach mit 7-Zip, WinZip oder sonst einem Archivierer in eine ZIP-Datei packen, sprich: Alle drei im Explorer markieren und per Kontextmenü ein ZIP erstellen.

      Auf dem Zielrechner könntest Du dann einfach das ZIP wieder entpacken und die GUI starten: tr benötigt keine weiteren Abhängigkeiten, die tr.exe genügt. Genauso verhält es sich mit dem Batch-Skript. Und sofern die GUI als EXE kompiliert ist, läuft auch diese ohne weitere Installationen.

      P.S.:
      Wenn die Aufgabe lediglich „Erstelle eine GUI“ lautet, muss die GUI vielleicht gar nicht mit Funktionen „belastet“ werden. Für das reine Design könntest Du auch auf so genannte Mockup-Tools zurückgreifen. Damit lassen sich einfach per Maus GUIs bauen, die zwar nichts können, aber professionell aussehen – und zwar in wenigen Minuten. Klingt vielleicht nach cheaten, aber letztlich sind GUI-Erstellung und Logik-Programmierung zwei unabhängige Aufgaben ;)
      Stichworte zum Suchen: Mockup, Wireframing, Prototyping.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre mehr darüber, wie deine Kommentardaten verarbeitet werden.

Schaltfläche "Zurück zum Anfang"
Schließen

Ooopsi!

Bitte deaktiviere Deinen Adblocker.