MS-DOS Forum

MS-DOS Forum
Anleitungen, Referenz aller DOS Befehle, Batch Dateien
 
RegistrierenRegistrieren  LoginLogin

Neues Thema eröffnen   Neue Antwort erstellen    MS-DOS Forum Foren-Übersicht -> Batch Programmierung
Autor
Nachricht
matthias





ANSI Sequenzen in Batch Dateien
Verfasst am: 15.06.2009, 11:15

Mit den beruehmten ANSI-Sequenzen lassen sich Farben und CursorSteuerungen
in BAT-Dateien realisieren. Ausserdem koennen Tasten
umbelegt bzw. mit Befehlen belegt werden (naechste Lektion) und
der Video-Modus gewaehlt werden (Naeheres s. DOS-Handbuch).
Voraussetzung ist der Konsol-Treiber ANSI.SYS (oder ein Ersatz),
der in der CONFIG.SYS installiert wird. Ueber diesen Treiber
gehen alle DOS-Bildschirmausgaben und -Tastatureingaben, so dass
hier bestimmte Bildschirm-Aktionen oder Tasten-Umwandlungen
gesteuert werden koennen.
Die dazu erforderlichen Befehle sind irgend wann einmal vom
American National Standards Institute ("ANSI"), also einer Art
DIN-Behoerde der USA, definiert worden.
Die Befehle werden als "ANSI-Sequenzen" per DOS-Ausgabe an den
Bildschirm geleitet und vom Konsol-Treiber abgefangen. Damit
ANSI.SYS einen Befehl erkennt, muss dieser mit den zwei Code-Bytes
ESCAPE und "[" beginnen. Danach folgen die Befehlsinformationen,
und als letztes immer ein Buchstabe, der die Art des Befehls
bestimmt.
Beim ESCAPE-Zeichen gibt's in kleines Problem: In der BAT-Datei
muss ein Byte mit dem Wert 27 (dez) bzw. 1B (hex) gespeichert
werden. Wie das eingegeben wird, haengt vom jeweiligen Editor ab.
Eines der folgenden Verfahren fuehrt normalerweise zum Erfolg:
* ALT gedrueckt halten und Dezimal-Code (27) im Ziffernblock der
Tastatur eingeben
* Prefix Control+P, um zu signalisieren, dass der anschliessende
Control-Code (ESC-Taste oder ALT-Prozedur wie oben) als Zeichen
gespeichert werden soll.
Was dann auf dem Bildschirm erscheint, ist ein kleiner Pfeil nach
links (von IBM wurden auch den Control-Codes bestimmte Zeichen
zugeordnet). Manche Editoren zeigen auch ^[ - also eine 2-Byte-
Sequenz, wobei die eckige Klammer zufaellig das selbe Symbol ist,
das als naechstes Byte der ANSI-Sequenz folgen muss.
!! Da hier in diesem Text das ESC-Zeichen nicht verwendet
!! werden kann, wird in allen folgenden Beispielen das Zeichen
!! "#" an dessen Stelle gesetzt, also z.B.:
#[40;37m
^-------------- hier ESC-Code!

Grundsaetzlicher Aufbau einer ANSI-Sequenz

Nach den beiden Erkennungsbytes - #[ - folgen dezimale Zahlenangaben
(0...255), und zwar entweder mehrere, nur eine oder auch
gar keine. Falls mehrere Zahlenangaben erforderlich sind, muessen
sie durch ein Semikolon getrennt werden. Die gesamte Sequenz darf
keine Leerzeichen enthalten.
Den Abschluss der ANSI-Sequenz bildet ein Buchstabe. Gross-/Kleinschreibung
wird hier unterschieden - also aufpassen!
Beispiele: #[K
#[3A
#[30;47;1m
Die ANSI-Sequenzen koennen an beliebiger Stelle in Textausgaben
eingesetzt werden, normalerweise im ECHO-Befehl. Grundsaetzlich
koennen die Sequenzen aber in DOS-Bildschirmausgaben von jedem
Programm verwendet werden.
ANSI-Sequenzen sind nicht auf der DOS-Befehlsebene nutzbar, da
ESCAPE hier nicht als Zeichen akzeptiert wird.

Funktionen: Cursor

* Cursor relativ bewegen, ausgehend von der aktuellen Position:
#[1A 1 Zeile aufwaerts
#[3B 3 Zeilen abwaerts
#[25C 25 Spalten nach rechts
#[12D 12 Spalten nach links
Bei zu grossen Werten wird der Cursor an die aeusserste
moegliche Position gesetzt (!). Bei fehlenden Werten gilt 1.
#[80D an den Zeilenanfang (egal von wo)
#[A 1 Zeile aufwaerts
* Cursor absolut setzen (Zeile;Spalte).
#[0;0H Zeile 0, Spalte 0 (linke obere Ecke)
#[12;33H Zeile 12, Spalte 33
Bei ungueltigen Angaben wird der Befehl ignoriert.
Fehlende Angaben werden durch Null ersetzt, z.B.:
#[H Cursor Home (linke obere Ecke)
Zu allen Cursor-Positionierungen bitte beachten: Eine ECHOAusgabe
wird immer mit CR+LF abgeschlossen. Der Cursor geht
also an den Anfang der naechsten Zeile. Soll ein Text an eine
bestimmte Stelle positioniert werden, muss er unmittelbar auf
den Cursor-Befehl folgen, z.B.:
ECHO #[0;30Hhier ist Position 30 in der oberen Zeile

* Position speichern/wiederherstellen
#[s ANSI merkt sich die aktuelle Position
#[u Gespeicherte Position wird wiederhergestellt
Wenn der Bildschirm zwischendurch scrollt, stimmt die Position
natuerlich nicht mehr.

Funktionen: Loeschen

#[2J Bildschirm loeschen und Cursor Home (0;0)
(die "2" ist eine Konstante!)
#[K Zeile ab aktueller Position loeschen
(grosses "K")

Funktion: Farben

Fuer Farben und "Attribute" gibt es folgende Zahlen-Codes:
Zeichen: Grund: Farbe: | Attribute
30 40 schwarz | 0 weiss auf schwarz
31 41 rot | 1 helle Zeichen
32 42 gruen | 5 blinkend
33 43 braun/gelb | 7 schwarz auf weiss
34 44 blau | 8 schwarz auf schwarz
35 45 magenta (violett) |
36 46 zyan (tuerkis) |
37 47 weiss |
Alle Farb-Sequenzen werden durch ein kleines "m" abgeschlossen.
Beispiele:
#[0m normalisieren (weiss auf schwarz)
#[0;1m hell weiss auf schwarz
#[37;40;1m das selbe
#[31;40m rot auf schwarz
#[31;44;1m hell rot auf blau
Alle Farben sowie die Attribute 1 und 5 koennen auch einzeln
angegeben werden, wenn die uebrigen Werte unveraendert bleiben
sollen:
#[37m weisse Zeichen, Grund und Helligkeit bleiben
#[1m helle Zeichen, Farben bleiben
Achtung!
Die Funktionsweise der Attribute ist nicht besonders logisch.
* Attribut 0 (Null) setzt nicht nur alle anderen Attribute
zurueck, sondern auch die Farben (weiss auf schwarz).
* Um 1 (hell) oder 5 (blinkend) zurueckzusetzen, muessen also
bei Bedarf die Farben erneut angegeben werden (und zwar NACH
der Null), z.B.:
#[0;36;40m normal tuerkis auf schwarz
* Attribut 7 soll offiziell "invertieren", macht aber immer
schwarz auf weiss, egal was vorher war. Die gesetzten Werte
fuer hell und blinkend bleiben erhalten.
* Attribut 8 soll "verstecken" (unsichtbar machen), aber falls
Attribut 1 gesetzt war, wird *hell* schwarz auf schwarz
produziert (und das ist nicht unsichtbar).
Die ANSI-Farbbefehle gelten fuer alle folgenden Zeichen-Ausgaben
sowie fuer Loeschbefehle und neue Zeilen beim Scrolling. (Mit dem
ANSI-Befehl selbst wird also zunaechst auf dem Bildschirm nichts
veraendert). Beispiel:
#[37;44;1m#[2J hiermit wird der Bildschirm fuer hell weisse
Zeichen auf blauem Grund vorbereitet und dann
geloescht.

ECHO off

Bei Verwendung von ECHO-Befehlen mit ANSI-Sequenzen sollte darauf
geachtet werden, dass ECHO OFF ist, sonst werden alle Befehle
doppelt an den Konsol-Treiber gegeben.
ANSI-Grafik

Fuer aufwendige Bildschirm-Gestaltungen empfiehlt es sich, Text
und ANSI-Sequenzen in einer separaten ASCII-Datei unterzubringen,
die dann per TYPE ausgegeben wird. Das macht die Batch-Datei
uebersichtlicher und geht ausserdem schneller. Fuer ganz Eilige
gibt es auch TYPE-Ersatzprogramme, die noch um ein Vielfaches
schneller sind als DOS.
Uebrigens: ANSI-Grafiken gibt's massenweise in den Mailboxen.

Konsol-Treiber

Als Ersatz fuer ANSI.SYS sind diverse Alternativen im Umlauf,
die - wie koennte es anders sein - schneller sind, zusaetzliche
Funktionen bieten und weniger Speicher brauchen.

Prompt

Auch bei der Definition des Prompts (PROMPT-Anweisung) koennen
ANSI-Sequenzen eingebaut werden. Hier wird jedoch anstelle des
ESCAPE-Codes die Zeichenfolge "$e" verwendet. Naeheres s. DOSHandbuch.
Zum Schluss noch ein Goody:
@echo off
echo #[0;5mÛÛ#[7mÛÛ#[0m bitte warten!
:: ^^----^^--------------------- ASCII Code 219
pause > nul (zum Testen)
echo #[A#[K

ANSI Sequenzen (Tastatur)

Die Anweisung dazu wird, ebenso wie alle anderen ANSIBefehle,
per DOS-Bilschirmausgabe an den Konsoltreiber geschickt.
Abschluss-Buchstabe der Sequenz fuer Tasten-Umbelegung ist das
keine "p".
Nochmal der Hinweis (s. Lektion 17):
!! Da hier in diesem Text das ESC-Zeichen nicht verwendet
!! werden kann, wird in allen folgenden Beispielen das Zeichen
!! "#" an dessen Stelle gesetzt, also z.B.:
#[36;156p
^-------------- hier ESC-Code!
In obigen Beispiel wird der ASCII-Tasten-Code 36 ("$") durch das
"oe"-Zeichen (Code 156) ersetzt. Anstelle der dezimalen Zahlen
koennen hier aber auch die Zeichen selbst verwendet werden, und
zwar in (einfachen oder doppelten) Anfuehrungsstrichen:
#["$";'oe'p

Funktionstasten

Funktionstasten und sonstige Tasten, die kein ASCII-Zeichen
abgeben (z.B. Cursor-Tasten) werden durch zwei Zahlen bestimmt,
von denen die erste immer Null ist. Beispiel:
#[0;59;0;80p Die Funktionstaste F1 (Code 59) wird mit
---- ---- Cursor abwaerts (Code 80) belegt.
Die Tasten-Codes sind in entsprechenden Tabellen (u.a. im DOSHandbuch)
zu finden. Es gibt auch kleine Utilities, die den Code
jeder gedrueckten Taste zeigen.

Tastenfolge zuweisen

Die neue Tasten-Belegung darf auch mehrere Zeichen oder Tasten-
Codes enthalten, und zwar als Folge von dezimalen Werten oder als
String in Anfuehrungszeichen (auch gemischt).
#[0;59;"chkdsk";13p

Die Taste F1 ist hier mit dem Befehl CHKDSK belegt, inklusive
anschliessendem ENTER (CR: ASCII Code 13).

Umbelegung rueckgaengig machen

Wenn keine neue Tasten-Zuweisung angegeben wird, stellt ANSI.SYS
den Original-Code der Taste wieder her.
#["$"p Originalzustand der $-Taste
#[0;59p F1-Taste liefert wieder den Code 59

Edit-Tasten bei DOS-Eingabe

Funktionstasten sind unter DOS standardmaessig mit bestimmten
Editier-Funktionen belegt, z.B. liefert die Taste F1 schrittweise
die Zeichen des letzten eingegebenen Befehls.
Diese Standard-Funktionen werden natuerlich durch Umbelegung per
ANSI-Sequenz aufgehoben, koennen aber wieder aktiviert werden,
indem der Taste der Original-Code zugewiesen wird.
#[0;59;"copy "p eine Umbelegung
#[0;59;0;59p DOS-Editierfunktion wiederherstellen
#[0;59p KEINE Belegung (Taste liefert F1-Code)

DOS- und BIOS-Input

Die Tasten-Umbelegungen per ANSI sind nur wirksam, wenn DOS-Input-
Funktionen benutzt werden. Viele Programme verwenden jedoch BIOSAufrufe,
und diese gehen NICHT ueber ANSI.SYS.
_________________
 
Neues Thema eröffnen   Neue Antwort erstellen    MS-DOS Forum Foren-Übersicht -> Batch Programmierung

Tags: ascii code, batch, ansi, dos

 
 Verwandte Themen   Aufrufe   Letzter Beitrag 
Keine neuen Beiträge eine gelöschte MS-DOS Datei wiederherstellen 4340 09.11.2008, 11:47
Keine neuen Beiträge Ein Programm benutzt nicht den XMS-Erweiterungsspeicher 1275 25.11.2008, 09:50
Keine neuen Beiträge Die Meldung "Packed File Corrupt" erscheint 1323 21.11.2008, 06:30
Keine neuen Beiträge Ein Programm meldet, dass die MS-DOS-Version falsch ist 992 16.11.2008, 11:59
Keine neuen Beiträge MS-DOS wird nicht im oberen Speicherbereich ausgeführt 1595 09.11.2008, 11:40
 

Eine Suchmaschinenoptimierung muss nicht kostspielig sein. -


[ Time: 0.1668s ][ Queries: 59 (0.0274s) ][ GZIP on - Debug on ]