Batchdateien programmieren - HPK
Transcrição
Batchdateien programmieren - HPK
Batchprogramme für DOS und WINDOWS Autor: Dipl. Ing (FH) Kiermaier CALL TEIL2 FOR %%A IN (*.TXT) SHIFT IF EXIST TEMP.TXT GOTO ENDE CHOICE /C:JN DIR > TEMP.$$$ VOL ¦ FIND "A" @ECHO OFF Erschienen im Selbstverlag 1995. Kopieren ist auch ausschnittsweise nur nach Absprache mit dem Autor erlaubt! Kiermaier ©1995 Batchprogramme für DOS und WINDOWS Inhaltsverzeichnis: 1. Was sind Batch-Programme? ............................................................................................ 3 2. Wichtige Grundeinstellungen............................................................................................ 3 2.1. Einstellungen in der Datei CONFIG.SYS.......................................................... 3 2.2. Einstellungen in der Datei AUTOEXEC.BAT................................................... 4 3. Texte eingeben und editieren ............................................................................................ 6 3.1. Das Programm EDIT.......................................................................................... 6 3.2. Trick 17: COPY CON Datei............................................................................... 7 4. Filter und Ein-/Ausgabeumleitungen ................................................................................ 7 4.1. Filter-Kommandos (Pipelines) ........................................................................... 8 4.2. Dateiumleitungen ............................................................................................... 8 5. BATCH-Dateien unter der Lupe ....................................................................................... 9 5.1. Aufruf und Übergabeparameter.......................................................................... 9 5.2. Befehle für Stapeldateien ................................................................................... 10 CALL Batchdatei.......................................................................................... 10 CHOICE Text /C:Liste /T:Zeichen,Sekunden........................................... 10 ECHO ON|OFF ............................................................................................ 10 FOR %Variable IN (Liste) DO Kommando............................................. 11 GOTO Marke................................................................................................ 11 IF ERRORLEVEL Nummer Kommando.................................................. 11 PAUSE........................................................................................................... 12 REM............................................................................................................... 12 SHIFT ............................................................................................................ 12 6. Beispielanwendungen........................................................................................................ 13 6.1. Automatische Beantwortung von Abfragen ....................................................... 13 6.2. Auswahlmenüs und Eingabehilfen ..................................................................... 15 6.2.1. Grundlegendes zur Menüerstellung..................................................... 15 6.2.2. Farbige Menüs ..................................................................................... 16 6.2.3. Mit Signalton den Anwender aufmerksam machen ............................ 17 6.2.4. Fenstertechnik mit direkter Cursorpositionierung............................... 17 6.3. Finden von Dateien und Verzeichnissen ............................................................ 19 6.4. Automatische Installationsroutinen.................................................................... 21 6.4.1. Installationslaufwerk und Verzeichnisse prüfen ................................. 21 6.4.2. Automatische Installation mehrerer Disketten .................................... 22 6.4.3. Erweitern der AUTOEXEC.BAT und CONFIG.SYS......................... 23 6.4.4. Automatischer Neustart des Rechners................................................ 24 6.5. Datum und Uhrzeit abfragen: ein Terminkalender............................................. 25 6.6. Diverses .............................................................................................................. 26 6.6.1. Temporärverzeichnis automatisch löschen.......................................... 26 6.6.2. Zweite Konfiguration für Spiele.......................................................... 27 6.6.3. DOS-Befehle erweitern und entschärfen............................................. 27 7. ANHANG A: Die ANSI-Sequenzen................................................................................. 29 7.1. Cursor- und Bildschirmsteuerung ...................................................................... 29 7.2. Tasten umbelegen............................................................................................... 30 8. ANHANG B: Das Programm DOSKEY........................................................................... 31 8.1. Eingeben mehrerer Befehle in einer Zeile.......................................................... 32 8.2. Erstellen eigener Befehle (Makros).................................................................... 32 9. ANHANG C: Das DEBUG-Dienstprogramm .................................................................. 33 10. ANHANG D: Lösungen zu den Aufgaben ..................................................................... 35 2 Kiermaier ©1995 Batchprogramme für DOS und WINDOWS 3 1. Was sind Batch-Programme? Der Ausdruck BATCH bedeutet soviel wie 'Stoß' und wird im Zusammenhang mit Computern oft als Stapelverarbeitung interpretiert. Der Ausdruck 'Stapel' trifft auch ziemlich genau die Aufbau eines BATCHES. Es handelt sich nämlich um die Aneinanderreihung mehrerer einzelner DOS-Befehle, die nach dem Aufruf des Batchprogramms alle nacheinander abgearbeitet werden. Ein BATCH spart also immer viele Tastatureingaben und hilft so Zeit bei der Erledigung von EDV-Aufgaben zu sparen. Da Batchprogramme ausführbare Dateien sind, müssen sie, ähnlich wie COM- und EXE-Dateien, eine bestimmte Endung besitzen. Es ist naheliegend, daß diese Endung aus den drei Buchstaben 'BAT' besteht. Bekanntestes Beispiel für eine Batch-Datei ist die AUTOEXEC.BAT. 2. Wichtige Grundeinstellungen Nachdem der Computer den POST (Power On Self Test) ausgeführt hat, wird von der Systemdiskette (Laufwerk A: oder aktive Partition der Festplatte) ein sogenanntes BOOT-Programm geladen und gestartet. Dieses BOOT-Programm lädt dann die Dateien IO.SYS und MSDOS.SYS sowie den Kommandointerpreter COMMAND.COM. Letztgenanntes Programm wird gestartet und lädt seinerseits die Konfigurationsdatei CONFIG.SYS und die Stapeldatei AUTOEXEC.BAT. 2.1. Einstellungen in der Datei CONFIG.SYS In der Datei CONFIG.SYS werden alle vorhandenen Geräte und Schnittstellen für ihren Gebrauch eingestellt. Demgemäß stehen in dieser Datei viele wichtige Befehle, die das System überhaupt erst funktionsfähig machen oder sogar optimieren. Einige wichtige Befehle, die das Arbeiten mit Batchprogrammen erleichtern und verschönern, sollen hier aufgeführt werden. DEVICE = Gerätetreiber Damit wird ein Gerätetreiber installiert, also ein Programm, das sich um die Kommunikation zwischen einer Hardwarekomponente und dem Betriebssystem kümmert. Da es im Hauptspeicher abgelegt wird, steht es somit ständig zur Verfügung, verkleinert aber den Arbeitsspeicher! Mit DEVICE sollte folgender Treiber/Programme installiert werden: ANSI.SYS Steuersequenzen für Bildschirm- und Cursorsteuerung einrichten. Ist dieser Treiber installiert kann man zum Beispiel die Farben und die Position für Bildschirmanzeigen ändern oder bestimmten Tasten ganze Befehlsgruppen zuordnen (siehe ANSI-Sequenzen im Anhang A). Beispiel: DEVICE = C:\DOS\ANSI.SYS DEVICEHIGH = Gerätetreiber Im Prinzip bewirkt dieser Befehl dasselbe wie DEVICE. Aber dabei wird versucht, den Gerätetreiber in den UPPER MEMORY zu schreiben, was Hauptspeicher spart. Voraussetzung dafür ist, daß EMM386.EXE installiert ist und der Befehl DOS=UMB vorausgeht. Andernfalls, oder falls kein Platz mehr zur Verfügung steht, wird der Gerätetreiber ganz normal im Hauptspeicher Kiermaier ©1995 Batchprogramme für DOS und WINDOWS 4 eingerichtet. Wieviel Platz im UPPER MEMORY zur Verfügung steht kann mit dem MEMBefehl untersucht werden, z.B: MEM /F. HIMEM.SYS, EMM386.EXE und SMARTDRV.EXE dürfen nicht mit DEVICEHIGH installiert werden! Beispiel: DEVICEHIGH = C:\DOS\RAMDRIVE.SYS 1500 /E SHELL Der Befehl SHELL installiert den Befehlsinterpreter, mit dem DOS arbeiten soll. In der Regel ist das das Programm COMMAND.COM. Prinzipiell ist es aber jederzeit möglich mit anderen Interpretern (Benutzeroberflächen) zu arbeiten, beispielsweise von 4DOS™. Wenn der Befehl in der CONFIG.SYS nicht angegeben wird, sucht DOS die Datei COMMAND.COM im Hauptverzeichnis (weil beim Start aktuell). Der Befehl ist außerdem wichtig, wenn mehr Umgebungsspeicher (Environment) eingerichtet werden soll. In diesem Speicher werden alle Variablen und DOS-Einstellungen gespeichert. Er kann an der Eingabeaufforderung mit dem Befehl SET eingesehen werden. Folgendes Beispiel richtet die COMMAND.COM mit 1024 Byte für den Environment-speicher ein. Beispiel: SHELL = C:\COMMAND.COM /e:1024 /p 2.2. Einstellungen in der Datei AUTOEXEC.BAT Die Batch-Datei AUTOEXEC.BAT hat eigentlich nur die Aufgabe Grundeinstellungen für Anwenderprogramme vorzunehmen, sowie diese Programme automatisch zu starten. Dazu kann man beliebige Variablen setzen und später wieder abfragen. Dazu gehören beispielsweise die Variable TEMP, DIRCMD und WINDIR. Es ist auch möglich, von einer Batchdatei andere Batchprogramme aufzurufen, um zum Beispiel Installationen zu erleichtern. Für die Batchprogrammierung ist es meist praktisch, die nachfolgend genannten Befehle mit in die AUTOEXEC.BAT aufzunehmen. PATH Verzeichnisnamen PATH legt fest, in welchen Verzeichnissen DOS nachsehen soll, um eine ausführbare Datei (also nur COM, EXE und BAT) zu finden. Die Verzeichnisse werden in der angegebenen Reihenfolge durchsucht. Deshalb sollte das Verzeichnis, in dem am häufigsten gesucht wird, als erste Angabe hinter PATH stehen und weniger benutzte Verzeichnisse entfernt werden. Beispiel: PATH C:\DOS;D:\WINDOWS;F:\ SET Variable=Wert Dieser Befehl kann eine Variable des Umgebungsspeichers mit einem Wert belegen. Später kann jedes Programm diese Werte abfragen und so auf gewünschte Art und Weise reagieren. Zwischen dem Variablennamen und dem Gleichheitszeichen '=' sowie dem Veriablenwert sollte kein Leerzeichen stehen! Um Variablen wieder aus dem Umgebungsspeicher zu löschen, genügt es hinter dem Gleichheitszeichen nichts anzugeben. Folgende Variablen werden oft in der AUTOEXEC.BAT belegt: Kiermaier ©1995 Batchprogramme für DOS und WINDOWS 5 SET COMSPEC = c:\command.com SET DIRCMD = /p/o:n SET TEMP = E:\ SET TEMP = PROMPT setzt bei Diskettenstart den Kommandointerpreter auf Laufwerk C: fest (dadurch entfällt das ständige Diskettenwechseln) bedeutet, daß das Inhaltsverzeichnis nach Namen geordnet und seitenweise ausgegeben wird. legt fest, daß temporäre Dateien auf E: (z.B. RAM-Laufwerk) abgelegt werden sollen (Geschwindigkeit!) dies würde die oben mit E:\ geladene Variable wieder löschen. Text Parameter Der Befehl stellt ein, was als Eingabeaufforderungszeichen erscheinen soll. Dazu gibt es eine Reihe von Parametern, welche mit einen führenden Dollarzeichen angegeben werden können. Üblich sind dabei die beiden Werte $p$g, um den aktuellen Pfad und das Größerzeichen auszugeben. Andere Parameter sind: $p $g $v $q Akt. Laufwerk und Verzeichnis Größerzeichen (">") DOS-Versionsnummer Gleichheitszeichen ("=") $t $d $_ $e aktuelle Uhrzeit aktuelles Datum neue Zeile Escapezeichen Sequenz für ANSI- Folgendes Beispiel gibt in jeweils einer Zeile die Uhrzeit, das Datum und den aktuellen Pfad aus. Geben Sie ein: PROMPT Uhrzeit: $t$_Datum: $d$_$p$g ↵ Mithilfe der ANSI-Sequenzen können auch farbige Ausgaben erfolgen oder die Ausgabeposition frei gewählt werden (ANSI.SYS muß geladen sein). Dazu muß die Zeichenfolge $e[ benutzt werden. Dahinter steht einer der ANSI-Befehle (siehe ANSI-Sequenzen). Um farbige Ausgaben in Batchdateien zu erzeugen muß allerdings eine andere Form für die ANSI-Sequenz gewählt werden (STRG+P - ESC - [). DOSKEY Dieses DOS-Programm 'merkt' sich nach dem Aufruf alle eingegebenen Befehle und läßt sie auf Tastendruck wieder erscheinen. So spart man sich bei ähnlichen Eingaben ständig alles neu zu tippen. In der AUTOEXEC.BAT muß dazu nur in einer eigenen Zeile stehen: C:\DOS\DOSKEY oder C:\DOS\DOSKEY /INSERT Der Parameter /INSERT bedeutet, daß DOSKEY im Einfügemodus gestartet wird und so in alte Befehle neue Zeichen eingefügt werden können. Andernfalls werden bei der Eingabe von neuen Zeichen die alten überschrieben. Falls dieser Befehl nicht in der AUTOEXEC.BAT steht, kann man ihn selbstverständlich auch nachträglich von Hand eingeben. Kiermaier ©1995 Batchprogramme für DOS und WINDOWS 6 3. Texte eingeben und editieren Eine der häufigsten Aufgaben unter MS-DOS war und ist es, Texte zu schreiben und zu bearbeiten. Sei es nun für Briefe oder eigene Programme, wie die BATCH-Dateien. Bis MS-DOS Version 4.x war es dazu nötig, ein eigenes Textverarbeitungsprogramm zu laden oder sich mit dem Programm EDLIN zu begnügen. Seit MS-DOS 5.0 wird jedoch ein komfortabler Editor namens EDIT zum Betriebsystem mitgeliefert. 3.1. Das Programm EDIT Das Programm EDIT ist ein sehr bequemes, mausgesteuertes Textverarbeitungsprogramm. Zum Aufruf gibt man den Befehl EDIT und dahinter die zu bearbeitende Datei ein. Startet man das Programm nur durch die Eingabe von EDIT, wird man als erstes in einem Fenster aufgefordert, einen Dateinamen anzugeben. In beiden Fällen erscheint daraufhin eine meist blaue Oberfläche und die gewünschte Textdatei. Sie kann dann beliebig mit den Cursortasten (= Pfeiltasten) oder der Maus editiert werden. Am oberen Bildschirmrand stehen einige Menüs zur Verfügung, die weitere Befehle für den Editor enthalten. Sie können mit durch Anklicken mit dem Mauszeiger oder der ALT-Taste geöffnet werden (Pull-Down-Menü). Das wichtigeste davon ist das Hilfe-Menü, in dem alle wichtigen Schritte und Vorgänge genau erklärt werden. Um eine kleine Textdatei neu zu erstellen, gehen Sie so vor: Geben Sie ein: EDIT TEST.TXT ↵ Schreiben Sie einen beliebigen kleinen Text Markieren Sie eine beliebige Stelle des Textes: Setzen Sie den Cursor auf das erste zu markierende Zeichen, drücken Sie dann mehrmals die Taste NACH-RECHTS und halten dabei die Umschalttaste gedrückt, bis Sie das letzte Zeichen erreicht haben. Setzen Sie den Mauszeiger auf das erste zu markierende Zeichen und drücken die linke Maustaste. Halten Sie die Taste gedrückt während Sie den Mauszeiger bis zum letzen Zeichen weiterführen. Um Auschnitte aus diesem Text zu suchen, zu kopieren oder zu löschen, wird der Menüpunkt BEARBEITEN geöffnet. Darin sind die wichtigsten Editierfunktionen enthalten. Drücken Sie die ALT-Taste, wählen Sie mit den Tasten NACH-RECHTS oder NACHLINKS den Menüpunkt BEARBEITEN aus und drücken dann die NACH-UNTEN-Taste Zeigen Sie mit der Maus auf den Menüpunkt BEARBEITEN und drücken Sie dann einmal die linke Maustaste Wählen Sie mit der NACH-UNTEN-Taste den Punkt KOPIEREN und drücken dann die Eingabetaste. Zeigen Sie mit der Maus auf den Punkt KOPIEREN und drücken Sie dann einmal die linke Maustaste Kiermaier ©1995 Batchprogramme für DOS und WINDOWS 7 Der markierte Text ist nun in einen internen Speicherpuffer kopiert worden. Um ihn wieder zu holen, geht man so vor: Wählen Sie eine beliebige andere Stelle im Text mit den Cursortasten Zeigen Sie mit der Maus auf eine beliebige andere Stelle im Text und drücken Sie dann einmal die linke Maustaste Öffnen Sie erneut den Menüpunkt BEARBEITEN und wählen den Punkt EINFÜGEN. Abschließend drücken Sie die Eingabetaste Öffnen Sie erneut den Menüpunkt BEARBEITEN und klicken Sie einmal mit der linken Maustaste auf den Punkt EINFÜGEN Um den Text zu drucken, zu speichern oder den Editor zu beenden, müssen Sie den Menüpunkt DATEI öffnen. Wenn Sie den Punkt BEENDEN auswählen ohne gespeichert zu haben, fragt Sie der EDITOR automatisch, ob er die Datei sichern soll. Öffnen Sie erneut den Menüpunkt DATEI und wählen den Punkt BEENDEN. Da die Datei nicht gespeichert werden soll, wählen Sie durch Drücken der TABULATOR-Taste die Schaltfläche NEIN und drücken abschließend die Eingabetaste Öffnen Sie erneut den Menüpunkt DATEI und klicken Sie einmal mit der linken Maustaste auf den Punkt BEENDEN. Klicken Sie abschließend einmal auf die Schaltfläche NEIN, um die Datei nicht zu speichern. ) Das Programm EDIT ist ein komfortables mausgesteuertes, bildschirmorientiertes Textverarbeitungsprogramm. 3.2. Trick 17: COPY CON Datei Falls Sie schnell mal nur eine kleine Batchdatei erstellen wollen, müssen Sie deshalb nicht gleich einen Editor starten. Eleganter und schneller geht das meist mit dem Kopierbefehl. Allerdings kann dabei der Text nicht editiert oder verbessert werden. Deshalb eignet sich das Verfahren nur für kurze oder einzeilige Texte. Geben Sie ein: COPY CON TEST.BAT ↵ Geben Sie die gewünschten Befehle ein Drücken Sie abschließend die Taste F6 oder STRG-Z um ein Dateiende-Zeichen zu erhalten und abschließend die Eingabetaste Anstatt von der Konsole direkt in eine Datei zu schreiben, können Sie natürlich auch direkt auf den Drucker schreiben. Sie müssen dazu nur als Ziel den Drucker auswählen: COPY CON PRN. 4. Filter und Ein-/Ausgabeumleitungen Oft ist es sinnvoll Dateien nicht so wie sie sind auf den Bildschirm auszugeben, sondern sie erst alphabetisch zu sortieren oder nur seitenweise auszugeben. Dafür stellt MS-DOS sogenannte Filterprogramme zur Verfügung. Kiermaier ©1995 Batchprogramme für DOS und WINDOWS 8 4.1. Filter-Kommandos (Pipelines) Ein Filter ist ein Programm, durch das eine Datei geschickt und dadurch verändert wieder ausgegeben wird. Alle Filterprogramme werden durch das PIPE-Zeichen "¦" (Strich mit Durchschuß) mit einem entsprechenden Ausgabebefehl verknüpft. MS-DOS stellt dazu drei Filterprogramme zur Verfügung: Der FIND-Filter durchsucht Dateien nach einem bestimmten Textabschnitt. Dabei wird im angegebenen Suchtext zwischen Groß- und Kleinschreibung unterschieden (Ausnahme: Option /i dahinter angeben). Wenn der Filter die angegebene Zeichenfolge findet, gibt er die betreffende Zeile aus. Geben Sie ein: TYPE AUTOEXEC.BAT ¦ FIND "path" /i ↵ Der MORE-Filter ermöglicht es, eine Ausgabe nach jeweils 24 Zeilen anzuhalten. Es wird dann die Meldung '-- Fortsetzung --' ausgegeben und auf einen Tastendruck gewartet. Geben Sie ein: TREE C:\ ¦ MORE ↵ Der SORT-Filter schließlich sortiert eine Ausgabe alphabetisch nach den jeweils ersten Zeichen jeder Zeile und gibt sie so wieder aus. Geben Sie ein: DIR C:\DOS\*.* ¦ SORT ↵ Letzte Anzeige war bestimmt zu schnell vorbei. Deshalb können Filter miteinander kombiniert werden. Geben Sie ein: DIR C:\DOS\*.* ¦ SORT ¦ MORE ↵ 4.2. Dateiumleitungen Neben der Möglichkeit eine Datei zu filtern kann sie bei der Ausgabe auch auf eine andere Datei umgeleitet werden. Das heißt, daß das Ergebnis eines Filtervorgangs oder auch nur die Datei selbst in eine andere Datei geschrieben (kopiert) wird. Dateiumleitungen werden durch das Größer- und Kleinerzeichen vorgenommen. So kann zum Beispiel ein Inhaltsverzeichnis in eine Datei geschrieben (umgeleitet) werden: Geben Sie ein: DIR C:\DOS\*.* > TEST1.DIR ↵ Um dieses Verzeichnis auch noch sortiert in die Datei zu kopieren, kann der Befehl mit dem Filter SORT kombiniert werden. Geben Sie ein: DIR C:\DOS\*.* ¦ SORT > TEST1.DIR ↵ Die alte Datei TEST1.DIR wird dabei automatisch überschrieben. Soll in der Datei nur ein zusätzliches Verzeichnis angehängt werden, ohne die alte Datei zu überschreiben, so muß das Grösserzeichen doppelt angegeben werden. Kiermaier ©1995 Geben Sie ein: Batchprogramme für DOS und WINDOWS 9 DIR C:\*.* ¦ SORT >> TEST1.DIR ↵ Anstatt das Pipesymbol "¦" zu benutzen, kann das Inhaltsverzeichnis auch zuerst auf das Filterprogramm und dann auf die Datei ausgegeben werden. Folgendes Beispiel schreibt alle Unterverzeichnisse von C:\ alphabetisch sortiert in die Datei TEST3.DIR. Geben Sie ein: SORT < DIR C:\*. > TEST3.DIR ↵ Da DOS auch Ein-/Ausgabegeräte wie Dateien behandelt, kann auch beispielsweise eine Ausgabe auf den Drucker erfolgen. Dazu muß lediglich hinter dem Befehl das Größerzeichen und dahinter die Zeichenfolge PRN bzw. LPT1 geschrieben werden. Geben Sie ein: TYPE C:\AUTOEXEC.BAT > PRN ↵ Dadurch ist wieder ein Trick möglich, ähnlich wie mit COPY CON ... Textdateien zu erstellen. Es wird dazu lediglich der TYPE-Befehl benutzt. Als Eingabe wird die Tastatur CON und als Ausgabedatei ein beliebiger Dateiname angegeben. Beendet wird das Ganze wieder durch Drücken der F6-Taste und anschließend der Eingabetaste. Geben Sie ein: TYPE CON > TEST.TXT ↵ Schließen Sie durch Drücken der F6-Taste und abschließend ↵ Wenn Sie die Meldungen eines Befehls nicht sehen wollen, können Sie die Bildschirmausgabe nach nirgendwo umleiten. Dazu geben Sie als Gerät NUL hinter dem Größerzeichen an. Geben Sie ein: COPY C:\AUTOEXEC.BAT C:\DOS >NUL ↵ 5. BATCH-Dateien unter der Lupe Nach dem Bearbeiten der CONFIG.SYS wird die Stapeldatei AUTOEXEC.BAT geladen und ausgeführt. Sie kann leicht mit einem Editor geändert und beliebig mit nachfolgenden Befehlen erweitert werden. Interessanterweise kann man in diesen BATCH-Dateien jederzeit andere Programme aufrufen und so nacheinander ausführen lassen. 5.1. Aufruf und Übergabeparameter Batchdateien werden wie andere Programme (mit den Endungen COM und EXE) durch Eingabe ihres Names aufgerufen und gestartet. Dabei können ihnen Werte übergeben werden, die als Parameter bezeichnet werden. Diese Parameter können dann von der Batchdatei ausgewertet und in die Befehle mitintegriert werden. Dazu werden die übergebenen Werte der Reihe nach in einer der Variablen %1 bis %9 gespeichert. Sind es mehr als 10 Werte, stehen in Parameter %9 alle restlichen. Sie können dort mit dem SHIFT-Befehl erreicht werden. In Parameter %0 steht beim Start der Name der aufgerufenen Batchdatei. Folgende kleine Batchdatei mit dem Namen D.BAT gibt das angegebene Inhaltsverzeichnis und alle Unterverzeichnisse alphabetisch sortiert aus. Schreiben Sie es beispielsweise mit dem DOS Editor durch Eingabe von EDIT D.BAT . Kiermaier ©1995 Beispiel: Batchprogramme für DOS und WINDOWS 10 @echo off dir %1 /o:n /s /p Der Aufruf der kleinen Batchdatei erfolgt durch Eingabe von D und der Eingabetaste, wenn das aktuelle Inhaltsverzeichnis ausgegeben werden soll. Dabei wird kein Parameter übergeben, %1 ist dann leer. Sollen aber nur bestimmte Dateien oder ein anderes Verzeichnis angezeigt werden, so erfolgt der Aufruf zum Beispiel durch D \DOS oder D *.COM, usw. 5.2. Befehle für Stapeldateien CALL Batchdatei Soll aus einer Batchdatei eine weitere aufgerufen und später wieder zurückgekehrt werden, so kann dieser Befehl verwendet werden. So kann man sehr komplexe Programme schreiben. Folgendes Beispiel könnte in der AUTOEXEX.BAT stehen und ein BATCH-Datei aufrufen, in der alle Makrodefinitionen stehen, die mit DOSKEY definiert worden sind. Beispiel: CALL MAKRO.BAT CHOICE Text /C:Liste /T:Zeichen,Sekunden Ab der MS-DOS Version 6.2 kann man mit diesem Befehl in Stapeldateien Eingaben machen. Als Parameter muß lediglich eine Liste der Zeichen angegeben werden, die für eine Eingabe erlaubt sind. DOS setzt diese Zeichen dann beim Ausführen in eckige Klammern und wartet auf eine korrekte Eingabe. Falsche Tasten werden mit einem Klingelzeichen quittiert. Als Ergebnis wird ein Fehlercode (ERRORLEVEL) zurückgeliefert, dessen Wert der Stelle des Zeichens in der Liste entspricht. Folgendes Beispiel gibt auf dem Bildschirm den Text 'Programm beenden [J,N]?' aus und wartet auf eine Eingabe. Wurde j oder J gedrückt, ist der ERRORLEVEL 1, im anderen Fall für n oder N gleich 2. Beispiel: CHOICE Programm beeenden /C:JN ECHO ON|OFF Schaltet die Bildschirmausgabe des momentanen Befehls vor seiner Bearbeitung ein oder aus. Durch das Ausschalten wird der Bildaufbau übersichtlicher, vor allem wenn eigene Menüs ausgegeben werden. Das Voranstellen des Zeichens @ bewirkt, daß auch der Befehl ECHO selbst nicht ausgegeben wird. Dagegen ist der Wert ON nützlich, wenn nach einem Fehler gesucht wird. Beispiel: @ECHO OFF Folgt der ECHO-Anweisung statt der Parameter ON bzw. OFF ein Text, so wird dieser auf den Bildschirm ausgegeben (unabhängig davon, ob ECHO OFF ist). Man kann damit also beliebige Kiermaier ©1995 Batchprogramme für DOS und WINDOWS 11 Texte auf dem Bildschirm ausgeben. Will man eine Leerzeile haben, so muß unmittelbar hinter der ECHO-Anweisung ein Punkt folgen. Beispiel: ECHO ***** Auswahlmenü ***** ECHO. Mit einer Zuweisung können auch Texte auf den Drucker ausgegeben werden. Es muß dann nur die Zeichenfolge > PRN folgen. Beispiel: ECHO Das geht an den Drucker > PRN FOR %Variable IN (Liste) DO Kommando Mit FOR können Programmabschnitte mehrmals durchlaufen werden, also sogenannte Schleifen programmiert werden. Auf diese Weise können mit einem Befehl unterschiedliche Dateien kopiert, gelöscht oder ausgegeben werden. Als Liste sind Dateinamen anzugeben, wobei Wildcards (* und ?) erlaubt sind. Mehrere Angaben sind durch je ein Leerzeichen zu trennen. Eine Variable besteht aus einem Prozentzeichen und einem beliebigen Buchstaben oder Wort (z.B.: %A). In ihr wird die gerade gefundene Datei gespeichert und kann dann vom auszuführenden Befehl, dem Kommando, benutzt werden. Als Befehl kann jedes DOS-Kommando benutzt werden. Sind für die Ausführung des Befehls irgendwelche Übergabewerte erforderlich, so können diese mit der Variablen übergeben werden. Der FOR-Befehl kann nicht nur in Batchdateien, sondern auch an der Eingabeaufforderung benutzt werden. Während in Batchdateien die Variable im FOR-Befehl mit zwei Prozentzeichen definiert wird (z.B.: %%A), genügt an der Eingabeaufforderung nur eines (z.B.: %A). Beispiel in Batchdateien: FOR %%A IN (*.TXT *.DOC) DO TYPE %%A FOR %D IN (*.BAT) DO FIND "PROMPT" %D /i Geben Sie ein: ↵ GOTO Marke Es wird ein Sprung zu einer Stelle in der Batchdatei ausgeführt, vor der die Marke steht. Eine Marke muß alleine am Anfang der Zeile stehen und hat als erstes Zeichen immer einen Doppelpunkt. Beispiel: :Schleife GOTO Schleife IF ERRORLEVEL Nummer Kommando IF Text1 = = Text2 Kommando IF EXIST Dateiname Kommando Kiermaier ©1995 Batchprogramme für DOS und WINDOWS 12 Der IF-Befehl dient zum Prüfen des Wahrheitsgehalts einer Bedingung. Falls die angegebene Bedingung erfüllt ist, wird der dahinterstehende Befehl ausgeführt, andernfalls übergangen. Jede Bedingung kann mit dem Schlüsselwort NOT hinter dem IF-Befehl negiert werden. Es sind drei verschiedene Bedingungen möglich: die Prüfung des ERRORLEVELs, der Vergleich zweier Zeichenketten und die Existenz einer Datei. Normalerweise dient der ERRORLEVEL als Möglichkeit auf Fehler von Programmen zu reagieren. In Batchdateien läßt er sich aber auch sehr gut zum Erstellen von Auswahlmenüs verwenden. Dazu muß der Befehl CHOICE vorausgehen, der einen Wert (Nummer) zurückliefert, der der Stelle des Zeichens in der Liste entspricht. Dahinter folgt das Kommando, welches ausgeführt wird, wenn die Nummer dem übergebenen Wert entspricht. Meist ist dies ein GOTOBefehl. Beispiel: IF ERRORLEVEL 1 GOTO ANFANG Um zu überprüfen, ob der Batchdatei ein sogenannter Parameter (Werte in den Variablen %1 bis %9) übergeben wurden, kann der Zeichenvergleich dienen. Zu beachten ist, das das Gleichheitszeichen dazwischen doppelt angegeben werden muß. Beispiel: IF NOT "%1" = = "" TYPE %1 Will man wissen, ob eine Datei bereits existiert, bevor man sie lädt, löscht oder anderweitig manipuliert, benutzt man die dritte Möglichkeit. Die angegebene Befehl wird nur dann ausgeführt, wenn die Datei tatsächlich da ist. Der Dateiname kann natürlich auch in einem Parameter (%1 bis %9) stehen. Beispiel: IF EXIST TEXT.BAK DEL TEXT.BAK PAUSE Unterbricht die Ausführung einer Stapeldatei und fordert den Benutzer auf, zur Fortsetzung eine Taste zu drücken. Dazu wird die Meldung 'Eine beliebige Taste drücken, um fortzusetzen' auf den Bildschirm ausgegeben. Praktisch ist dieser Befehl, wenn vorher mit ECHO ein Text ausgegeben wird, der zum Beispiel zum Wechseln der Diskette auffordert. Beispiel: ECHO Wechseln Sie die Diskette in Laufwerk A: PAUSE REM Will man in Batchdateien einen Kommentar einfügen, um beispielsweise einen Befehl zu erklären, muß die REM-Anweisung am Anfang der Zeile stehen. Alles was hinter diesem Befehl steht, wird von DOS nicht beachtet. Man kann mit REM auch beliebige Befehle in Batchdateien vorübergehend ausschalten, indem man REM davor schreibt. Beispiel: SHIFT REM Dies ist ein Kommentar in Batchdateien Kiermaier ©1995 Batchprogramme für DOS und WINDOWS 13 Die Übergabeparameter %0 bis %9 können mit diesem Befehl beeinflußt werden. Dabei wird Parameter %1 nach %0, %2 nach %1, usw. kopiert. Es wird auf diese Art möglich, mehr als 9 Parameter auszuwerten oder mit einer kurzen Befehlsfolge in einer Schleife alle mit Parameter übergebenen Werte nacheinander zu bearbeiten. Nennen Sie das folgende Beispiel KOPIER.BAT und tippen Sie es mit einem Editor ab. Beispiel: @echo off rem Syntax: KOPIER Zielpfad set ziel=%1 :schleife shift if "%1"= ="" goto ende copy %1 %ziel% >nil goto schleife :ende set ziel= echo Fertig! Datei1 Datei2 Datei3 ... 6. Beispielanwendungen Im nun folgenden Übungsteil sollen die Befehle und neu erworbenen Kenntnisse in die Tat umgesetzt und einige Anregung für eigene Ideen geliefert werden. Um die Beispiele Schritt für Schritt auszuprobieren, kann jede Batchdatei mit einem besonderen Kommando gestartet werden (ab MS-DOS 6.0): Einzelschrittbearbeitung: COMMAND /Y /C Batchname 6.1. Automatische Beantwortung von Abfragen Wenn Sie schon einmal versucht haben, ein ganzes Verzeichnis mit DEL *.* zu löschen, dann haben Sie auch die Sicherheitsabfrage 'Alle Dateien *.* im Verzeichnis löschen (J/N)' gesehen. Sie müssen erst mit 'J' antworten, bevor die Dateien gelöscht werden. Ähnliches gilt auch, wenn Sie mit dem Befehl DELTREE ein ganzes Verzeichnis auf einmal löschen wollen oder wenn Sie ein Diskette formatieren wollen. Selbstverständlich hat dies seinen Sinn, aber in der Regel weiß man ja was man macht und dann sind diese Fragen lästig und zeitraubend. Um nun diese Abfragen automatisch zu beantworten, benutzt man den ECHO-Befehl und verknüpft ihn mit der Anwendung über das Pipesymbol. Folgende Beispiele funktionieren sowohl in Batchdateien als auch direkt an der Eingabeaufforderung. Geben Sie ein: time ↵ Nach der Anzeige werden Sie aufgefordert, eine neue Uhrzeit einzugeben oder die Eingabetaste zu drücken. Geben Sie ein: echo. ¦ time ↵ Als Ergebnis wird die Uhrzeit ausgegeben, ohne auf die Eingabe der neuen Zeit zu warten. Natürlich könnten Sie auch gleich eine neue Uhrzeit eingeben: Kiermaier ©1995 Geben Sie ein: Batchprogramme für DOS und WINDOWS 14 echo 19.30.00 ¦ time ↵ Da die weiteren Beispiele nicht so ohne weiteres ausprobiert werden können, muß zuerst eine kleine Vorbereitung getroffen werden: Geben Sie ein: Geben Sie ein: md \temp ↵ xcopy c:\dos\*.txt c:\temp\ ↵ Nun haben wir ein Verzeichnis mit überflüssigen Dateien, die gelöscht werden müssen. Jetzt schreiben wir folgende kleine Batchdatei: Geben Sie ein: edit c:\lösche.bat ↵ @echo off rem Syntax I: lösche(löscht im aktuellen Verzeichnis alle Dateien) rem Syntax II: lösche Verzeichnisname (löscht Verzeichnis) if %1?= =? goto aktpfad cd %1 echo J ¦ del *.* cd .. rd %1 goto ende :aktpfad echo J ¦ del *.* :ende Nach dem Speichern und Beenden des Editors können Sie nun auch ohne DELTREE (z.B. mit MS-DOS 5.0 oder darunter) das ganze Verzeichnis oder, wie hier, Teile aus dem Verzeichnis löschen. Falls Sie nicht im Hauptverzeichnis sind, sollten Sie nun zuerst in das übergeordnete Verzeichnis wechseln. Geben Sie ein: Geben Sie ein: cd \ ↵ lösche \temp ↵ Schreiben Sie nun eine kleine Batchdatei mit dem Namen 'FORM!.BAT', die eine Diskette in Laufwerk A: oder B: sofort formatiert, ohne auf eine weitere Eingabe zu warten! Erweitern Sie die Datei vor einem Test so, daß es nicht möglich ist, die Festplatte zu formatieren! (Lösung 1 im Anhang D) Kiermaier ©1995 Batchprogramme für DOS und WINDOWS 15 6.2. Auswahlmenüs und Eingabehilfen Wer mehrere Spiele oder häufig benötigte Programme auf der Festplatte installiert hat, kennt das Problem, ein entsprechendes Programm schnell zu finden. Ist man in das entsprechende Verzeichnis gewechselt, muß unter Umständen noch eine bestimmte Syntax beim Aufruf eingehalten werden. Dies hat man entweder alles im Kopf oder man schreibt sich ein kleines Menü, in dem man einfach nur auswählt, was gestartet werden soll. 6.2.1. Grundlegendes zur Menüerstellung Ursprünglich (DOS 5.0 und darunter) sah das so aus, daß man das Menü als Text mit dem Echobefehl ausgab und dann lauter kleine Batchdateien mit den Namen 1.BAT, 2.BAT, usw. hatte. Seit DOS 6.0 gibt es den Befehl CHOICE der flexible Eingaben für Batchdateien erlaubt. Sollten Sie noch nicht über diese Version verfügen, können Sie mit dem Programm DEBUG selbst eine ähnliche Datei erstellen (näheres im Anhang C). Der Befehl CHOICE liefert nach einem Tastendruck einen Fehlercode zurück. Dieser ERRORLEVEL kann mit dem IF-Befehl verarbeitet werden. Wollen Sie also ein Menü mit drei Auswahlpunkten erzeugen, könnte das so aussehen: @echo off cls echo 1 = Erster Menüpunkt echo 2 = Zweiter Menüpunkt echo 3 = Dritter Menüpunkt echo E = Ende choice Bitte wählen: /C:123E CHOICE gibt dann nach dem Menü den Text "Bitte wählen [1,2,3,E]" aus und wartet auf die Eingabe eines der angegebenen Zeichen. In der Reihenfolge der Zeichen "1", "2", "3" und "E" liefert es dann den Fehlercode zurück. Für das Zeichen "1" erhält man den Kode 1, für "2" den Kode 2, für "3" den Kode 3 und für "E" den Kode 4. Die nachfolgende Abfrage mit dem IFBefehl muß nun beginnend bei 4 absteigend alle Menüpunkte behandeln. Das würde dann zum Beispiel so aussehen: if if if if errorlevel errorlevel errorlevel errorlevel :punkt1 echo punkt1 goto ende :punkt2 echo punkt2 goto ende :punkt3 echo punkt3 goto ende :ende 4 3 2 1 goto goto goto goto ende punkt3 punkt2 punkt1 Kiermaier ©1995 Batchprogramme für DOS und WINDOWS 16 Eventuell kann es von Vorteil sein, einen Menüpunkt automatisch (default) auszuwählen, wenn der Benutzer innerhalb einer bestimmten Zeit nicht reagiert. Auch das ermöglicht der CHOICEBefehl. Hängen Sie dazu an den oben gezeigten CHOICE-Befehl nur den Parameter "/T:1,5" an. Dies bedeutet, daß der Menüpunkt "1" nach max. 5 Sekunden automatisch gewählt wird. Der Befehl "CHOICE Bitte wählen: /C:123E /T:E,10" würde also nach 10 Sekunden die Menüauswahl selbsttätig beenden. Schreiben Sie nun eine kleine Batchdatei mit dem Namen 'MENU.BAT', die zur Auswahl stellt, ob man die DOSSHELL oder WINDOWS starten möchte. Wird innerhalb von 5 Sekunden keine Wahl getroffen, soll die Meldung "Hallo, User" und die normale Eingabeaufforderung erscheinen. (Lösung 2 im Anhang D) 6.2.2. Farbige Menüs Um bei Auswahlmenüs etwas Farbe ins Spiel zu bringen, muß die Datei ANSI.SYS mit dem Befehl DEVICE in der CONFIG.SYS installiert worden sein. Dann können mit sogenannten Steuersequenzen (Escape- oder Fluchtsequenz, mehr dazu im Anhang A) vielfältige Manipulationen der Bildschirmein- und ausgabe vorgenommen werden. Jeder Steuersequenz gehen die ASCII-Zeichen 27 (ESC-Zeichen) und 91 ("[") voraus. Da das ASCII-Zeichen 27 nicht druckbar ist, kann es nur mit einem Trick im DOS-Editor benutzt werden. Man drückt dazu die Tastenkombination STRG-P (STRG- und P-Taste gleichzeitig drücken) und anschließend die ESC-Taste. Es erscheint ein kleiner "Nach-Links"-Pfeil. Nun gibt man noch die eckige Klammer ein und den eigentlichen Steuercode, abhängig davon, was man erreichen möchte (Auflistung im Anhang A). Das folgende Beispiel gibt eine rote Titelleiste und ein gelbes Menü aus. Anschließend steht eine blaue Eingabeaufforderung. Nach dem Ende des Programms wird wieder mit weißer Farbe geschrieben. Denken Sie daran: "←" bedeutet, daß Sie die Tasten STRG-P und ESC drücken müssen! @echo off cls echo ←[31;1m****** Spiele ******←33;1m echo. echo 1 = Spiel1 echo 2 = Spiel2 echo E = Ende echo ←[34;1m choice Bitte wählen C:12E echo ←[37;0m if errorlevel 3 goto ende if errorlevel 2 goto 2 if errorlevel 1 goto 1 :2 echo Spiel2 goto ende :1 echo Spiel1 goto ende :ende Kiermaier ©1995 Batchprogramme für DOS und WINDOWS 17 6.2.3. Mit Signalton den Anwender aufmerksam machen Wenn Sie wollen, können Sie mit "ECHO •" ein kurzes Klingelsignal ausgeben. Das Zeichen "• " erhalten Sie, wenn Sie wieder die Tasten STRG-P drücken und anschließend die Tasten ALT-7 betätigen (ASCII-Zeichen für BELL). Um in dringenden Fällen den Anwender auf eine Eingabe aufmerksam zu machen, kann auch eine ständige Folge von Tonsignalen ausgegeben werden. Das folgende Beispiel gibt solange das Tonsignal aus, bis der Anwender die Eingabe beantwortet. Dazu wird wieder ein Trick verwendet. CHOICE stellt mit dem Schalter "/N" nicht dar, was eingegeben werden soll. Deshalb steht dies nun beim Text dabei: Bitte wählen [1,2,E]. Zusätzlich gibt es jetzt eine "versteckte" Eingabemöglichkeit, nämlich die "3"! Diese versteckte Eingabe wird nach jeweils einer Sekunde automatisch ausgewählt, wenn nicht eine andere Taste gedrückt wird. Sodann springt DOS zur Marke "klingel" und erzeugt dort ein Tonsignal. Die Zeichen "← [2A" bedeuten, daß der Cursor um zwei Zeilen nach oben verschoben werden soll. @echo off cls echo ****** Spiele ****** echo. echo 1 = Spiel1 echo 2 = Spiel2 echo E = Ende echo. :start choice Bitte wählen [1,2,E] /C:12E3 if errorlevel 4 goto klingel if errorlevel 3 goto ende if errorlevel 2 goto 2 if errorlevel 1 goto 1 :klingel echo •←[2A goto start :2 echo Spiel2 goto ende :1 echo Spiel1 goto ende :ende /N /T:3,1 6.2.4. Fenstertechnik mit direkter Cursorpositionierung Das man mit Batchdateien auch so etwas wie Auswahlfenster erzeugen kann, zeigt das letzte Beispiel dieser Reihe. Es nutzt die Sonderzeichen des ASCII-Codes zur Darstellung von doppelten und einfachen Rahmenelementen. Dies setzt voraus, daß der Zeichensatz 437 (US) eingestellt ist und nicht wie üblich der mehrsprachige mit der Nummer 850. Andernfalls werden die Ecken nicht richtig dargestellt. Es folgt eine Tabelle der ASCII-Codes für Rahmenelemente (ALT-Code): 203 201 204 200 206 202 185 188 186 205 169 195 192 191 197 193 210 209 194 187 180 217 179 196 213 198 212 184 216 207 214 181 199 190 211 183 215 208 182 189 Kiermaier ©1995 Batchprogramme für DOS und WINDOWS 18 Um Fenster übereinandersetzen zu können, muß man die Cursorposition (die Stelle an der als nächstes etwas ausgegeben wird) steuern. Dazu gibt es die ANSI-Sequenz "←[ posy;posx H". Dabei bedeutet "posy" in welcher Zeile und "posx" in welcher Spalte ein Text erscheinen soll. Da CHOICE immer am Zeilenanfang beginnt, muß wieder getrickst werden. Die Eingabe erfolgt deshalb am unteren Bildschirmrand (in Bildschirmzeile 22). Zur besseren Darstellung wurde hier ein andere Schriftart gewählt. Statt der 'uralt'Rahmentechnik mit Plus-, Minuszeichen und dem Pipesymbol sollten die Rahmenelemente benutzt werden: @echo off :start cls echo ←[34;47;1m←[4;30H+----------------------+←[37;0m echo ←[34;47;1m←[5;30H¦←[32;1m ****** Spiele ****** ←[34;1m¦←[37;0m echo ←[34;47;1m←[6;30H¦----------------------¦←[37;0m echo ←[34;47;1m←[7;30H¦←[33;1m 1 = Spiel1 ←[34;1m¦←[37;0m echo ←[34;47;1m←[8;30H¦←[33;1m 2 = Spiel2 ←[34;1m¦←[37;0m echo ←[34;47;1m←[9;30H¦←[33;1m E = Ende ←[34;1m¦←[37;0m echo ←[34;47;1m←[10;30H¦ ¦←[37;0m echo ←[34;47;1m←[11;30H¦ Bitte wählen [1,2,E] ¦←[37;0m echo ←[34;47;1m←[12;30H+----------------------+←[37;0m echo ←[34;47;1m←[22;0H choice /C:12E /N if errorlevel 3 goto auf if errorlevel 2 goto 2 if errorlevel 1 goto 1 :auf echo ←[34;41;1m←[10;27H+---------------------------+←[37;0m echo ←[34;41;1m←[11;27H¦ Wirklich aufhören [J,N] ¦←[37;0m echo ←[34;41;1m←[12;27H+---------------------------+←[37;0m echo ←[22;0H choice /C:JN /N if errorlevel 2 goto start if errorlevel 1 goto ende :2 echo punkt2 goto ende :1 echo punkt1 goto ende :ende Kiermaier ©1995 Batchprogramme für DOS und WINDOWS 19 6.3. Finden von Dateien und Verzeichnissen Der im DOS vorhandene Filter FIND kann die Suche nach verlegten Dateien oder bestimmten Texten sehr erleichtern. Üblicherweise benutzt man Filter nach einem regulären DOS-Befehl, wobei zwischen den Befehlen das Pipesymbol steht. Hinter FIND muß dann nur noch angegeben werden, wonach man sucht und einer der Schalter /I (Groß- oder Kleinschreibung nicht beachten), /V (alles anzeigen, das den Suchtext nicht enthält), /C (nur Anzahl gefundener Zeilen zeigen). Geben Sie ein: TYPE AUTOEXEC.BAT ¦ FIND "path" /i ↵ Neben dieser "normalen" Anwendung kann FIND auch alleine eingesetzt werden. Dann muß allerdings hinter dem Suchtext angegeben werden, in welcher Datei gesucht werden soll. Geben Sie ein: FIND "path" AUTOEXEC.BAT /i ↵ Um mit dem Befehl näher vertraut zu werden, schreiben wir folgende Batchdatei mit dem Namen ZITAT.BAT. Damit kann man in verschiedenen Dateien nach Textausschnitten suchen. @echo off if %1?= =? goto fehler if %2?= =? goto fehler set zitat=%1 :start shift if %1?= =? goto ende for %%a in (%1) do find goto start "%zitat%" %%a /i :fehler echo Syntax: ZITAT Suchtext Dateiname1 Dateiname2 Dateiname3 ... :ende Die FOR-Schleife ist nur nötig, damit der Dateiname sogenannte Wildcards bzw. Joker (* und ?) enthalten darf. Versuchen Sie die Batchdatei an folgendem Beispiel: Geben Sie ein: ZITAT text c:\*.??t c:\dos\*.txt ↵ Interessanter ist der FIND-Befehl, wenn man Dateien sucht. Man benutzt dazu wieder die erste, einfache Syntax mit dem Pipesymbol und läßt FIND als Filter für den DIR-Befehl arbeiten. Da DIR in der Regel Großbuchstaben ausgibt, sollte hier der Schalter /i verwendet werden. Geben Sie ein: DIR C:\*.BAT ¦ FIND "autoexec" /i ↵ Damit lassen sich Dateisuchprogramme realisieren, die in allen Verzeichnissen nach einer bestimmten Datei suchen. Nennen Sie die nächste Batchdatei SUCHE.BAT. Kiermaier ©1995 Batchprogramme für DOS und WINDOWS 20 @echo off if not %1?= =? goto weiter echo Syntax: SUCHE Dateiname goto ende :weiter dir \*.* /-p /s ¦ FIND "%1" /i ¦ MORE :ende Im Gegensatz zum Befehl "DIR %1 /s" hat diese Syntax den Vorteil, daß auch Teile des Dateinamens angegeben werden können: Geben Sie ein: SUCHE win ↵ Für das Suchen von Verzeichnissen ist etwas mehr Grundkenntnis über DOS nötig. Im Prinzip wäre es auf die gleiche Weise möglich Verzeichnisse so zu suchen, wie vorhin Dateien. Dazu muß man nur wissen, daß Verzeichnisse lediglich leere Dateien ohne Endung sind. Der Befehl "DIR *." gibt nur alle Unterverzeichnisse aus. In obiger Batchdatei müsste also nur eine Zeile verändert werden: dir \*. /s/p ¦ FIND "%1" /i FIND liefert, wie die meisten anderen Befehle, einen ERRORLEVEL zurück. Dieser ist 0, falls ein Eintrag gefunden wurde und größer (also 1), wenn nichts gefunden wurde. Ändern Sie die Datei SUCHE.BAT so ab, daß bei erfolgreicher Suche nur der Text "Gefunden!" ausgegeben wird! Die gefundenen Einträge sollen nicht angezeigt werden. Falls nichts gefunden wird, soll als Text nur "Leider nichts!" erscheinen (Lösung im Anhang D). Für Batchdateien ist es meist recht praktisch zu wissen, daß in jedem Verzeichnis eine NULDatei existiert. Diese NUL-Datei kann mit dem IF EXIST-Befehl geprüft werden. Allerdings hat dieser Befehl den Nachteil, nur eine bestimmte Datei in einem bestimmten Verzeichnis finden zu können. Deshalb kann er nicht allgemein verwendet werden. Nächstes Beispiel hat den Namen PFAD.BAT und stellt fest, ob ein vorgegebener Pfadname existiert. @echo off if not %1?= =? goto weiter echo Syntax: PFAD Verzeichnisname goto ende :weiter if exist %1\nul echo Verzeichnis gefunden! :ende Im nächsten Beispiel soll nach dem Windows-Verzeichnis gesucht werden: Geben Sie ein: PFAD c:\windows ↵ Kiermaier ©1995 Batchprogramme für DOS und WINDOWS 21 6.4. Automatische Installationsroutinen Die oben aufgeführten Erkenntnisse lassen sich nun praktisch umsetzen, um zum Beispiel Softwareinstallation automatisch durchführen zu lassen. Wenn Sie beispielsweise ein Archiv mit gepackten Dateien auf einer Diskette besitzen, wäre es sicher von Vorteil, wenn diese Dateien in das richtige Verzeichnis kopiert und dort ausgepackt werden. Sogar automatisierte Anpassungen in der Datei CONFIG.SYS oder AUTOEXEC.BAT sind möglich! 6.4.1. Installationslaufwerk und Verzeichnisse prüfen Da Installationsprogramme in der Regel von einer Diskette aus aufgerufen werden, muß zunächst festgestellt werden, in welchem Laufwerk die Diskette liegt. Am einfachsten geschieht dies mit dem VOL-Befehl, der die Laufwerksangabe beeinhaltet. Die Ausgabe des Befehls wird in einer Temporärdatei festgehalten und dann mit FIND auf die jeweilige Angabe durchsucht. Das nachstehende Beispiel mit dem Namen INSTALL.BAT prüft, ob es sich um Laufwerk A:, B: oder die Festplatte handelt. @echo off rem **** Installationsdatei, muß von A oder B aus gestartet werden **** set drive=C vol > c:\temp1$$.$$$ :search_a find "Laufwerk A" c:\temp1$$.$$$ if errorlevel 1 goto search_b set drive=A goto install > nul :search_b find "Laufwerk B" c:\temp1$$.$$$ > nul if errorlevel 1 goto no_valid_drive set drive=B goto install :no_valid_drive echo Diskette bitte von Laufwerk A: oder von Laufwerk B: aus starten! echo. echo Wechseln Sie das Laufwerk: A: [RETURN] oder B: [RETURN] echo Starten Sie erneut: INSTALL [RETURN] goto ende :install rem **** hier beginnt die Installation **** Die Umgebungsvariable %DRIVE% enthält jetzt den Laufwerksbuchstaben. Sie kann nun von jedem beliebigen Befehl in Batchdateien genutzt werden. Zum Beispiel: xcopy %drive%:\*.* c:\ Wenn man die Dateien aber in ein bestimmtes Verzeichnis kopieren will, muß man vielleicht erst prüfen, ob dieses Verzeichnis überhaupt existiert. Im nächsten Beispiel sollen Bildschirmschoner für Windows installiert werden. Diese Programme mit der Endung SCR müssen sich im Windows-Hauptverzeichnis befinden. Also muß vor dem Kopieren zunächst geprüft werden, in welchem Verzeichnis sich Windows befindet. Es wird angenommen, daß es Kiermaier ©1995 Batchprogramme für DOS und WINDOWS 22 sich um die Verzeichnisse C:\WINDOWS\ oder C:\WIN31 handelt. Die Suche geschieht nach bekanntem Schema: if not exist c:\windows\nul set windir=c:\windows\ goto install2 :win1 if not exist c:\win31\nul set windir=c:\win31\ goto install2 goto goto win1 fehler :fehler echo WINDOWS-Verzeichnis nicht gefunden echo Automatisches Installieren nicht möglich! goto ende :install2 rem **** hier beginnt das Kopieren oder die weitere Installation **** Nun steht in der Umgebungsvariablen %WINDIR% das richtige Verzeichnis. Wenn Sie jetzt die vorgenannten Beildschirmschoner installieren wollen, fehlt in der INSTALL.BAT nur noch der Kopierteil, um eine komplette Installationsdatei zu besitzen. xcopy %drive%:\*.scr del c:\temp1$$.$$$ set drive= set windir= echo Alles erledigt! %windir% 6.4.2. Automatische Installation mehrerer Disketten Es kann allerdings auch einmal vorkommen, daß man mehrere Disketten hat, die alle der Reihe nach installiert werden müssen. In diesem Fall muß zuerst eine zweite Installationsdatei auf die Festplatte kopiert und dann aufgerufen werden. Außerdem wird vorausgesetzt, daß sich im Label jeder Diskette die Nummer der Diskette befindet. Die Disketten haben also den Namen DISK1, DISK2, etc. Dadurch kann die Installation in einer kontrollierten Reihenfolge stattfinden, indem man mit VOL diesen Namen prüft. Eine Alternative dazu ist es, auf jeder Diskette eine Textdatei (Name: DISK_ID.TXT) zu haben, in der die Nummer der Diskette steht, also beispielsweise DISK1, DISK2, usw. Die folgende Batchdatei namens SETUP.BAT spiegelt den ersten Teil der Installationroutine wieder und ruft den zweiten Teil mit dem Namen INSTALL2.BAT auf. @echo off rem **** hier sollte wieder die Laufwerksabfrage aus INSTALL.BAT stehen **** rem **** anstelle dessen steht nur die folgende SET-Anweisung **** set drive=A xcopy install2.bat c: cd \ install2 weiter c:\ > nul Kiermaier ©1995 Batchprogramme für DOS und WINDOWS 23 Der zweite Teil enthält nun die eigentliche Installation, wobei jederzeit die Disketten gewechselt werden können. Der Parameter "weiter" wird nur übergeben, um prüfen zu können, ob die Datei INSTALL2.BAT von SETUP aufgerufen wurde oder per direkter Eingabe (Bedienungsfehler). @echo off if %1= =weiter goto install echo Bitte Diskette 1 einlegen und SETUP aufrufen! goto ende :install rem **** hier beginnt nun die eigentliche Arbeit md c:\zielpfad cd c:\zielpfad xcopy %drive%:\*.exe > nul **** :disk2 echo Bitte Diskette 2 einlegen pause vol %drive%: ¦ find "DISK2" > nul rem Alternativ: if not exist %drive%:\disk_id.txt goto rem find "DISK2" %drive%:\disk_id.txt > nul if errorlevel 1 goto disk2 xcopy %drive%:\*.* > nul :disk3 echo Bitte Diskette 3 einlegen pause vol %drive%: ¦ find "DISK3" if errorlevel 1 goto disk3 xcopy %drive%:\*.* > nul disk2 > nul echo Alles erledigt! :ende 6.4.3. Erweitern der AUTOEXEC.BAT und CONFIG.SYS Nach einer erfolgreichen Installation kann es nötig sein, das bestimmte Einträge in die Systemdatei AUTOEXEC.BAT oder CONFIG.SYS vorgenommen werden müssen. Selbstverständlich könnte man dies von Hand tun, aber eine richtige Installationsdatei erledigt auch das. Um es nicht unnötig kompliziert werden zu lassen, wird vorausgesetzt, daß keine Startmenüs (ab DOS 6.0 möglich) eingesetzt werden. In diesem Fall können neue Teile an die bestehende Systemdatei angehängt werden. Als Beispiel werden wir die normale Eingabeaufforderung (meist C:\>) durch eine ganz besondere ersetzen. Zu diesem Zweck muß das alte Prompt aus der AUTOEXEC.BAT entfernt werden und das neue eingefügt oder hinten angehängt werden. Da in vielen Rechnern in der Startdatei die DOSSHELL oder Windows aufgerufen wird, wäre unser neues Prompt erst nach Beendigung dieser Programme zu sehen. Also ist es in der Regel besser, neue Teile weiter oben in die Startdatei einzufügen. Dazu schreiben wir als erstes eine kurze Textdatei mit dem Namen TEIL1.BAT. Anstelle der " " sind Leerzeichen einzusetzen! Tippfehler wirken sich ungünstig aus, also lieber zweimal kontrollieren. @echo off prompt $e[s$e[?7l$e[1;44;33m$e[1;1H$e[K$p$e[1;55H $d / $t $e[3D:$e[0;2m$e[u$e[0;31m»$g$e[0;37m$e[7h Nachdem wir nun das neue Prompt eingegeben und TEIL1.BAT stehen haben, müssen wir das alte Prompt aus der AUTOEXEC.BAT entfernen. Das ist relativ einfach mit dem FIND-Filter Kiermaier ©1995 Batchprogramme für DOS und WINDOWS 24 möglich. Wir suchen einfach alle Zeilen, die nicht den Befehl PROMPT enthalten. Dazu verwenden wir den Schalter "/V" und leiten das Ergebnis in eine Temporärdatei um. Anschließend entfernen wir auch noch den ECHO OFF Befehl in der ersten Zeile und fügen den Rest mit unserer TEIL1.BAT zur neuen AUTOEXEC.BAT zusammen. Das Programm soll NEUPROM.BAT heißen: @echo off type c:\autoexec.bat ¦ find "PROMPT" if errorlevel 1 goto ende type c:\temp1.$$$ ¦ find "ECHO OFF" if errorlevel 1 goto ende del c:\autoexec.bat copy teil1.bat + c:\temp2.$$$ echo J | del c:\temp?.$$$ echo Alles erledigt! :ende /i /V > c:\temp1.$$$ /i /V > c:\temp2.$$$ c:\autoexec.bat >nul 6.4.4. Automatischer Neustart des Rechners Nach dem Einbau eigener Teile in die Startdatei muß der Rechner neu gestartet werden, um sie wirksam werden zu lassen. Leider gibt es keinen DOS-Befehl für den Neustart des Computers. Man muß sich also selbst helfen, indem man mit dem Hilfsprogramm DEBUG.EXE ein entsprechendes Programm schreibt. Das ist relativ einfach, wenn man sich an die folgenden Vorgaben hält: Geben Sie ein: Geben Sie ein: debug c:\dos\reset.com a100 ↵ pop ds ↵ mov wo[472],1234 ↵ jmp FFFF:0000 ↵ ↵ rcx ↵ c w q ↵ ↵ ↵ ↵ Jetzt besitzen Sie eine Datei mit dem Namen RESET.COM. Wenn Sie dieses Programm durch Eingabe von RESET aufrufen, wird ein Warmstart des Computers durchgeführt. Ideal ist es natürlich, diesen Befehl in die vorhin erwähnte NEUPROM.BAT einzubauen. Dazu müssen nur an das Ende der Datei einige Befehle angehängt werden: echo Der Rechner wird nun neu gestartet! echo Bitte die Diskette aus dem Laufwerk A nehmen. pause reset Kiermaier ©1995 Batchprogramme für DOS und WINDOWS 25 6.5. Datum und Uhrzeit abfragen: ein Terminkalender Gelegentlich kann es von Vorteil sein, wenn man das Datum oder die Uhrzeit in Batchdateien zur Verfügung hat. Damit lassen sich beispielsweise Sicherungskopien mit dem Datum als Dateinamen versehen, so daß man leicht erkennen kann, in welcher Datei die Daten eines bestimmten Tages liegen. Abgesehen davon kann es interessant sein, daß ein Programm nur an einem bestimmten Tag im Jahr gestartet wird (zum Beispiel ein Aprilscherz oder an einem Freitag, den 13.). Die dazu nötige Batchdatei ist ziemlich lang, da jeder Tag und jedes Monat einzeln mit dem aktuellen Datum verglichen werden muß. Deshalb wird in der nächsten Beispieldatei HEUTE.BAT nur ein Ausschnitt wiedergegeben, kann aber leicht vervollständigt werden. @echo off echo. ¦ date > temp.$$$ rem **** aktuellen Tag feststellen find " 01." temp.$$$ > nul if errorlevel 1 goto d02 set tag=01 goto month :d02 find " 02." temp.$$$ > nul if errorlevel 1 goto d03 set tag=02 goto month :d03 **** rem **** hier wiederholt sich alles bis einschließlich dem 30. :d30 find " 30." temp.$$$ if errorlevel 1 goto set tag=30 goto month :d31 set tag=31 **** > nul d31 rem **** aktuellen Monat feststellen :month find ".01." temp.$$$ > nul if errorlevel 1 goto m02 set monat=01 goto ende :m02 find ".02." temp.$$$ > nul if errorlevel 1 goto m03 set monat=02 goto ende :m03 **** rem **** hier wiederholt sich alles bis einschl. November (.11.) :m11 find ".11." temp.$$$ if errorlevel 1 goto set monat=11 goto ende :m12 set monat=12 > nul m12 :ende set datum="%tag%.%monat%." set tag= set monat= del temp.$$$ **** Kiermaier ©1995 Batchprogramme für DOS und WINDOWS 26 Somit steht nach Ausführung dieser Batchdatei das aktuelle Datum in der Umgebungsvariable %DATUM% zur Verfügung. Auf die Jahreszahl wurde bewußt verzichtet, sie kann aber nach dem gleichen Schema ermittelt werden. Mit dieser Umgebungsvariablen kann nun beispielsweise eine Reihe Termine durchgesehen werden. Sobald ein Datum gefunden wird, das dem aktuellen gleicht, wird der Termin auf dem Bildschirm ausgegeben. Nennen Sie die nächste Beispieldatei KALENDER.BAT: @echo off call heute.bat echo Nicht vergessen: > temp.$$$ echo. >> temp.$$$ type termine.txt ¦ find %datum% if errorlevel 1 goto ende echo ←[33;47;1m type temp.$$$ ¦ more echo ←[37;40;0m pause :ende if exist temp.$$$ del temp.$$$ >> temp.$$$ In der Datei TERMINE.TXT legen Sie nun Ihre wichtigen Daten ab. Als Beispiel speichern wir hier einige Feiertage ab: 06.01. 24.12. 01.01. 16.04.95 Heilig Drei König Weihnachten Ein gutes neues Jahr! Frohe Ostern '95 Sie sehen, daß es nicht auf die Reihenfolge der Termine ankommt. Es muß aber in jedem Fall ein zweiziffriger Tag und Monat sein (also führende Null nicht vergessen). Der FIND-Filter zeigt dann wieder die ganze, zum aktuellen Datum gehörige Zeile an. Wenn Sie das Ganze in die Startdatei AUTOEXEC.BAT einbauen, wird automatisch nach dem Einschalten des Rechners ein Termin angezeigt (falls einer gefunden wurde). Verwenden Sie dazu einfach den Befehl CALL KALENDER Oder lassen Sie ihn mit einer entsprechenden Installationsroutine automatisch in Startdatei einbauen. 6.6. Diverses 6.6.1. Temporärverzeichnis automatisch löschen In jeder AUTOEXEC.BAT (seit MS-DOS 5.0) befindet sich der Eintrag "SET TEMP=". Damit wird festgehalten, wohin DOS und WINDOWS vorübergehend Dateien schreiben sollen, wenn Sie zwischen den einzelnen Anwendungen wechseln. Diese Temporärdateien werden nach dem Gebrauch nicht mehr gelöscht, was aber manchmal den Vorteil hat, daß nach einem Systemabsturz oft wieder Daten rekonstruiert werden können. Trotzdem sammelt sich sehr rasch eine Kiermaier ©1995 Batchprogramme für DOS und WINDOWS 27 große Anzahl an Dateien an, die von Zeit zu Zeit wieder gelöscht werden müssen. Setzen wir für dieses Beispiel voraus, daß ihre Temporärdateien ins Verzeichnis C:\TEMP geschrieben werden, d.h. in der Datei AUTOEXEC.BAT steht "SET TEMP=C:\TEMP". Nennen Sie das nächste Beispiel WINDOWS.BAT und speichern Sie es im Verzeichnis C:\DOS. Bei jedem Aufruf von WINDOWS mit dieser Batchdatei wird dann das Temporärverzeichnis geleert. @echo off attrib -r-h-s c:\temp\*.* echo J ¦ del c:\temp\*.* cd \windows win : 6.6.2. Zweite Konfiguration für Spiele Manche Spiele kommen mit dem Speicher, den DOS zur Verfügung stellt, nicht aus und machen es deshalb notwendig, von einer Startdiskette aus eine andere Konfiguration zu laden. Abgesehen davon, daß diese Startdiskette ständig in Griffnähe bereit liegen muß, ist es einfach lästig und hält nur unötig auf. Besser ist es, wenn man entweder das Startmenü von MS-DOS 6.0 oder eine kleine Batchdatei benutzt, die nur die Startdateien AUTOEXEC.BAT und CONFIG.SYS umbenennt und dann automatisch neu startet. Dazu nötig ist allerdings die Datei RESET.COM, die wir bereits in einem früheren Abschnitt mit DEBUG erstellt haben. Das Batchprogramm mit dem Namen SPIEL.BAT sichert zuerst die beiden Startdateien, indem es sie mit einem anderen Namen versieht. Anschließend werden die vorbereiteten Startdateien für das Spiel (mit der Endung GAM) so umbenannt, daß DOS nach dem RESET mit diesen Programmen startet. Beim zweite Aufruf des Batchprogramms wird dieser Vorgang wieder umgekehrt und DOS startet wieder mit den Orginaldateien. @echo off cd \ if exist autoexec.org goto orginal ren autoexec.bat autoexec.org ren autoexec.gam autoexec.bat ren config.sys config.org ren config.gam config.sys goto ende :orginal ren autoexec.bat autoexec.gam ren autoexec.org autoexec.bat ren config.sys config.gam ren config.org config.sys :ende reset.com 6.6.3. DOS-Befehle erweitern und entschärfen Da Macros, die mit DOSKEY definiert wurden, vor anderen DOS-Programmen mit gleichem Namen ausgeführt werden, kann man bestimmte DOS-Befehle anders oder neu erstellen. Im nächsten Beispiel wird so der Befehl DEL ersetzt. Wenn man dann eine Datei löschen möchte, wird sie zuerst in das Temporärverzeichnis C:\TEMP kopiert und dann gelöscht. Das hat den Vorteil, das sie im Zweifelsfall sofort wieder aus dem Temporärverzeichnis geholt werden kann. Nur ab und zu sollte dann das Temporärverzeichnis C:\TEMP wieder gelöscht werden. Übrigens kann man diese Umleitung des DEL-Befehls einfach umgehen, indem man entweder den Befehl Kiermaier ©1995 Batchprogramme für DOS und WINDOWS 28 ERASE benutzt oder vor DEL ein Leerzeichen an den Zeilenanfang setzt. Unter diesen Umständen wird nämlich der Orginalbefehl ausgeführt. Die beiden Macros EC und EA erleichtern das Bearbeiten der beiden Startdateien. Nenn Sie dieses Batchprogramm MACRO.BAT und schreiben Sie den Befehl CALL MACRO.BAT anstelle des DOSKEYBefehls in Ihre AUTOEXEC.BAT. @echo off LH doskey /insert doskey del=xcopy $1 c:\tmp $g nul doskey ec=edit c:\config.sys doskey ea=edit c:\autoexec.bat $T del $1 Kiermaier ©1995 Batchprogramme für DOS und WINDOWS 29 7. ANHANG A: Die ANSI-Sequenzen Die Datei CONFIG.SYS enthält oft einen Gerätetreiber mit dem Namen ANSI.SYS. Wenn dieses Programm installiert ist, stehen viele Funktionen wie beliebige Cursorbewegungen, Bildschirmeinstellungen und Tastaturumbelegungen möglich. Die jeweilige Funktion wird dabei durch eine einfache Textausgabe auf den Bildschirm oder zum Beispiel mit dem PROMPTBefehl bewerkstelligt. Um aber einen ANSI-Befehl von normalem Text unterscheiden zu können, muß ein spezieller Code vereinbart werden. Dies sind die sogenannten EscapeSequenzen (zu deutsch: Fluchtsequenz oder besser Escape-Steuercodes). Sie werden so genannt, weil sie mit einem ESC-Zeichen (ASCII-Code 27) eingeleitet werden. Auf das ESC-Zeichen folgt immer die eckige Klammer "[". Beide zusammen ergeben die Escape-Sequenz, die vor jedem Steuerbefehl angegeben sein muß. Da das ESC-Zeichen selbst meist nicht in einem Editor oder in der Befehlszeile eingegeben werden kann (nicht druckbares Steuerzeichen), werden manchmal Ersatzzeichenfolgen wie "$e" verwendet. 7.1. Cursor- und Bildschirmsteuerung Um den Cursor an eine bestimmte Stelle zu bewegen oder die Bildschirmfarben zu ändern, stehen viele Escape-Sequenzen zur Verfügung. Einige davon (die wichtigsten) werden nachfolgend aufgeführt. Dabei steht die Zeichenfolge ESC[ für die ANSI-Startsequenz, also das Escapezeichen (ASCII-Code 27) und die offene, eckige Klammer. Dahinter folgen ein oder mehrere Parameter, die durch einen Strichpunkt getrennt werden und ein Steuerkommando. Das Steuerkommando besteht aus einem einzelnen Buchstaben, wobei auf die Groß- und Kleinschreibung geachtet werden muß. ESC[y;xH ESC[s ESC[u ESC[2J ESC[vc;hc;am Cursor bei x,y positionieren Cursorposition speichern Cursorposition wiederherstellen Bildschirm löschen (CLS) Bildschirmattribute ändern x=0..79, y=0..24 vc=Vordergrundfarbe, hc=Hintergrundfarbe, a=Textattribut Um diese Steueranweisungen zu nutzen, kann zum Beispiel der PROMPT-Befehl benutzt werden. Es lassen sich damit sehr komfortable Eingabeaufforderungen erzeugen oder die Hintergrundfarbe des Bildschirms vom tristen Schwarz in eine der anderen Farben ändern. Folgende Tabelle zeigt alle Bildschirmattribute und Farben, die mit der letzten Steuersequenz aus der oben angegebenen Tabelle eingestellt werden können. Farbe Schwarz Rot Grün Gelb Blau Magentarot Cyanblau Weiß Vordergr. 30 31 32 33 34 35 36 37 Hintergr. 40 41 42 43 44 45 46 47 Textattribute Normal Fettdruck (hell) Code 0 1 Blinken 5 Invertiert Verdeckt 7 8 Kiermaier ©1995 Batchprogramme für DOS und WINDOWS 30 Damit kann man zum Beispiel eine farbige Eingabeaufforderung einstellen: Geben Sie ein: PROMPT $e[34;1m$p$g$e[37;0m ↵ Mit zwei Befehlen läßt sich auch der gesamte Bildschirm einfärben: Geben Sie ein: Geben Sie ein: PROMPT $e[44;33;1m$e[2J ↵ PROMPT $p$g ↵ Das nächste Beispiel ist ein wahrer Superprompt, der an der oberen rechten Bildschirmecke immer das aktuelle Datum und die Uhrzeit ausgibt. Geben Sie ein: PROMPT $e[s$e1;67H$d$e[2;70H$t$e[u$p$g ↵ Nächstes Beispiel färbt Datum und Uhrzeit, sowie das Prompt auch noch farbig ein: Geben Sie ein: PROMPT $e[41;37;1m$e[s$e1;67H$d$e[2;70H$t$e[u$e[40;34;1m$p$g$e[37;0m ↵ 7.2. Tasten umbelegen Unter Benutzung des PROMPT-Befehls können mit den ANSI-Sequenzen auch Tasten umbelegt oder sogar ganze Befehle auf eine Taste gelegt werden. Dazu muß der Code des Zeichens angegeben werden und das Zeichen oder der Befehl, den diese Taste bewirken soll. Das Steuerkommando hinter dieser Zeichenfolge ist der Buchstabe p. Um zum Beispiel die relativ unbenutzte Taste "#" mit dem häufig gebrauchten Rückschlag "\" zu belegen, ist folgendes zu tun: Geben Sie ein: Geben Sie ein: PROMPT $e["#";"\"p ↵ PROMPT $p$g ↵ Es muß allerdings dazu gesagt werden, daß viele Textverarbeitungsprogramme eine eigene Tastenauswertung besitzen und daher eine solche Umbelegung keine Auswirkung hat. Es können jedoch nicht nur Tastencodes umbelegt werden, sondern auch ganze Befehle einer Taste zugeordnet werden. Besonders geeignet sind dazu die Funktionstasten F10 bis F12, weil sie von DOS nicht anderweitig benutzt werden. Geben Sie ein: Geben Sie ein: PROMPT $e[0;68;"DIR"p ↵ PROMPT $p$g ↵ Das Beispiel belegt die Taste F10 mit dem DIR-Befehl (F11 = 0;133). Kiermaier ©1995 Batchprogramme für DOS und WINDOWS 31 8. ANHANG B: Das Programm DOSKEY Will man mehr als nur den zuvor eingegebenen Befehl zur Verfügung haben, so muß man das Programm DOSKEY aufrufen. Es installiert sich dann resident (= dauerhaft) im Speicher. Durch dieses Programm hat man die Möglichkeit, wesentlich mehr Befehle zu speichern und wieder zurück zu holen. Sobald DOSKEY geladen ist, speichert es eine Liste der eingebenen Befehle. Die Liste kann mit der Taste F7 angezeigt werden. Dabei ist am Anfang der Zeilen jedem Befehl eine Zahl zugeordnet. Geben Sie ein: DOSKEY MD \MYTEMP COPY *.BAT C:\MYTEMP Drücken Sie nun die F7-Taste! ↵ ↵ ↵ Mit den Tasten NACH-OBEN und NACH-UNTEN können Sie einen der eingebenen Befehle wiederaufrufen. Sie werden nacheinander in die Befehlszeile kopiert, wo Sie sie entweder weiter bearbeiten oder nochmal ausführen können. Drücken Sie die NACH-OBEN-Taste bzw. NACH-UNTEN-Taste bis Sie den Kopierbefehl wieder in der Anzeige haben! Ändern Sie die Endung BAT im Befehl in SYS, indem Sie die NACH-LINKS-Taste bzw. NACH-RECHTS-Taste benutzen und drücken Sie dann ↵! Abgesehen von der Möglichkeit den gewünschten Befehl zu suchen, können Sie mit der F9Taste sofort den Befehl wieder reaktivieren. Dazu werden Sie nach dem Drücken der Taste aufgefordert, die Nummer des Befehls einzugeben. Es kann also erforderlich sein, sich vorher mit F7 die Liste noch einmal anzusehen. Sollte es sich nach der Eingabe der Nummer heraustellen, daß es der falsche Befehl war, so kann der Befehl mit der ESC-Taste wieder von der Anzeige gelöscht werden und ein erneuter Versuch erfolgen. Drücken Sie die Taste F9 und anschließend die Taste 2 (falls dort Ihr Kopierbefehl war) Ändern Sie die Endung BAT im Befehl in COM, indem Sie die NACH-LINKS-Taste bzw. NACH-RECHTS-Taste benutzen und drücken Sie dann ↵! Sobald man längere Zeit mit DOSKEY arbeitet, wird die Liste immer unübersichtlicher. Dann wird es meist Zeit, mit Hilfe der Tastenkombination ALT-F7 alle Befehle in der Liste zu löschen. Drücken Sie gleichzeitig die ALT- und die F7-Taste! Drücken Sie nun die F7-Taste allein, um sich den Listeninhalt anzusehen! ) Das Programm DOSKEY läßt eine sehr flexible Editierung und Wiederholung aller bereits eingegebener Befehle zu. Kiermaier ©1995 Batchprogramme für DOS und WINDOWS 32 8.1. Eingeben mehrerer Befehle in einer Zeile Normalerweise kann nur ein Befehl je Zeile eingegeben werden. Wenn jedoch DOSKEY installiert ist, können auch mehrere Befehle hintereinander in die gleiche Zeile geschrieben werden. Dazu drücken Sie nach jedem Befehl die Tastenkombination STRG-T (= sTop) und geben dann den nächsten Befehl ein. Erst am Schluß wird dann die Eingabetaste gedrückt und alle Befehle der Reihe nach abgearbeitet. Es können allerdings nicht mehr als 128 Zeichen je Zeile eingegeben werden! Geben Sie ein: DEL \MYTEMP\*.* Drücken Sie STRG-T Geben Sie dann ein: RD \MYTEMP (nicht ↵ drücken!) ↵ ) Mit dem Programm DOSKEY können auch mehrere Befehle in einer Zeile eingegeben werden. 8.2. Erstellen eigener Befehle (Makros) Neben den bisher genannten Möglichkeiten können mit DOSKEY auch eigene neue Befehle erstellt werden. Weil dabei mehrere DOS-Befehle unter einem neuen Überbegriff zusammengefaßt werden, nennt man dies auch einen MAKRO. Um ein Makro zu erzeugen, gibt man hinter dem Aufruf von DOSKEY einfach den Namen des Makros (= neuer Befehlsname) und nach einem Gleichheitszeichen den DOS-Befehl mit seine spezifischen Parameter an. Geben Sie ein: Geben Sie ein: DOSKEY WDIR = DIR /O:N /W ↵ WDIR ↵ Es ist natürlich auch wieder möglich, mehrere Befehle in einer Zeile anzugeben. Allerdings kann zur Trennung der Einzelbefehle nicht die Tastenkombination STRG-T benutzt werden, sondern es muß die STRG-Taste durch das Dollarzeichen ersetzt werden. Als Trennung wird also die Zeichenfolge $T angegeben. Geben Sie ein: Geben Sie ein: DOSKEY PROG = DIR *.COM $T DIR *.EXE ↵ PROG ↵ Bei manchen Befehlen müssen beim Aufruf Werte mit übergeben werden. Das ermöglicht es, Befehle flexibler zu gestalten. Für diese Übergabewerte kann bei Makrodefinitionen ein Platz freigehalten werden. Dazu verwendet man die Variablen $1 bis $9. Wann immer DOS bei der Ausführung auf eine solche Variable trifft, ersetzt es sie durch den entsprechenden beim Aufruf übergebenen Wert. Das bedeutet, $1 steht für den ersten Übergabewert, $2 für den zweiten, usw., aufsteigend bis $9 (für den neunten Wert). Kommt also nur ein Wert vor, so heißt die Variable $1. Falls die Anzahl der Übergabewerte nicht bekannt ist, kann auch die Variable $* benutzt werden. In diesem Fall wird dann der gesamte Text hinter dem aufrufenden Befehl übernommen. Geben Sie ein: Geben Sie ein: DOSKEY SUCH = DIR $1 /S ↵ SUCH *.DOC ↵ Kiermaier ©1995 Batchprogramme für DOS und WINDOWS 33 Da diese Befehle mit dem Ausschalten des Rechners verloren gehen, sollten Sie bei häufiger Verwendung in die Stapeldatei AUTOEXEC.BAT eingefügt werden. Sie stehen dann nach jedem Einschalten des Rechners sofort zur Verfügung. ) DOSKEY ermöglicht es auch eigene Befehlskombinationen, sogenannte Makros, zu erstellen. 9. ANHANG C: Das DEBUG-Dienstprogramm Das DEBUG-Dienstprogramm ist nicht nur ein Werkzeug für Spezialisten, wie oft behauptet wird, sondern es ermöglicht auch dem Normalanwender hervoragende Möglichkeiten, Dateien und Programme anzusehen und zu manipulieren. Dazu stehen eine Reihe von Befehlen zur Verfügung, die alle mit einem Buchstaben beginnen und dahinter ein oder mehrere Parameter erfordern. Davon wollen wir einige wenige benutzen und so einen kleinen Einblick in die geheimnisvolle Welt hinter den Dateinamen tun. Wir schreiben uns dazu ein kleines Programm, das den CHOICE-Befehl von DOS 6.x auch für DOS 5.0 Programme zur Verfügung stellt. Wir schreiben das Programm in ASSEMBLER, also der Maschinensprache, mit der der Computer arbeitet. Rufen Sie dazu das Programm DEBUG.EXE auf: Geben Sie ein: DEBUG ↵ Es erscheint ein kleines Minuszeichen als Eingabeaufforderung. Nun starten wir den Assembler. Geben Sie ein: a100 ↵ Es erscheint die Speicheradresse 100. Dahinter tippen Sie das folgende Programm ab. mov int mov int ah,7 21 ah,4c 21 ↵ ↵ ↵ ↵ ↵ Wenn Sie zweimal die Eingabetaste gedrückt haben, steht wieder das Minuszeichen da. Die Befehle bewirken nur, daß von der Tastatur ein Zeichen eingelesen wird und dessen ASCII-Code als ERRORLEVEL zurückgegeben wird. Um uns die Befehle noch einmal anzusehen, geben Sie 'u100' ein. Geben Sie ein: u100 ↵ Alle Befehle werden nocheinmal angezeigt. Beachten Sie, daß nach den eingegebenen auch weitere Befehle enthalten sind. Dies ist kein Programm, sondern nur zufällige Speicherinhalte. Der Prozessor interpretiert sie trotzdem als Programm. Wenn der Rechner 'abstürzt', führt er meist solche sinnlosen Befehle aus, bis er neu gestartet wird. Kiermaier ©1995 Batchprogramme für DOS und WINDOWS 34 Im Speicher des Computers sind meist auch Texte enthalten, man kann sie mit dem Befehl D ansehen. Geben Sie ein: d0 L6000 ↵ Um unser Programm zu speichern, geben wir ihm den Namen INPUT.COM. Geben Sie ein: nC:\DOS\INPUT.COM ↵ Dann speichern und beenden wir den Debugger mit den Tasten W (=write) und Q (=quit). Geben Sie ein: Geben Sie ein: Geben Sie ein: Geben Sie ein: ↵ ↵ ↵ ↵ rcx 8 w q Folgendes Beispielprogramm zeigt die Anwendung unseres neuen Befehls. Sie können es im DOS-Editor abtippen und unter AUSWAHL.BAT speichern. @ECHO OFF CLS ECHO ***** AUSWAHL - MENÜ ***** ECHO. ECHO 1 = erstes Programm ECHO 2 = zweites Programm ECHO ESC = Ende ECHO. ECHO Bitte wählen: :ANFANG INPUT IF ERRORLEVEL IF ERRORLEVEL IF ERRORLEVEL IF ERRORLEVEL IF ERRORLEVEL GOTO ANFANG = = = = = 51 50 49 28 27 GOTO GOTO GOTO GOTO GOTO :PROG1 ECHO Das erste Programm GOTO ENDE :PROG2 ECHO Das zweite Programm GOTO ENDE :ENDE ECHO Auf Wiedersehen ANFANG PROG1 PROG2 ANFANG ENDE Kiermaier ©1995 Batchprogramme für DOS und WINDOWS 10. ANHANG D: Lösungen zu den Aufgaben Aufgabe 1: Batchdatei: Syntax: FORM!.BAT FORM! Laufwerk: @echo off if %1?= =? goto fehler1 if %1= =c: got fehler2 if %1= =C: got fehler2 echo. ¦ format %1 goto ende :fehler1 echo Kein Laufwerk angegeben! goto ende :fehler2 echo Festplatte C: darf nicht formatiert werden! :ende Aufgabe 2: Batchdatei: Syntax: MENU.BAT MENU @echo off cls echo **** Auswahl-Menü ***** echo. echo D = DOSSHELL echo W = WINDOWS echo E = Eingabeaufforderung echo. choice Bitte wählen: /C:DWE /T:E,5 if errorlevel 3 goto eingabe if errorlevel 2 goto menu2 if errorlevel 1 goto menu1 :eingabe echo Hallo, User! goto ende :menu1 dosshell goto ende :menu2 win :ende 35 Kiermaier ©1995 Batchprogramme für DOS und WINDOWS Aufgabe 3: Batchdatei: Syntax: SUCHE.BAT SUCHE Dateiname @echo off if not %1?= =? goto weiter echo Syntax: SUCHE Dateiname goto ende :weiter dir \*.* /s/p ¦ FIND "%1" if errorlevel 1 goto nichts echo Gefunden! goto ende :nichts echo Leider nichts! :ende /i > nul 36