Batch dateien handbuch

72
Stapelverarbeitungsdateien Start mit BATCH Lars Aschenbach www.KnowWare.de 2. Ausgabe 125 Ideen & Beispielsammlung Programmierung @echo off if %2.==.goto err copy %1 %2 > nul del %1 goto off :err echo Zielangabe fehlt! :off für DOS - relevant unter Windows 9x ? ! KnowWare Free!

Transcript of Batch dateien handbuch

Page 1: Batch dateien handbuch

Stapelverarbeitungsdateien

Start mit

BATCH

Lars Aschenbach

www.KnowWare.de 2. Ausgabe

125

Ideen & Beispielsammlung

Programmierung

@echo off

if %2.==.goto err

copy %1 %2 > nul

del %1

goto off

:err

echo Zielangabe fehlt!

:off

für DOS - relevant unter Windows 9x

? !

KnowWare

Free!

Page 2: Batch dateien handbuch

KnowWare

© Lars Aschenbach - Batchprogrammierung - 06-03-04

2

Start mit BATCH ProgrammierungLars Aschenbach, [email protected]. Ausgabe, 3. Auflage, 1996-10, 4. Auflage 2001-04ISBN 3-931666-25-5© Copyright 2001, Autor und KnowWare

www.knowware.de

Page 3: Batch dateien handbuch

Inhalt

© Lars Aschenbach - Batchprogrammierung - 06-03-04

3

Das kleine DOSsier ............................. 5Laufe ich auf dem PoFo oder dem PC? ... 6Laufwerk vorhanden, Diskette

eingelegt? ....................................... 9Ausgeklammert? .............................. 11Die Entwicklung................................ 12Der gute Ton ................................... 12KILL.BAT - löschen mit Reserve .......... 13Verzeichnisanlage mit folgendem

Verzeichniswechsel ......................... 13Eine Zeitschleife im DIP-OS................ 14Datei verschieben............................. 14Der Agentenaustausch ...................... 14Fehlerhafte Eingaben minimieren ........ 16Label löschen................................... 17Die geheimen Optionen /F und /V ....... 17DOS Fehlermeldungen....................... 18Exklusives Datei löschen.................... 18�IF ... ECHO .>Datei� ........................ 19In einem Atemzug ............................ 20Stringbearbeitung unter DOS ............. 21Batchdateien in der Literatur .............. 22Leerzeilen bei der Bildschirmausgabe

durch Batchdateien? ....................... 22Wildcards * ? - Teil 2 ........................ 23Sprungmarken - Teil 3 ...................... 24Bedingtes SHIFTen ........................... 24Das Gerät NUL ................................. 25Ein DOS vor Version 3.30 .................. 26Erste Hilfe!!! .................................... 274DOS für den PoFo und andere MS-DOS

Pockets......................................... 27ALLREAD.BAT - für Leseratten ............ 28ANSI.SYS-TIP: Escapesequenz ........... 28Batch bearbeitet das Batchverzeichnis . 29Befehle in Variablen .......................... 30Printer-Adapter & CE-126P................. 32Umlaute an- oder abschalten! ............ 33Variablen einchecken ........................ 33Tastatureingaben in Batchdateien?...... 35Unbekannter Befehl in der CONFIG.SYS36Die versteckte Datei des PoFo ............ 37Verzeichnis kopieren ......................... 38Nun mach aber mal einen Punkt! ........ 38Countdown - der Computer lernt zählen39Viele Dateien - ein Datum.................. 40Dateinamen in Variablen.................... 40Aufräumarbeiten .............................. 41Verzeichnis löschen........................... 41

Variablen tilgen ................................ 41Übergeordnetes Verzeichnis löschen .... 42Vermeidung von endlosen Eingaben .... 42FASTDEL.BAT - löschen ohne Rückfrage43FASTPRNT.BAT - Massendrucksache .... 44Fiese Verzeichnisse ........................... 44CTRL.BAT - Steuerzeichen in Variablen 45Verzeichnis verschieben..................... 45Multiprocessing mit dem PoFo............. 46Kurzfristige Pfadänderung .................. 46Eine zweite Ramdisk namens D: ......... 47Rekursive Batchdateien ..................... 47Verzeichnis umbenennen ................... 48Variablen umbenennen & kopieren ...... 49Schalt-Technik ................................. 50Ur-Startlaufwerk ermitteln! ................ 50Eine unlöschbare Variable simulieren! .. 51SYSTEMFEHLER -Verzeihung! ............. 52Vergaloppiert & -kopiert? ................... 52UPDATE.COM & PORTDIV.COM............ 53Wo bin Ich? ..................................... 53Auch Kleines wird einmal Groß............ 54GW-Basic auf dem PoFo - Teil 3 .......... 56Spielereien mit dem PROMPT.............. 57Die automatische Sicherung des

Environments................................. 58Umgebungsspeicher löschen............... 60GW-Basic auf dem PoFo!!!.................. 62"GROß und artig" .............................. 63Das kleine Einmaleins für DOS............ 67Fehlverhalten des Befehles SET unter

MS-DOS! ....................................... 69Der Lupus Basicus - eine Erweiterung

des brehmschen Tierleben ............... 71

Page 4: Batch dateien handbuch

Vorwort

© Lars Aschenbach - Batchprogrammierung - 06-03-04

4

Vorwort

Batchdateien sind wahre �Helferlein� beider täglichen PC / EDV-Arbeit. VielenProgrammen sind mit zusätzliche *.BATvorangestellt um Treiber fürNetzwerkkarten, Modem, ISDN etc. zuladen. Daß die tägliche Arbeit mit dem PCmit Batchdateien wesentlich erleichtertwerden kann ist, eingefleischten DOS -Fans durchaus bekannt. Nach wie vorlaufen reine DOS Programme, meist umFaktor 10 schneller als Programme dieeine grafische Benutzeroberflächebenutzen WINDOWS / GEM / MAC etc.Besonders im Netzbetrieb in Verbindungmit Datenbanken ist auf DOS und somitauf Batchdateien und Routinen nicht zuverzichten.

Lars Aschenbach hat sich in den letztendrei Jahren sehr intensiv mit derBatchprogrammierung unter verschiede-nen Betriebssystemenauseinandergesetzt und uns eine kleineAuswahl seiner gesammelten Werke, diealle ohne Kopierrecht wiederverwendetwerden dürfen, unentgeltlich zurVerfügung gestellt.

Lars ist sehr daran interessiert, weitereBATCHES kennenzulernen. Wer welchehat - bitte per Email schicken.

Wer von euch keine Lust auf dieTipparbeit hat oder mehr Batcheskennenlernen möchte, kannChristian Peter, Im Osterbach 5, 36211Alheimeinen Scheck über DM 10.- schicken undbekommt eine gute Auswahl mit allenErklärtexten zugeschickt.Und nun heißt es: batch as batch can...

Lars Aschenbach

Page 5: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

5

Das kleine DOSsierJeder Computer benötigt ein Programm,damit sein Bediener mit ihm kommunizierenkann. Schließlich muß der Computer das überdie Tastatur eingegebene analysieren undausführen, damit der Bediener seingewünschtes Ziel erreicht.

Dieses Programm nennt manBetriebssystem, da es den gesamten Betriebim Computer systematisch steuert und dieVorgaben des Bedieners zu erfüllen hat.

Sklave Betriebssystem, denn nur derBediener befiehlt seine Tätigkeit, isthauptsächlich dazu da, die Daten desBedieners zu speichern, auszuführen und zuverwalten. Weil schon alt zu nennendeComputer nur über Disketten als Datenträgerverfügten, nannte und nennt man dasBetriebssystem auch heute noch �DiskOperating System�, kurz �DOS�.

Auch wenn es heute DOS-Versionen wieMS-DOS, PC-DOS, NWDOS, MSX-DOS,4DOS, oder DIP OS gibt, so sind doch alle imKern fast gleich, weshalb ich hier nur dieSchreibweise DOS verwenden werde.

Damit das DOS die Daten des Bedienersspeichern und verwalten kann, hat es eineMenge Befehle, mit denen der Bediener dasDOS befehligen soll und muß.

Es ist deshalb ein Muß, weil das DOSerstens nichts von alleine macht undzweitens keine natürliche Sprache versteht.Wer DOS benutzen will ist gezwungen dieSprache des DOS, also die DOS-Befehle, zulernen. Ansonsten kommt keineZusammenarbeit zwischen Bediener und DOSzustande. Man kann das am besten durcheinen natürlichen Vergleich verstehen: Wennich als Deutscher kein Russisch beherrsche,aber trotzdem einen Russen der kein Deutschbeherrscht, um ein Taschentuch bitte, sokann mich der Russe nicht verstehen und ichwarte vergebens auf das Taschentuch.

Um diesen Verständigungsproblemen zuentgehen, haben sich die Entwicklersämtlicher DOS-Versionen auf dieWeltsprache Englisch geeinigt, die allerdingsnur zu einem kleinen Teil vom DOSverstanden wird. So kann ich zwar das DOSebenfalls bitten mir ein Taschentuch zugeben, wenn ich �Give me an handkerchief,please� über die Tastatur des Computerseingebe, aber es wird mich genausowenig wie

der Russe zuvor verstehen. Mal abgesehendavon das es meines Wissens nach keinenComputer gibt, der mit Taschentüchernausgeliefert wird oder wurde!

Auch wenn das DOS von den jeweiligenHerstellern z.T. über die Jahre hinwegweiterentwickelt und bedienerfreundlichergemacht wurde, soweit ist es heute nochnicht, das es die komplette englische Spracheverstehen würde. Das es überhauptweiterentwickelt wurde, kann man an meh-reren Ziffern sehen, die meistens dem WortDOS folgen.

Einige Beispiele sind: MS-DOS 6.22, PC-DOS 6.3, MSX-DOS 2.31 und DIP OperatingSystem 2.11. Doch zurück zu den Befehlen,mit denen man das DOS also zur Arbeitantreibt: Bei den ersten DOS-Versionenwaren nur solche Befehle erlaubt, die dasDOS intern gespeichert hatte. Aus diesemGrunde nennt man solche Befehle auchinterne Befehle. Durch die Weiterentwicklung,die z.T. noch anhält, kamen noch externeBefehle dazu, die als Zusatzprogramme zumDOS ausgeliefert wurden.

Interne Befehle kann man dem DOS immererteilen, aber externe Befehle nur dann,wenn das dazugehörige Programm auch aufdem Computer zur Verfügung steht.

Wir wollen uns hier nur mit den internenBefehlen weiterbeschäftigen, da diesezahlenmäßig unterlegen und bei fast allenDOS-Versionen vorhanden sind. Außerdemreichen diese bereits für die ordentlicheVerwaltung der Daten des Bedieners aus.Damit alle stolzen DOS-Besitzer diesen Kursweiterverfolgen können, setze ich die rechtalte DOS-Version 2.11 mit ihrem Befehlssatzvoraus. Zwar schauen nun alle MSX-DOS 1Anwender in die berühmte Röhre, aber dieseVersion ist schlicht und einfach eineKatastrophe, weil sie nur über dreizehninterne Befehle verfügt und keine geordneteDatenablage ermöglicht.

Es wird zwar nie die perfekte Datenablagegeben, dies liegt auch mit am Bediener, aberab den DOS-Versionen 2.11 wird sie durchordentliche Planung zumindest möglich.

Hier also endlich die internen Befehle desDOS 2.11 in alphabetischer Reihenfolge:

BREAK, CHDIR, CHKDSK, CLS, COPY, DATE,DEL, DIR, DO, ECHO, ERRORLEVEL, EXIST,FOR, GOTO, IF, IN, MKDIR, NOT, PAUSE,

Page 6: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

6

PATH, PROMPT, RMDIR, REM, REN, SET,TIME, TYPE, VER und VERIFY

Was diese Befehle bedeuten und bewirken,erkläre ich in einem späteren Teil des Kursus,da ich vorher noch auf das Thema Dateienund Dateienverwaltung eingehen muß unddamit setzen wir in der nächsten Ausgabefort.

Know How: BatchingLaufe ich auf dem PoFo oder demPC?Diese Frage müssen sich Batchdateien stellenund selbst beantworten können, wenn sie aufbeiden Computern laufen sollen. Denn es gibtleider ein paar Unterschiede in derBatchsyntax zwischen PoFo und PC!

So kann jede einzelne, der folgendenBatchzeilen, dem PC unter bestimmtenUmständen Probleme bereiten:

IF %1==L ECHO Der Buchstabe L!CD..>NULMD C:\DOS>NULFOR %%A in (C:\DOS\*.*) DO TYPE C:\DOS\%%ATYPE C:\CONFIG.SYS /PAPP /EOFF

Sie führen zu Fehlermeldungen und bringendamit Daten in Gefahr, da die Batchdatei, dienur eine dieser Zeilen beinhaltet, mit einemfalschen Resultat endet. Zumindest tritt dassehr oft beim Einsatz auf dem PC ein. Für denPoFo sind diese Batchzeilen dagegenvollkommen korrekt und werden auch, beimEinsatz in Batchdateien, wohlgemerkt,ordentlich ausgeführt.

Um aber diese Batchzeilen auf dem PCeinsetzen zu können, müssen diese sogeschrieben werden:

IF %1.==L. ECHO Der Buchstabe L!IF EXIST ..\NUL CD ..IF NOT EXIST C:\DOS\NUL MD C:\DOSFOR %%A IN (C:\DOS\*.*) DO TYPE %%ATYPE C:\CONFIG.SYS | MOREEDIT - Anm.: MS-DOS als DOS vorausgesetztOFF - Anm.: Dazu gibt es keinen vergleichbaren Befehl

beim PC

In dieser Schreibweise sind aber leider nichtalle Zeilen auch für den PoFo gültig undwürden bei ihm zu Fehlermeldungen führen.

Eine gemeinsame Schreibweise, die aufbeiden Geräten gültig und unproblematischist, gibt es immerhin für die ersten dreiBatchzeilen:

IF %1.==L. ECHO Der Buchstabe L!IF EXIST ..\NUL.* CD ..IF NOT EXIST C:\DOS\NUL.* MD C:\DOS

Doch bei den restlichen vier Zeilen fand ichkeinen gemeinsamen Nenner und mußtedaher prüfen, vor dem Einsatz dieser Zeilen,ob die Syntax vom PoFo oder vom PCanzuwenden ist.

Angeregt durch DR-DOS und NovellDOShalf ich mir deshalb mit den Variablen OS(Operating System) und VER (Version)weiter, die ich dann auf dem jeweiligenComputer von Hand setzte. So nahm ich Teileder Bildschirmmeldung auf, die sich aus derAnwendung des Befehles VER ergeben, umzwischen PC und PoFo unterscheiden zukönnen.

Beim PoFo: SET OS=DIP-OS SET VER=2.11

Beim PC: SET OS=MS-DOS SET VER=6.22

Außerdem fügte ich dann die jeweils zweigültigen Zeilen noch in die entsprechendeAUTOEXEC.BAT meines PCs und des PoFosein.

Nun kann ich in meinen Batchdateien dieVariable OS abfragen und die, für dasjeweilige DOS gültige Batchzeile, zurAusführung kommen lassen:

IF %OS%.==DIP-OS. FOR %%A IN (C:\DOS\*.*) DOTYPE C:\DOS\%%A

IF NOT %OS%.==DIP-OS. FOR %%A IN (C:\DOS\*.*)DO TYPE %%A

IF %OS%.==DIP-OS. TYPE C:\CONFIG.SYS /PIF NOT %OS%.==DIP-OS. TYPE C:\CONFIG.SYS |

MORE

IF %OS%.==DIP-OS. APP /EIF NOT %OS%.==DIP-OS. EDIT

IF %OS%.==DIP-OS. OFFIF NOT %OS%.==DIP-OS. ECHO Bitte nun den

Computer ausschalten!

Ich teste mit diesen Zeilen nur auf denVariableninhalt DIP-OS ab, da DR-DOS undNovellDOS von Haus aus eine Variable OS

Page 7: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

7

besitzen, die mit DR-DOS, bzw. NWDOSdefiniert ist. Es reicht ja aus zu prüfen, ob dieVariable OS mit DIP-OS definiert wurde,damit die PoFo-Syntax angewendet wird!

Somit kann ich also tatsächlichBatchdateien schreiben, die sowohl auf demPC, als auch auf dem PoFo lauffähig sind!Doch leider ist damit das Problem noch nichtganz gelöst:

Keine Batchdatei kann sich mit absoluterSicherheit darauf verlassen, das die VariableOS vom Bediener angelegt wurde. Fehlt dieseVariable, oder ist sie nicht mit DIP-OSdefiniert, so wird immer die vom PC gültigeSyntax verwendet und das ohne Rücksichtauf Verluste und Fehlermeldungen!

Wie eingangs erwähnt, muß sich jedeBatchdatei fragen, ob das zugrundeliegendeGerät ein PoFo oder ein PC ist. Diese Fragemuß die Batchdatei dann auch noch selbstbeantworten können, damit es keineProbleme gibt!

Deshalb habe ich verschiedene Technikenausprobiert und bin auch zu sehrumständlichen, aber funktionierendenLösungen gekommen. Weil die nun wirklichnicht akzeptabel waren, habe ich dann für einhalbes Jahr von diesem Thema Abstandgenommen.

Vor einigen Tagen dann, ich beschäftigtemich gerade intensiv mit dem Verhalten derParameter %0 und %1 auf dem PoFo, öffnetemir Kollege Zufall die Augen:

Starte ich eine Batchdatei, z.B. TEST.BAT,auf dem PoFo, indem ich ihren Namen TESTinkl. der Extension .BAT eingebe, so wird derName im Parameter %0 und die Extension imParameter %1 gespeichert:

PoFo: %0 = TEST %1 = .BAT

Starte ich auf dieselbe Weise beim PC, sowerden der Name TEST und die Extension.BAT zusammen im Parameter %0gespeichert. Ein Parameter %1 existiert dannnicht:

PC : %0 = TEST.BAT %1 =

Wer genau hinschaut, wird also deutlicheUnterschiede zwischen den Parametern beimPoFo und beim PC feststellen!

Demnach muß es immerhin möglich sein zuprüfen, ob die Batchdatei unter DIP-OSgestartet wurde oder nicht, wenn ich die

Batchdatei sich selbst neustarten lasse undden Parameter %1 überprüfe!

Und tatsächlich kann ich das mit derBatchdatei DIPOS.BAT beweisen:

01: @echo off02: rem Ist die Batchdatei unter DIP-OS gestartet worden

oder nicht?03: rem04: rem Selbstaufruf, wegen Trennprüfung beim DIP-OS:05: rem06: if not %0==dIpOs.BaT if not %1.==.BaT. dIpOs.BaT07: rem08: rem Ergibt folgende Parameter:09: rem10: rem bei DIP-OS: %0 = dIpOs %1 = .BaT11: rem bei MS-DOS: %0 = dIpOs.BaT %1 =12: rem13: if %1.==.BaT. echo Ich laufe unter DIP-OS!14: if %1.==.BaT. set OS=DIP-OS15: if %1.==. echo Ich laufe NICHT unter DIP-OS!!!16: if %1%os%.==. set OS=MS-DOS

Die Zeilennummern nebst Doppelpunkt sindnicht abzutippen! Die wechselndeSchreibweise ist zwar lästig, aber absolutnotwendig!!!!

DIPOS.BAT sollte durch die Eingabe von"DIPOS" oder "dipos" gestartet werden!

Weil bei diesem Start noch die Extension.BaT fehlt, was ja vollauf beabsichtigt ist,fallen die Prüfungen in Zeile 06: negativ ausund sorgen für den Neustart inklusive derExtension: dIpOs.BaT

Dieser Neustart führt zu unterschiedlichenReaktionen bei PC und PoFo, weshalb wirdiese einmal getrennt betrachten:

Beim PC wird ja der Parameter %0, hier:dIpOs.BaT, unbehelligt gelassen, weshalb dieerste IF NOT-Abfrage in Zeile 06: greift undsomit kein weiterer Neustart mehr notwendigist.

Weil kein Parameter %1 existiert der .BaTlauten könnte, kommt die Zeile 15: zur vollenGeltung und gibt kund, das DIPOS.BAT nichtunter DIP-OS (PoFo) gestartet wurde!

Die Zeile 16: hält dann dieses Ergebnisnach Möglichkeit in der Variable OS (fürOperating System) fest, sofern bislang keineVariable OS existiert. Damit könnennachfolgende Batchdateien das OS prüfen,ohne erst einen Neustart veranlassen zumüssen. Existierte aber bereits eine VariableOS, bei DR-DOS und NovellDOS sollte das jader Fall sein, so bleibt die bisherige Definitionvon OS erhalten.

Page 8: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

8

Beim Neustart auf dem PoFo findet dagegendie Aufteilung von dIpOs.BaT in dIpOs und.BaT statt. Somit lautet der Parameter %0dIpOs und der Parameter %1 .BaT. DieseAufteilung und Umwandlung findet übrigensnoch vor der Ausführung der Zeile 01: statt!

Nun greift die zweite IF NOT-Abfrage derZeile 06: und verhindert einen weiterenNeustart. Da jetzt der Parameter %1 existiertund zudem noch .BaT lautet, sind dieBedingungen der Zeile 13: erfüllt und es wirdgemeldet, das DIPOS.BAT unter DIP-OS(PoFo) gestartet wurde.

Hier hält dann die Zeile 14: das Ergebnis fürnachfolgende Batchdateien in der VariablenOS fest. Voila!

Nun kann man entweder DIPOS.BAT vorden eigentlichen Batchdateien starten, damitdie Variable OS auch existiert, oder man setztseine Routine in dasfolgende Grundgerüst ein:

01: @echo off02: for %%a in (%bdv%. %bdy%.) do if %%a==. goto err03: if not %0==%BDV%%BDY%bAtCh.BaT if not

%1.==.BaT. %BDV%%BDY%bAtCh.BaT %1 %2 %3%4 %5 %6 %7 %8 %9

04: if %1.==.BaT. set OS=DIP-OS05: if %1%os%.==. set OS=MS-DOS06: if %1.==.BaT. shift07: rem08: rem Hier muß dann die eigentliche Routine

eingebunden werden!09: rem97: :err98: for %%a in (%bdv%. %bdy%.) do if %%a==. echo

Eine der Variablen BDV und BDY existiert nicht!99: :off

In der Zeile 03: muß dann anstelle vonbAtCh.BaT und bAtCh.BaT der endgültigeName der Batchdatei eingetragen werden.Bitte achtet dabei auf die wechselndeSchreibweise, da sie sehr, sehr wichtig ist!!!

Neu sind dabei die Variablen BDV und BDY:Hinter diesen Variablen, die in vielen meiner

Batchdateien vorkommen, verbergen sich dasBatchDriVe (das Laufwerk AUF DEM sichmeine Batchdateien befinden) und dasBatchDirectorY (das Verzeichnis IN DEMmeine Batchdateien stehen).So habe ich BDV durch die AUTOEXEC.BATmit SET BDV=C: und BDY mit SETBDY=\BATCH\ definiert. Damit das DOSmeine Batchdateien auch jederzeitwiederfindet, habe ich dann noch das

Verzeichnis C:\BATCH mit in die PATH-Anweisung aufgenommen:PATH=C:\DOS;C:\BATCH

Das ganze hat folgende Vorteile:Will ich meine Batchdateien veröffentlichen,

in ein anderes Laufwerk und Verzeichnisverlagern oder auf einen anderen PCübertragen, so muß weder ich noch einanderer User, die Laufwerks- undVerzeichnisangaben in den ganzenBatchdateien ändern, damit sie unter denneuen Bedingungen auch funktionieren. Esmuß lediglich dafür Sorge getragen werden,daß die Variablen BDV, BDY und PATHangepaßt oder bereitgestellt werden:

Dadurch haben alle User deutlich wenigerTipparbeit und sind sehr flexibel!

Wer dieses Grundgerüst in Zukunft fürseine Batchdateien verwendet, kann nun aufzweierlei Wegen abprüfen, ob die Batchdateiauf dem PoFo läuft oder nicht:

Entweder man prüft die Variable OS alsoauch weiterhin auf den Inhalt DIP-OS ab,oder man prüft den Parameter %0, der dannbeim PoFo .BaT heißen muß, wenn dieeigentliche Routine zum Zuge kommt. Weildie Variable OS nicht in allen Fällen existiert,oder angelegt werden kann, ist die Prüfungdes Parameters %0 auf .BaT besonders zuempfehlen!!!

Warum die Variable OS überhaupt von derFirma Digital Research eingeführt wurde undich mir diese zu Nutze mache:

So manches Programm will nur partoutunter MS-DOS oder PC-DOS funktionierenund fragt daher die Betriebssystemversionab. Lautet diese z.B. nicht "MS-DOS 4.0", sostellt das Programm seine Arbeit unverzüglichein. Den Entwicklern von DR-DOS, welchesspäter zu NovellDOS wurde, war diesnatürlich ein Dorn im Auge, weshalb sie denKäufern eine einfacheManipulationsmöglichkeit dieserBetriebssystemversion boten:

Mittels SET-Befehl kann man dort dieVariablen OS und VER (für Version) auf diegewünschten Werte einstellen, damit dasgewünschte Programm überlistet wird undläuft.

Weil das Rad nicht zweimal erfundenwerden muß, englischsprachige Variablen beider internationalen Verbreitung meinesWissens hilfreich sind und ich eine straffe

Page 9: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

9

Organisation bevorzuge, verwende also auchich die Variable OS!

Die Variable VER spielt zwar derzeit nochkeine Rolle, aber ich werde sie dann nutzen,wenn ich auf dem PC die externenProgramme des jeweiligen DOS verwendenmöchte. Auch für den PoFo ist diese VariableVER noch unbedeutend und muß nichtzwingend angelegt werden. Aber wer weiß???

Laufwerk vorhanden, Disketteeingelegt?Diese Frage kann per Batchdatei beantwortetwerden! Doch zuerst muß einiges Wissenbekannt sein, damit man die Funktionsweisevon �LW&DISK.BAT� verstehen kann:Ist das Laufwerk A: vorhanden und mit einerformatierten Diskette bestückt, so erhält manmit -DIR A:\- etwa folgende Informationen:

Datenträger in a: hat keine BezeichnungInhaltsverzeichnis von a:config.sys 1.01.80 0:00...Befindet sich aber keine Diskette im realexistierenden Laufwerk A:, so sollte mannach -DIR A:\- folgende Meldung erhalten:Nicht bereit, Fehler beim lesen a:Abbrechen, Wiederholen, Ignorieren?

Diese Meldung muß dann noch entsprechendmit <A>, <W>, oder <I> beantwortetwerden. Versucht man ein nicht vorhandenesLaufwerk anzusprechen, z.B. mit -DIR Q:\-,so meldet sich DOS mit:Ungültiges Laufwerkzu Wort. Je nach DOS-Version können dieseMeldungen aber deutlich abweichend sein!Damit �LW&DISK.BAT� auch unter jedemDOS tadellos funktioniert, muß man dieseFehlermeldungen künstlich erzeugen und�LW&DISK.BAT� entsprechend abändern.

Denn die Routine erstellt selbständig dienotwendigen Antwortdateien, die sich meistauf das erste Wort der Meldung beziehen. Sowird das Directory in �1.BAT� geschrieben,wenn Laufwerk und formatierte Diskettevorhanden sind.

Anschließend wird �1.BAT� aufgerufen undruft seinerseits �DATENTR.BAT� auf, da DOSdas Wort �Datenträger� als auszuführendeDatei definieren kann. Gibt es das gesuchte

Laufwerk nicht, so wird die Meldung�Ungültiges Laufwerk� in �1.BAT�geschrieben. Beim folgenden Aufruf von�1.BAT� kürzt DOS das Wort �Ungültiges� auf�UNG� zusammen und ruft die vorhandeneBatchdatei �UNG.BAT� auf. Weil die Feh-lermeldung �Nicht bereit...� trotz Umleitungnicht in �1.BAT� abgelegt wird, hänge ich per-ECHO-Befehl das Wort �NO� an �1.BAT�,damit

�1.BAT� später �NO.BAT� starten kann undmir gemeldet wird, daß das Laufwerk zwarexistiert, aber keine, oder eine unformatierteDiskette enthält.

Genug des Geplänkels, hier ist also�LW&DISK.BAT�:

@echo offrem falls mal etwas schiefläuft!if %1.==. if exist c:\temp\a.dat goto offrem Laufwerksangabe vergessen?if %1.==. goto errrem Temporäres Verzeichnis anlegenmd c:\temp> nulrem Pfad retten und ergänzenset opath=%path%set path=%path%;c:\temprem Hilfs- & Antwortdateien erzeugenecho a> c:\temp\a.datecho @echo off> c:\temp\datentr.batecho echo LW %1 und Diskette vorhanden!>>

c:\temp\datentr.batecho lw&disk>> c:\temp\datentr.batecho @echo off> c:\temp\no.batecho echo Keine o. unformatierte Diskette im LW %1!>>

c:\temp\no.batecho lw&disk>> c:\temp\no.batecho @echo off> c:\temp\ung.batecho echo Laufwerk %1 existiert nicht!>> c:\temp\ung.batecho lw&disk>> c:\temp\ung.batecho @echo off> c:\temp\1.batrem Beginn der eigentlichen Prüfungdir %1\ <c:\temp\a.dat>> c:\temp\1.batrem Fehler �Nicht bereit...� wegblendenclsrem falls Nicht bereit dann für Startrem von NO.BAT vorbereitenecho no>> c:\temp\1.batrem 1.BAT starten, 2.Teil d. Prüfung1rem wenn Prüfung beendet oder etwasrem nicht klappte, dann temporäreresrem Verzeichnis löschen und Ur-Pfadrem rekonstruieren:offfor %%a in (c:\temp\*.*) do del c:\temp\%%ard c:\temp> nulif not %opath%.==. set path=%opath%set opath=

Page 10: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

10

goto ausrem falsche Syntax!:errecho - Aufruf mit z.B. LW&DISK A:! -echo - DOPPELPUNKT ja nicht vergessen! -:aus

Trotz der diesmal vorhandenenDokumentation muß ich noch etwas näherauf �A.DAT� eingehen:

Diese Datei wird für den Fall bereitgestellt,wenn keine, oder eine unformatierteDiskette, im zu prüfenden Laufwerk ist. Denndie oben bereits erwähnte Fehlermeldung�Nicht bereit...� muß ja noch beantwortetwerden. Mittels der Einleitung -<a.dat- wirddie evtl. auftretende Fehlermeldung dannauch brav vom DOS aus beantwortet.

Wer diese Batchdatei noch rekursivausführbar gestaltet und die Ergebnisse inVariablen wie LW & DISK festhält, kann damitz.B. eine automatische Datensicherung in derNacht erreichen!!!

Page 11: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

11

KnowHow: DIP-OSAusgeklammert?Das sich hinter der schließenden Klammer )ein weiteres Geheimnis des PoFo verbirgt, hatwohl noch keiner gedacht und entdeckt. Mirist das auch erst vor kurzem aufgefallen:

Erzeugt doch einfach mal die Dateien J. undJ).DAT vom DOS-Prompt aus, mit denDirekteingaben:

rem>j.rem>j).datUnd gebt nun diese Befehlszeile direkt amPrompt ein:

for %a in (*.*) do echo %aBei mir führte das zu dieserBildschirmausgabe:CONFIG.SYSTEST.BATJJDie doppelte Anzeige der Datei J. hat michdann sehr überrascht, hatte ich docherwartet, auch die Datei J).DAT zu Gesicht zubekommen. Denn im Normalfall hätte dieAnzeige so ausfallen müssen:CONFIG.SYSTEST.BATJJ).DATAber weil im Dateinamen von J).DAT eineschließende Klammer ) zu finden ist, machtdas DIP-OS aus der FOR-Schleife folgendes,wenn es auf die Datei J).DAT trifft:

FOR %A in (J).DAT) DO ECHO %A

Zwar wird man diese Zeile selbst beieingeschaltetem ECHO nie zu Gesichtbekommen, aber so muß das DIP-OS dieseZeile interpretieren, wenn die Datei J).DATgegriffen wird. Schuld daran ist dieschließende Klammer, die die sonst üblicheMenge in der FOR-Schleife verfrüht schließtund somit aus der erwarteten Menge (J).DAT)die Menge (J) macht, die dann zur Anzeigekommt.

In der Praxis werden Dateinamen mitKlammern wie (, ), { und } nur dann erzeugt,wenn es sich dabei um temporäre, also umkurzweilig existierende Dateien, handeln soll.Meist beschränkt man sich dabei auf dieKlammern { und }.

Wer also den Problemen des DIP-OS ausdem Wege gehen will, der sollte es tunlichst

vermeiden die schließende Klammer ) zuverwenden: egal ob in Dateinamen, Variablenoder Parametern. Wir erinnern uns: Variablenund Parameter sind meist Platzhalter fürDateinamen!

Kann oder möchte man aber nicht auf dieschließende Klammer verzichten, alsBestandteil in Dateinamen, so kann dasFehlverhalten des DIP-OS mit diesenBatchzeilen rechtzeitig verhindert werden:

if exist )*.* echo Klammer ) in Dateinamen verboten!if exist )*.* goto :>nulif exist ?)*.* echo Klammer ) in Dateinamen verboten!if exist ?)*.* goto :>nulif exist ??)*.* echo Klammer ) in Dateinamen verboten!if exist ??)*.* goto :>nulif exist ???)*.* echo Klammer ) in Dateinamen verboten!if exist ???)*.* goto :>nulif exist ????)*.* echo Klammer ) in Dateinamen verboten!if exist ????)*.* goto :>nulif exist ?????)*.* echo Klammer ) in Dateinamen verboten!if exist ?????)*.* goto :>nulif exist ??????)*.* echo Klammer ) in Dateinamen

verboten!if exist ??????)*.* goto :>nulif exist ???????).* echo Klammer ) in Dateinamen

verboten!if exist ???????).* goto :>nulif exist *.)* echo Klammer ) in Dateinamen verboten!if exist *.)* goto :>nulif exist *.?)* echo Klammer ) in Dateinamen verboten!if exist *.?)* goto :>nulif exist *.??) echo Klammer ) in Dateinamen verboten!if exist *.??) goto :>nul

Diese Zeilen müssen einmal unmittelbar vordie erste FOR-Schleife eingebaut werden, diein der Menge einen Parameter, eine Variableoder Wildcards enthält, sofern die Menge sichauf Dateinamen bezieht. Ein Beispiel dafür istmeine ADDCOPY.BAT, die Ihr in KH-ADDCP.TXT betrachten könnt. Ich empfehleauch diese Zeilen in jede Batchdateieinzubinden, die mittels einer FOR-SchleifeDateinamen benutzt.

Eine kürzere Schutzvariante ist mir zwarauch eingefallen, aber die erwies sich nichtals sehr sicher.

Auf der anderen Seite könnte man diesesWissen vielleicht auch dazu nutzen, um einegewisse Art der Stringverarbeitung zuerreichen. So legt man z.B. die Datei JA).DATan, um mit der obigen FOR-Schleife darausein JA zu machen.

Allerdings ist mein in CUT.BAT gezeigterTip, der ebenfalls zur Stringverkürzung führt,

Page 12: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

12

besser, weil er nicht auf 11 Zeichen(achtstelliger Dateiname + dreistelligerExtension) beschränkt ist, wie dieseMöglichkeit.

Sofern man aber beide Technikenverbindet, so kann das evtl. zu einer sehrgebrauchsfähigen Stringverarbeitungheranwachsen!

Ich habe zwar noch keine vernünftigeVerwendung für die hier beschriebeneTechnik, noch für die Kombination dieserTEST.BAT plus CUT.BAT parat, aber vielleichthat ja einer von Euch die zündendeIdee???!!!

Die Entwicklung... von Batchdateien ist nicht immer einfach,ganz besonders dann nicht, wenn sie sehrtrickreich ausfallen sollen. Durch dasberühmte Debuggen, die Fehlersuche, gehtgewöhnlich die meiste Zeit verloren. Dabeiwird von jedem Lehrbuch empfohlen, dasECHO nicht auszuschalten und an kritischenStellen PAUSE-Befehle einzubauen, damit dieFehlersuche vereinfacht wird.

Während der Testphase ist dagegen auchnichts einzuwenden, aber was das an Arbeitbedeutet, wenn man diese Zeilen nach denerfolgreichen Tests löschen kann, dasverschweigen die Lehrmeister geflissentlich!

Da meine Routinen immer komplexer zuwerden scheinen und ich nicht mehr Zeit, alsbisher, in die Fehlersuche investieren will,suchte ich eine variable Lösung, damit ich dieBatchdateien nicht nachträglich überarbeitenmuß. Nach reiflicher Überlegung kam ich aufdie Idee, anstelle der Befehle Variablen zuverwenden, weil diese ja beliebig umdefiniertwerden können!

So ersann ich die Variable O die entwedermit dem Wort ON oder OFF definiert sein soll,damit ich zu Beginn des Batchprogramms dasECHO an- oder abschalte:

@ECHO %O%

und die Variable & die mit dem Befehl PAUSEoder REM definiert sein soll, damit ich ankritischen Stellen bei Bedarf eine PAUSEeinlegen kann oder nicht:

%&%

Um beide Variablen gleichzeitig auf denjeweiligen Stand zu schalten: testen oder

nicht testen, schuf ich dann PHASE.BAT,welche die Variablen & und O mit jedemAufruf umschaltet:

@echo offif %1.==?. if not %o%.==. goto offfor %%a in (on off) do if not %o%.==%%a. set o=%%afor %%a in (pause rem) do if not %&%.==%%a. set

&=%%a:offecho Die Testphase ist %o%!

Zukünftige Batchdateien müssen also mit@ECHO %O% beginnen und die PAUSE-Zeilen, die man zu Testzwecken einbringt,müssen durch %&% gestaltet werden. Dazumal eine Testroutine, die Ihr unter demNamen TEST.BAT abspeichern könnt:

@echo %o%echo Dies ist eine unwichtige Zeile!%&%echo *Zeile ohne Wert*

Ruft nun abwechselnd PHASE.BAT undTEST.BAT auf, um die Wirkung vonPHASE.BAT zu ergründen.

Wenn also demnächst meine Batchdateienmit @ECHO %O% beginnen sollten, so solltedie Testphase möglichst OFF-geschaltet sein.

Den Zustand der Testphase könnt Ihr auchjederzeit durch den Aufruf PHASE? erfragen.Ansonsten werdet Ihr auch nach jedemAufruf über den aktuellen Stand informiert!

Der gute Ton... macht erst die wohlklingende Musik, dieman immer wieder gerne hört. Auch bei zuprogrammierenden Batchdateien gibt es einpaar Grundsätze, die man beachten sollte:• Variablen, die nicht von anderen Routinen

mitbenutzt werden, sollten am Ende derjeweiligen Batchdatei wieder gelöschtwerden.

• Hilfsdateien sollten ebenfalls nach ihrerTätigkeit entfernt werden.

• Die Hilfsdateien, die man behalten muß,dürfen nicht sofort vom Bediener gestartetwerden können. D.h. ihre Extension solltenicht BAT lauten.

• Batchdateien sollten ihre Aufrufsyntaxdann präsentieren, wenn entweder keinParameter übergeben wurde, oder dererste Parameter /? lautet.

Page 13: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

13

• Alle Batchdateien sollten in einemVerzeichnis untergebracht werden, dasauch in der Pfadangabe gesetzt wurde.

• Nach Möglichkeit sollte jede Batchdateinicht mehr als zwei Parameter beim Startbenötigen, damit der Bediener nichtellenlange Eingaben erzeugen muß.

• Die Batchdateien sollten so markanteNamen haben, das der Bediener sie schnelldeuten und lernen kann.

• Keine Batchdatei sollte zu COM- oder EXE-Programmen umgewandelt werden, dadiese Compiler entweder mit bestimmtenBefehlskombinationen nicht fertig werden,oder die Technik nicht ausführen können.

• Auch die Zusammenlegung von Routinenzu einer riesigen Batchdatei, ist nichtimmer förderlich, da dieAusführungsgeschwindigkeit darunterleidet.

• Fortgeschrittene Programmierer solltenlange Befehle in Variablen packen unddiese, statt der Befehle, in ihren Routinenverwenden.

• Routinen die Schalter und externe Befehlebenutzen, sollten die DOS-Versionermitteln können, auf der sie geradeeingesetzt werden. Gegebenenfalls müs-sen sie ihre Tätigkeit einstellen, wenn sienicht unter der laufenden DOS-Versionfunktionieren können.

• REM-Zeilen sollten dann wieder entferntwerden, wenn die Routine keine Fehlermehr aufweist.

• Sprungmarken funktionieren auch ohnedie abschließende :END Markierung,weshalb man auf sie verzichten sollte.

• Hinter dem PAUSE-Befehl und denSprungmarken sollten auch keineKommentare angefügt werden, da siewegen der -@ECHO OFF- Zeile eh nichtangezeigt werden.

• Sollen Treiber, wie ANSI.SYS, Verwendungfinden, so sollte deren Vorhandenseinvorher ermittelt werden.

• Bevor eine Variable gesetzt wird, solltemöglichst geprüft werden, ob diese nichtbereits existiert. Notfalls muß ihrursprünglicher Inhalt in einer anderenVariable, oder einer Batchdatei, gesichertwerden.

Sicherlich werden gerade die Anfänger großeSchwierigkeiten mit der Einhaltung dieser

Regeln haben, aber ich habe auch gut zweiJahre gebraucht, um diese zu etwa 90%einzuhalten. Wenn man seine Routinen nichtweitergeben oder veröffentlichen will, kannman sowieso darauf pfeifen

KILL.BAT - löschen mit ReserveDer Computerfreak, der noch nie eine Dateiversehentlich und voreilig gelöscht hat, dürftewohl nicht menschlich sein. Wir Menschenlernen ja aus Fehlern und entwickeln unsereIntelligenz gerade dadurch weiter.

Manchmal dauert dieser Lernprozeß aberlänger und muß einem gehörig die Fingerverbrennen, bis man endlich zur Einsichtgelangt. So sind auch mir schon etliche Datenverlustig gegangen, die ich dann meistmühsam rekonstruierte. Nun bin ich aber desBefehls DEL leid und habe eine Sicherungeingebaut, durch die Dateienwiederhergestellt werden können:

@echo offif %1.==. goto errmd \kill > nulcopy %1 \kill > nuldel %1goto off:errecho Zu löschende Datei fehlt!:off

Beim Aufruf von KILL.BAT, inkl. des Namensder zu löschenden Datei, wird ein VerzeichnisKILL angelegt, in die die zu löschende Dateisicherheitshalber abgelegt wird. Danach wirddie ursprüngliche Datei gelöscht. Folglichwurde die Datei nicht richtig vom Datenträgergelöscht, sondern nur ins Verzeichnis KILLtransferiert. Von dort kann sie nun jederzeitwiederhergestellt werden, indem man sie insgewünschte Verzeichnis zurückkopiert.

Sollte bereits ein Verzeichnis namens KILLbestehen, so wird man dank der Nul-Umleitung, von der Fehlermeldung verschont.Auch beim kopieren schweigt sich DOSdeshalb aus.

Wem diese Sicherheitslöschung nichtgefällt, bzw. wer ohne Reserve fahrenmöchte, ist ja nicht an die Benutzung vonKILL.BAT gebunden und kann wie bisher mitDEL arbeiten.

Page 14: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

14

Verzeichnisanlage mit folgendemVerzeichniswechselOftmals legt man ein Verzeichnis an und willgleich anschließend in das neue Verzeichnisgelangen, um dort Dateien abzulegen. Sonsthätte ja auch ein neues Verzeichnis kaumSinn, oder???

Die dafür notwendigen Eingaben: MD<Verzeichnis> und CD <Verzeichnis>, sindwohl mittlerweile jedem DOS-User in Fleischund Blut übergegangen. Aber findet Ihr dieseVorgehensweise nicht ein wenig lästig odergar unlogisch? Zumindest ich fragte mich,warum man nicht automatisch in das ebenerzeugte Verzeichnis hineinwechselt. Wiedem auch sei, wenn ich also nun ein neuesVerzeichnis erzeugen und anschließend hin-einwechseln will, benutze ich nun dieBatchdatei MDCD.BAT:

@echo offif %1.==. goto errmd %1> nulcd %1> nulgoto off:errecho Aufruf z.B. mit: MDCD TESTVERZ o. mitecho MDCD \TESTVERZ!!!:off

Gebe ich beim Aufruf einen Verzeichnisnamenals ersten Parameter an, so wird dieseszunächst mit MD %1> NUL erzeugt, bevorder Verzeichniswechsel mit CD %1> NULvonstatten geht. Solange man sich dabei aufdas aktuelle Laufwerk beschränkt, ist derWechsel sofort sichtbar. Dennoch kann mandiese Routine gerne auch auf die anderenLaufwerke anwenden. Ein Laufwerkswechselfindet aber nicht statt!

Eine Zeitschleife im DIP-OSSchon einmal habe ich darüber berichtet, wieman eine Art Zeitschleife programmierenkann:

FOR %%A IN (1 2 3) DO TYPE C:\CONFIG.SYS>NUL

Aber weil viele Wege ins ROM führen, kannman auch diese Zeile verwenden:

FOR %%A IN (1 2 3 4 5) DO HELP /?>NUL

die für MS-DOS und DIP-OS gleichermaßengeeignet ist. Ist nämlich keine CONFIG.SYS inC:\ zu finden, so wird die Wartezeit sehr kurz

sein. Beim gegenteiligen Fall kann dieWartezeit sehr lang werden, sofern dieCONFIG.SYS sehr groß ist! DieBildschirmausgabe des Befehles HELP istdagegen immer und auf jedem PoFo gleichgroß und benötigt also eine feste Zeit, bis siedargestellt wird. Nur wenn der PoFo mit einerhöheren Taktfrequenz betrieben wird, andieser Stelle mal einen Gruß an StefanKächele 8-), ist die Wartezeit doch etwaskürzer, als auf den normal getakteten PoFos.

Datei verschiebenMit der folgenden Routine kann man eineDatei in ein anderes Laufwerk oderVerzeichnis verschieben. Die gewünschteDatei wird dabei nicht einfach kopiert,sondern auch gleich im Ursprungsverzeichnisgelöscht.Hier kommt MOVEDAT.BAT:

@echo offif %2.==. goto errcopy %1 %2 > nuldel %1goto off:errecho Ziellangabe fehlt!:off

Aufgerufen wird sie z.B. mit �MOVEDATC:\SYSTEM\PERMDATA.DAT C:\�. Wirverschieben in diesem Fall die DateiPERMDATA.DAT ins Hauptverzeichnis desLaufwerkes �C:�.Und so geht�s: Die IF-Zeile prüft zunächst obein Zielpfad oder �Laufwerk angegebenwurde. Gegebenenfalls wird eine Meldungausgegeben und abgebrochen. Ist ein Zielvorgegeben, so wird die im Parameter 1übergebene Datei ans, im Parameter 2festgehaltene, Ziel kopiert. Anschließend wirddie Datei mit DEL %1 im Ursprungs-verzeichnis gelöscht. Fertig ist die Datei-wäscherei!

Der Agentenaustausch... ist seit jeher ein geheimnisvolles undgefährliches Geschäft, da das kleinsteFehlverhalten in einem Blutbad enden kann!Zum Glück stehen beim REN-Befehl unterDOS und DIP-OS keine Geheimmächte beiFuß, so daß kein Blutbad zu befürchten ist,oder etwa doch?

Page 15: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

15

Man kann daran zweifeln, wenn man dieNamen zweier existierender Dateienaustauschen will. Ein schlechter Krimi? Ihrwerdet DOS und DIP-OS mit anderen Augensehen, wenn Ihr meine Vorschläge nach-vollzogen habt!

Im Grunde genommen ist es nur eine kleineund einfache Aufgabe für das DOS (und DIP-OS), wenn zwei Dateinamen gegeneinanderausgetauscht werden sollen. Derunverfrorene Tastaturexperte würde dieseAufgabe mit drei Eingaben erledigen, um dieDateinamen T.DAT und L.LAL, zuvertauschen:

REN T.DAT %REN L.LAL T.DATREN % L.LAL

Und schon heißt T.DAT L.LAL und L.LALT.DAT. Wobei vorausgesetzt ist, das die Datei% nicht existiert!

Hat man dieses Spielchen öfter vor, soschreibt sich der engagierte Batcher eineBatchdatei namens TAUSCH.BAT, SWAP.BAToder EXCHANGE.BAT:

@echo offren %1 %ren %2 %1ren % %2

Diese wird nun mit den Dateinamen T.DATund L.LAL, als Parameter %1 und %2,aufgerufen, damit der Namenstausch sauberüber die Bühne geht. Sauber??? Weit gefehlt,wie ich es mehr oder weniger leidvollerfahren mußte!

Denn rufe ich obige Batchdatei auf, die ichals TAUSCH.BAT gespeichert habe, sobekomme ich recht unterschiedlicheReaktionen, die sich auf Grund der Anzahlund der Art der übergebenen Parameterergeben. Wenn ich mich 1. nicht vertippthabe, 2. nicht eine nicht existierende Dateiangebe, 3. wirklich zwei existierendeDateinamen verwende und 4. keineunerlaubten Zeichen in den Dateinamenverwende, so komme ich mit großerWahrscheinlichkeit zum gewünschtenErgebnis!

Anderenfalls und das ist gar nicht sounwahrscheinlich, erhalte ich die wildestenFehlermeldungen und Dateinamen, wenn ichdie obige TAUSCH.BAT mit folgendenEingaben starte:

TAUSCH T.DAT *.LTAUSCH T.?AT ?.*TAUSCH L.LLL T.DATTAUSCH L.LALTAUSCHTAUSCH.BAT L.LAL J.LOPTAUSCH.BAT *.* J.L??TAUSCH :.DAT *.TXTTAUSCH C:.DAT L.L

Selbst wenn einige der eben gezeigtenDateien wirklich existieren sollten, so sollteTAUSCH.BAT bei den meisten Startvariantennicht zum gewünschten Erfolg führen!Probiert es doch einfach mal aus, aberwundert Euch nicht, wenn Euch blaue Bohnenum die Ohren fliegen sollten :)

Deswegen habe ich mir eine schußsichereWeste zu stricken versucht, bin aber auchnicht gegen jede Kugel der allgegenwärtigenFehlermacht DOS gefeiht!

Immerhin ist meine Weste SWAPNAME.BATsicherer als so manche andere Strickjacke,die nach gleichem Muster unter den NamenSWAP.BAT, TAUSCH.BAT oder FILECHG.BATangeboten wird. Aber gegen Startvariantenwie:

SWAPNAME C:.DAT L.DATSWAPNAME L;L.TXT JUHU.DOKSWAPNAME T.DAT %%%%%%%%

ist auch meine Version machtlos:@echo offif %1%2.==. goto errif %2.==. goto errif not exist %1 goto errfor %%a in (%1%2%3) do if not %%a==%1%2%3 goto errif not exist %2 %0 %1 %1 %2if not %3.==. shiftren %1 %%%%%%%%>nulren %2 %1>nulren %%%%%%%% %2>nul:errif %1%2.==. echo Die beiden Dateinamen fehlten!if not %1%2.==. if %2.==. echo Der zweite Dateiname

fehlte!if not %1%2.==. if exist %0%1 %0 %2 %3if not %1%2.==. if not exist %1 if not %3.==. %0 %2 %3if not %1%2.==. if not %0==%1 if not exist %1 if exist %2

echo Die Datei %1 existiert nicht!if not %1%2.==. if not exist %1 if not exist 2 echo Die

Dateien %1 & %2 gibt es nicht!if not %1%2.==. for %%a in (%1%2%3) do if not

%%a==%1%2 echo Keine Wildcards * ? erlaubt!

Tja, wer auch immer den Spruch geprägt hat:�Nobody is perfect!�, hat damit eine wirklichperfekte Feststellung getroffen!

Page 16: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

16

Fehlerhafte Eingaben minimierenMal Hand aufs Herz: Wer hat sich von Euchnicht auch schon einmal vertippt??? Also mirpassiert das immer wieder, ganz besondersdann, wenn ich es eilig habe. Meistensreagiert das DOS oder das DIP-OS mit derFehlermeldung �Befehl oder Programm nichtgefunden� anstatt mit dem gewünschtenResultat. Bei den folgenden Eingabenvertippe ich mich z.B. desöfteren:

CD systemDIR /pDIR *.*DEL datei.extCOPY *.* a:TYPE datei.ext /p

Und das sieht dann so aus:

D systemIR /pDR *.*DL datei.extCOP *.* a:TYP datei.ext

Natürlich sind dem DOS keine Befehle wie D,IR, DR, DL, COP und TYP bekannt, weshalbes mich zu recht mit der o.g. Fehlermeldungverärgert. Weil ich aber nicht auf die Ruheund Gelassenheit warten will, die das fort-schreitende Alter so mit sich bringen soll,behelfe ich mir anders!

Ihr ahnt sicherlich schon, das ich wiedereinmal auf Batchdateien zu sprechen komme,weil ich ja meist in der Batchsprache spreche8-)! Langer Rede kurzer Sinn, hier kommensie auch schon:

D.BAT:@CD %1

IR.BAT:@DIR /p

DR.BAT:@DIR %1

DL.BAT:@DEL %1

COP.BAT:@COPY %1 %2

TYP.BAT:@TYPE %1 %2

Das Geheimnis im Namen der Batchdateienzu finden ist, mit denen ich also mehr

Fehlertoleranz erreiche, sollte Euch jetztaufgegangen sein.

Allerdings kommt die obige D.BAT inschwere Konflikte mit einer D.BAT, die ichbenutze, um einfach auf das Laufwerk D: zuwechseln:

D.BAT:@D:

So habe ich ein wenig weiter gedacht undletztlich diese D.BAT geschaffen:

@if %1.==. if exist d:\nul.* d:@if %1.==. if not exist d:\nul.* dir /p@if not %1.==. if not exist %1\nul.* md %1@if not %1.==. if exist %1\nul.* cd %1

Mit Ihr kann man auf das Laufwerk D:wechseln, sofern es vorhanden ist, oder dasDirectory des aktuellen Verzeichnissesansehen, wenn es kein Laufwerk D: gibt.

Ansonsten kann man auch mit Ihr ein neuesVerzeichnis erstellen, in das nach derErstellung automatisch hineingewechselt wirdoder einfach nur in ein bestehendesVerzeichnis wechseln.

Für diese nicht unbeachtliche Anzahl vonMöglichkeiten sind folgende Startvariantenerlaubt:DIst ein Laufwerk namens D: vorhanden, sowird es das aktuelle Laufwerk. Gibt es D:nicht, so wird das aktuelle Inhaltsverzeichnisseitenweise dargestellt.

D systemExistiert ein Verzeichnis namens SYSTEM, sofindet ein Wechsel in dieses statt. Ist dasVerzeichnis SYSTEM nicht vorhanden, so wirdes zunächst erzeugt und anschließendhineingewechselt.

Damit ist D.BAT nun ein passabler Ersatzfür die Befehle D:, DIR /P, MD und CD. Gernehätte ich auch noch den Befehl RDberücksichtigt, habe aber noch keine Idee,wie ich mit Sicherheit feststellen kann, dasder Anwender auch wirklich das Verzeichnislöschen will, wenn er D.BAT aufruft.

Page 17: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

17

KnowHow: DIP-OSLabel löschenDas Label, das man jedem Datenträger unterDOS aufdrücken kann, soll eigentlich nurnach Rückfrage gelöscht werden. Zumindestmöchte das DOS es so. Um es zu löschen,gibt man den Befehl LABEL ein und bekommtetwa diese Reaktion vom DOS:

Datenträger in c ist ramdiskBezeichnung?

Aktuelle Bezeichnung löschen (J/N)? j

Wenn also ein Label vorhanden ist, hier:ramdisk und man auf die Frage nach derBezeichnung mit der Return-/Enter-Tastereagiert, so muß man beantworten, ob dieBezeichnung (das Label) gelöscht werdensoll.

Weil das gerade in Batchdateien nichtunproblematisch ist, man müßte eine Dateibereitstellen, die die entsprechendenTastendrücke enthält, wird der Befehl Labelnur ungern in Batchdateien verwendet.

Vor geraumer Zeit habe ich schon einmaleine Batchdatei namens UNLABEL.BATvorgestellt, die das löschen des Labelsvollautomatisch vornahm. Doch wie ich vorkurzem feststellte, gibt es eine wesentlichkürzere und elegantere Lösung, um das Labelzu löschen:

LABEL CLOCK$

ist alles was Ihr dazu benötigt!CLOCK$ ist ein nicht dokumentiertes Gerät,

welches auch unter MS-DOS vorhanden ist.Ob dort LABEL CLOCK$ denselben Effekt hat,wie hier auf dem PoFo unter DIP-OS, habeich aber noch nicht ausprobiert!

KnowHow: DIP-OSDie geheimen Optionen /F und /VVon MS-DOS kenne ich die Option /V oder /vfür den CHKDSK-Befehl. Wird siemitangegeben, so werden alle Namen derüberprüften Verzeichnisse und Dateienangezeigt. Leider bekomme ich auf dem PoFokeine Verzeichnisse und Dateien angezeigt,wenn ich CHKDSK /V eingebe, sondern�Falscher Parameter�.

Auch die Option /f oder /F, über die ichschon einmal berichtete, ist erlaubt und sollFehler im Dateisystem beheben. Sie wird

sogar klaglos vom PoFo hingenommen,obwohl ich noch keine Auswirkung gespürthabe. Bei MS-DOS kann es dazu kommen,das die angezeigten Dateien um eine reiheBytes gekürzt werden, wenn sie schadhaftsind!

Aber es reicht nicht aus, eine der beidenOptionen mit CHKDSK zu verwenden, umeine interessante und nutzbare Fehlfunktiondes PoFos zu erzeugen!

Wenn wir uns zunächst auf die Option /Feinigen und das Ergebnis von CHKDSK /F ineine Datei namens ABC.DAT umleiten, mit:

CHKDSK /F>ABC.DATso wird die unmittelbar darauffolgende Zeile,die eine Bildschirmausgabe verursachen soll,diese Bildschirmausgabe nach ABC.DATumleiten und nicht auf den Bildschirmbringen!!!

Ihr könnt das mit der TSTCHK.BATausprobieren:@echo offchkdsk /F>abc.dathelpWenn ihr das ausprobiert habt undanschließend Euch den Inhalt von ABC.DATanseht, mittels TYPE-Befehl oder derTextverarbeitung, bekommt Ihr das Ergebnisdes HELP-Befehles zu sehen.

Hänge ich aber noch die Zeile:

TYPE ABC.DAT

an die obige TSTCHK.BAT an, so ist dieUmleitung wieder hinfällig! D.h., es landetnur noch das Ergebnis von CHKDSK inABC.DAT.

Mit der Option /V ist man da ein wenigbesser beraten, da es dann nichts mehrausmacht, ob eine weitere Bildschirmausgabeerfolgt oder nicht! Dafür muß man aber mitder Fehlermeldung �Falscher Parameter�leben, da es mir bislang nicht gelungen ist,diese mittels NUL-Gerät wegzublenden ohnedie Umleitung zu annullieren.

Für den Test der Option /V empfehle ichdiese TSTCHK.BAT:@echo offclschkdsk /v>abc.dathelppauseclsif exist abc.dat type abc.datif exist abc.dat del abc.dat

Page 18: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

18

Auf den ersten Blick mögen diesegeheimnisvollen Umleitungen, die CHKDSK /Foder CHKDSK /V ermöglichen, nichtsbesonderes sein, schließlich könnte man dasErgebnis von HELP auch mit:

HELP>ABC.DATnach ABC.DAT umleiten, aber es gibt auch fürdiese Art der Umleitung einige sinnvolleAnwendungen:

if %1.==. chkdsk /v>abc.datdir %1wenn man wirklich nur das Verzeichnisanzeigen lassen will, das als %1 übergebenwurde. Sollte nämlich %1 leer sein, so würdeDIR %1 zur Anzeige des gerade aktuellenVerzeichnisses führen!oder wie ist es mit:

if not %1.==A. chkdsk /vwäre z.B. ein guter Ersatz für

if not %1.==A. echo Falscher Parameter

Wie bereits erwähnt, muß hinter der Zeile mitCHKDSK /F>ABC.DAT oder CHKDSK/V>ABC.DAT, eine Zeile stehen, die eineBildschirmausgabe zur Folge hat, damit dieseBildschirmausgabe in ABC.DAT landet!

Und das kann eine Zeile sein, die einen derfolgenden Befehle enthält:ECHO, HELP, DIR, CD, CHKDSK, FORMAT,TYPE, COPY, PATH, FDISK, LABEL, VOL,DATE, TIME, PAUSE oder VER!

Dasselbe Spielchen geht auch mit denBefehlenAPP, BREAK, CD, CLS, COPY, DIR, FDISK,FORMAT, LABEL, OFF, PAUSE, SHIFT, TYPE,VER, VOL und VERIFY, aber dort haben dieOptionen /F und /V ein- und dieselbe Wirkungwie CHKDSK /V>ABC.DAT!

DOS Fehlermeldungen... kann man sich zu nutze machen und somiteinige Bytes sparen, wenn man Batchdateienprogrammiert!Ich bin zwar mehr ein Fan von deutlichererFormulierung, als das DOS bietet, aber esmuß ja nicht jeder nach meiner Pfeife tanzen8-)

Wenn die laufende Batchdatei das WortUSER als Parameter %1 erwartet und es

nicht bekommt, so könnte man denAnwender mit dieser Zeile:

IF NOT %1.==USER. ECHO Falscher Parameterinformieren.

Etwas kürzer ist dagegen:

IF NOT %1.==USER. VER //und gibt auch die Meldung �FalscherParameter� aus.

Wenn eine gesuchte Datei nicht aufzufindenist, so kann man dem Anwender mit derZeile:

IF NOT EXIST LOLO.DAT ECHO Datei nicht gefundenBescheid geben. Allerdings ist die Variante:

IF NOT EXIST LOLO.DAT RUN //kürzer und erfüllt den gleichen Zweck.

Auch wenn ein Schreibfehler des Anwenderszu vermuten ist, sollte man darauf hinweisen:

IF NOT %1.==DIR. IF %1.==IR. ECHO Syntaxfehler

Oder benutzt die Kurzvariante:IF NOT %1.==DIR. IF %1.==IR. FOR

Wenn eine Batchdatei unbedingt dreiParameter benötigt, damit sie funktioniert, soist dieser Check angebracht:

IF %1%2%3.==. echo Falsche Parameteranzahl

Die gleichsam wirkende Kurzvariante lautet:IF %1%2%3.==. TYPE

Soll der Anwender darüber informiert werden,das die gewünschte Datei existiert, so kannman das mit:

IF EXIST ABC.DAT ECHO Zieldatei existierterreichen. Aber auch mit:

IF EXIST ABC.DAT REN NUL List das möglich!

Exklusives Datei löschenIst es Euch nicht auch schon so ergangen,das alle Dateien gelöscht werden sollen, mitAusnahme einer einzigen?

Im Regelfall erfordert das viel Handarbeit,weil man fast alle anderen Dateien einzelnd,mit dem DEL-Befehl, vernichten muß! Umdas gesagte etwas plastischer werden zu

Page 19: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

19

lassen, präsentiere ich nun ein beispielhaftesVerzeichnis:

Datenträger in c hat keine Bezeichnung.Inhaltsverzeichnis von c:\TEST

. <DIR> 4.01.8022.53.. <DIR> 4.01.8022.53@!@-@!@ fdi 0 1.01.80 0.14permdata dat 730 4.01.80 23.41undelete dat 1999 4.01.80 23.40clipbord dat 27 4.01.80 23.26t txt 3 4.01.80 23.41install txt 2058 1.01.80 1.03���� � 0 1.01.80 23.26install bat 102 1.01.80 22.41 10 Dateien 512 Bytes frei

Wenn ich, abgesehen von der Datei @!@-@[email protected], alle anderen Dateien löschenmöchte, so müßte ich nacheinander dieseBefehle im DOS eingeben:

DEL *.??TDEL *.�Ein weniger erfahrener DOS-User würde abereher diese Befehle verwenden:DEL *.DATDEL *.TXTDEL *.BATDEL *.�um alle Dateien, mit Ausnahme der @!@-@[email protected], zu löschen. Egal welche Reihe vonBefehlen man bevorzugt, es ist doch immermit einer gewissen Tipparbeit verbunden!

Da ich kein Freund von Monotonie undkleinen Tastaturen bin, habe ich nach einerLösung gesucht, die das vereinfachen könnte.Okay, in der halben Stunde, in der ich dieunten befindliche EXDEL.BAT schuf undtestete, hätte ich die obigen Befehlebestimmt ein Dutzend mal eingeben können,aber wozu ist man schließlich ein�HighBatcher� 8-)?

@echo offREM EXDEL.BAT - alle Dateien löschen,außer der als

Parameter %1 übergebenen! BSP.: EXDELautoexec.bat

rem NICHT-ZU-LÖSCHENDE-Datei angegeben ?if %1.==. goto errrem Existiert die angegebene Datei überhaupt ?if not exist %1 goto errrem Dateinamen in Großbuchstaben umwandeln!set ß=%1rem Existiert die Variable ß ?if %ß%.==. goto errrem Wildcards im Dateinamen verwendet ?for %%a in (%1) do if not %1==%%a goto errrem Alle Dateien löschen, außer der angegebenen!for %%a in (*.*) do if not %ß%==%%a del %%arem Fehlerbehandlung!:errif %1.==. echo Die NICHT zu löschende Datei fehlte!if not %1.==. if not exist %1 echo Die Datei %1 existiert

nicht!if not %1.==. if exist %1 if %ß%.==. echo

Umgebungsspeicher voll!if not %1.==. for %%a in (%1) do if not %1==%%a echo

Keine Wildcards * ? erlaubt!set ß=

Die Zeilen, die mit REM beginnen, müssennicht abgetippt werden!

Wenn ich mich also in dem oben gezeigtenVerzeichnis befinde und dort alle Dateien,außer der @!@-@[email protected], löschen möchte, sorufe ich nun EXDEL.BAT mit der Eingabe von:

EXDEL @!@-@[email protected]

auf. Dabei spült es keine Rolle, ob ich denNamen der nicht zu löschenden Datei inGroß- oder Kleinbuchstaben angebe. Nichterlaubt wären dagegen Aufrufe wie:

EXDEL *.FDIEXDEL ????????.FDIEXDEL

Ihr könnt es aber trotzdem einmalversuchen! EXDEL.BAT wird darauf mit einerFehlermeldung antworten und keine einzigeDatei löschen.

Gerne hätte ich EXDEL.BAT auchdahingehend dressiert, das man z.B. durchdie Eingabe von EXDEL *.DAT alle Dateienlöscht, die nicht die Extension .DAT tragen,aber da muß ich noch weiterforschen!

Page 20: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

20

�IF ... ECHO .>Datei�Eine Kombination dieser Befehle ist mirbislang noch in keiner Batchdatei begegnet,obwohl sie durchaus reizvoll und nutzbar ist.So habe ich diese Technik selbst schongebrauchen wollen und können, bin aberdabei böse vom DOS überrascht wurden!

So wird immer die Datei angelegt, die aufdas Größerzeichen folgt, egal ob dievorausgehende Bedingung zutrifft oder nicht!

Eine beispielhafte Batchzeile dazu:

if %1.==. echo j>test.dat

War kein Parameter vorhanden, so wird eineDatei TEST.DAT kreiert, die drei Bytes großist und das j enthält. War aber der ersteParameter vorhanden, so wird eine Null Bytegroße Datei namens TEST.DAT erzeugt.

Will man also anschließend prüfen, ob dieDatei TEST.DAT existiert oder nicht, so wirdman immer vom DOS aufs Glatteis geführt,da die Datei immer existiert, aber nichtimmer den gewünschten Inhalt hat.

Das wiegt sehr schwer, wenn diese Dateistatt TEST.DAT TEST.BAT heißen soll, alsoeine später aufrufbare Batchdatei sein soll!Die TEST.BAT wird zwar in jedem Fallefunktionieren, aber sie könnte gerade beimPoFo nicht ohne weiteres als rekursiveBatchdatei gestaltet werden.

Wie dem auch sei, ich möchte hiermit nurauf das Problem hinweisen, das die Datei injedem Falle und unabhängig von dervorausgehenden Bedingung erzeugt wird.Dabei kommt es auch nicht darauf an, ob dasVorhandensein oder Nichtvorhandenseineines Parameters, einer Variable oder einerDatei geprüft wird!!!

KnowHow: DIP-OSIn einem Atemzug... kann man doch das Laufwerk und dasVerzeichnis wechseln!

Wahrscheinlich kommen Euch diese Wortezu recht bekannt vor, weil ich mit diesenschon einmal eine Batchdatei CDD.BATvorstellte, die den gleichzeitigen Wechsel vonLaufwerk und Verzeichnis ermöglichte.

Seitdem sind bereits einige Jahre ins Landgegangen, in denen ich mich weiterentwickelthabe und eine Überarbeitung der CDD.BAT

möglich wurde. Mit der unten stehendenVersion kann man nun auch in dasHauptverzeichnis des jeweiligen Laufwerkeswechseln und auch das als D:anzusprechende DISKFOLIO oder FolioDriveDiskettenlaufwerk ist nun eingebunden. DieVariable LW, aus der ersten Version, istunnötig geworden und die Fehlerrate deutlichgesunken

Vorhang auf, hier kommt die neueCDD.BAT:

@echo offif %1.==. goto errif not exist %1\nul.* if not exist %1nul.* goto errcd %1if not exist %1nul.* goto dyrem>%1%1goto chgdrv:dyrem>%1\%1:chgdrvif exist %1\d. D:if exist %1d. D:if exist %1\c. C:if exist %1c. C:if exist %1\b. B:if exist %1b. B:if exist %1\a. A:if exist %1a. A:if exist d. del d.if exist c. del c.if exist b. del b.if exist a. del a.:errif %1.==. echo Ziellaufwerk und -verzeichnis fehlten!if not exist %1nul.* if not exist %1\nul.* echo Ziellaufwerk

und -verzeichnis gibt es nicht!

Wenn man z.B. vom Hauptverzeichnis desLaufwerkes A: ins Verzeichnis SYSTEM desLaufwerkes C: wechseln will, so gibt man:

CDD C:\SYSTEM

ein. Möchte man dagegen vom Verzeichnis\SYSTEM auf C: ins Hauptverzeichnis desLaufwerkes A: wechseln, so erreicht man dasdurch die Eingabe von:

CDD A:\

Was bei der Benutzung von CDD.BAT zubeachten ist:

Im gewünschten Laufwerk muß einDatenträger vorhanden sein, der nichtschreibgeschützt ist und der noch Platz füreine temporäre Datei hat!

Page 21: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

21

KnowHow: DIP-OSStringbearbeitung unter DOSUnter der Stringbearbeitung versteht man jagemeinhin das Bearbeiten von Wörtern. Sotrennt man z.B. das Wort Eis aus Eismeerheraus und arbeitet mit dem soherausgetrennten Eis weiter. Für solcheStringbearbeitung ist das DOS in der Regelnicht geeignet, obwohl diese Möglichkeitschon Sinn macht, wenn man Datei-,Disketten-, Verzeichnisnamen, o.ä.,herausfinden will.

Bei den großen PCs unter MS-DOS existiertaber eine unvorhergesehene Möglichkeit, dieauf dem Backslash basiert und mit der mandas Buchstabieren erreichen kann. Diesefunktioniert aber nicht auf dem PoFo!

Durch Zufall bin ich aber auf eine ähnlicheMethode gekommen, mit der man von einemWort zwischen zwei bis vier Buchstabenabschneiden kann. Probieren Sie dazu malCUT.BAT aus, welche Sie im Hauptverzeichnisder Ramdisk C: abspeichern müssen:

@echo offif %1.==. c:\cut.abc.Portfolioecho %1

Wer aufmerksam ist und sich bereits einwenig mit Batchdateien auskennt, wirdmeinen, das CUT.BAT nicht Funktionierenkann, da ein Aufruf der Datei C:\CUT.ABCnicht möglich ist. Schließlich existiert erstenskeine solche Datei und zweitens können vomDOS nur die Programme gestartet werden,die mit .EXE, .COM oder .BAT enden - nichtaber mit .ABC!

Und dann löst auch noch der Anhang.Portfolio Verwirrung aus, weil mannormalerweise Parameter durch Leerzeichengetrennt übergibt!

Dennoch hat das so seine Richtigkeit undfunktioniert, weil der PoFo sich nicht imgeringsten um die vorgegebene Endungkümmert und nur so zur Stringbearbeitunggezwungen werden kann. Bisher zumindest.

Starte bitte CUT.BAT ohne Parameter, alsodurch die Eingabe von CUT und Du sollstfolgende Anzeige erhalten:

olioWie unschwer zu erkennen ist, hat der PoFoalso von dem Wort Portfolio nur noch dieletzten vier Buchstaben behalten. Bitte

ändere nun die Zeile zwei von CUT.BAT wiefolgt:

if %1.==. c:\cut.ab.Portfolio

Nach dieser Änderung und dem erneutenStart von CUT.BAT, wie immer ohneParameter, werden Sie feststellen, das nurnoch lio von Portfolio übrigbleibt.

Bitte ändere nun die Zeile zwei vonCUT.BAT wie folgt:

if %1.==. c:\cut.a.Portfolio

Nach dem nunmehr dritten Start bleibt nurnoch io vom Portfolio übrig. Das ganzeGeheimnis liegt an der Dateiendung und demdarauffolgenden Punkt:

Besteht die Dateiendung aus vier Zeichen,z.B. .abc, so werden die letzten vierBuchstaben abgeschnitten. Besteht sie nuraus drei Zeichen, z.B. .ab, so werden dieletzten drei Buchstaben abgeschnitten. Beinur zwei Zeichen, z.B. .a, werden nur dieletzten zwei Buchstaben abgetrennt.

Lassen Sie die Dateiendung, hier .ABCgänzlich weg, so werden generell die letztenvier Buchstaben zum Inhalt des Parameters%1:

if %1.==. c:\cut.Portfolio

Diese Trennung ist aber in jedem Fall nurmöglich, wenn der Punkt vor demgewünschten Wort, hier Portfolio, nicht fehlt!

Versuchen Sie eine Trennung bei Wörterndurchzuführen, die ASCII-Charaktereoberhalb 128 beinhalten, z.B. ö ä ü ß, so wirddie Trennung anders ausfallen. Aber daskönnen Sie ja mal selbst ausprobieren!

CUT.BAT ist nur ein Beispiel um dieStringbearbeitung zu demonstrieren. WennSie also CUT.BAT durch die Eingabe vonc:\cut.abc.Portfolio starten, so erhalten Sieals Ergebnis auch wieder den Wortfetzen olioauf dem LCD-Schirm.

Sie könnten also genauso gut die folgendeTEST.BAT im Hauptverzeichnis der RamdiskC: speichern...

@echo offecho %1

... und mit der Eingabe \test.123.permdatastarten, um das Wort data angezeigt zubekommen.

Page 22: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

22

Ich bin jetzt auf jeden Fall darauf gespannt,wie Du diesen Trick in Batchdateienverwendest.

Batchdateien in der LiteraturIn Zeiten zunehmender Verfensterung ist esnatürlich nicht leicht, Bücher zum ThemaBatchdateien im Handel zu finden. Aber mitetwas Glück und Geduld kann man gesuchteBücher von Privat erwerben.

Leider gibt es nur recht wenige Bücher indeutscher Sprache dazu und diese sind meistnur für den wißbegierigen Beginnerinteressant:

�DOS Batch Programmierung� von WolfgangWeber. 1992, ISBN 3-8171-1266-1, VerlagHarri Deutsch.

�BATCH-Betrieb und Automation unter DOSund Windows 3.x/95� von Alois Kneisle. 1996(!), ISBN 3-446-18658-1, Carl Hanser Verlag.Dieses Buch geht sehr in die Tiefe.

�So geht�s! Utilities und Batchdateien� vonRudi Kost, Josef Steiner und Robert Valentin.1993, ISBN 3-87791-467-5, Markt & TechnikVerlag.

�Batch-Dateien - Einsteigerseminar� von Dr.Ekkehard Kaier. 1992, ISBN 3-89360-618-1,bhv Verlag.

�Batchdateien für MS-DOS 6.0 entwickeln�von Hellermann und Lemme. 1993, ISBN 3-7723-5023-2, Franzis-Verlag.

�Stapeljobs unter MS-DOS� von Paulissen &Paulissen. 1990, ISBN 3-88963-241-6,Hofacker Verlag.

�BATCH-PROGRAMMIERUNG unter DOS�von Heinz-Peter Glaß. 1991, ISBN 3-88322-332-8, IWT Verlag.

Im Frühjahr �96 soll angeblich noch einBuch mit dem Titel �Batch mal wieder!�erscheinen. Einer der Autoren soll Werner�Tikki� Küstenmacher sein. Dem Titel nach,könnte es ein Buch für fortgeschritteneBatchprogrammierer werden. Hoffen wir alsodas Beste!Weitere Bücher, die meist ein Kapitel zumThema Batchdateien haben, sind: �MS-DOS 6- Tips & Tricks� von Helmut und ManfredTornsdorf. 1993, ISBN 3-8158-1014-0, DataBecker.

�MS-DOS Trainer� von Bach und Backer.1995, ISBN 3-8043-3019-3, Augustus Verlag.

�Das MS-DOS Kompendium� von ChrisDeVoney. 1985, ISBN 3-89090-106-9, Markt& Technik Verlag.

Aus der Rolle fallen die folgenden Bücher:�Data Beckers große MS-DOS Toolbox� vonHelmut und Manfred Tornsdorf. 1990, ISBN3-89011-824-0, Data Becker. Dieses Buchbietet eine ausführliche Einführung in dieBatchprogrammierung und zusätzlich vieleHilfsprogramme auf beiliegender Diskette.

�Softwarelexikon MS-DOS� von Thomas Taiund Peter Freese. 1988, ISBN 3-499-18152-5, rororo Verlag. Es ist mehr für denengagierten MS-DOS Anwender gedacht, daes u.a. beschreibt, ab wann welcher Schalter,welche Option und welcher Befehl in MS-DOSeingeführt wurde. Aber auch Begriffe wieAkkustikoppler usw. werden dort erklärt.An Zeitschriften kann ich empfehlen:

1 Die Sonderhefte des PC-Welt Magazins2 Die ersten zwei Ausgaben des Magazins

�100 Tips & Tools für Windows & MS-DOS�vom Verlag VTP Fürst

3 �Was ist denn DOS?� vom KnowWareVerlag

Ein bis zwei Seiten mit DOS-Tricks undBatchdateien findet man auch monatlich inden Zeitschriften PC-Welt, PC Praxis, PC go!,CHIP, DOS und der Highscreen Highlights.

Ansonsten kann ich den DatendienstCompuServe wärmstens empfehlen, spezielldas MSDOS-Forum (GO MSDOS), da mandort die besten Batchprogrammierer antrifft.Selbst wenn eine Frage schon dreißigmalgestellt wurde, wird sie auch beim 31. malbeantwortet!

Über den PC-File-Finder von CompuServe(GO PCFF) kann man auch eine ganze Reihevon Batchdateien finden, wenn man alsSchlüsselworte (Keywords) BATCH und DOS,oder als Extension BAT einträgt.

Leerzeilen bei der Bildschirm-ausgabe durch Batchdateien?Normalerweise kann mit dem -ECHO-Befehlkeine Leerzeile auf dem Schirm produziertwerden. Bei den großen PC�s behilft man sichdeshalb mit einem Trick und verlängert denBefehl um beispielsweise einen Punkt: -ECHO.- , doch der PoFo spielt da wieder nichtmit.

Page 23: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

23

Glücklicherweise braucht man aber trotzdemnicht auf die Leerzeile zu verzichten! Mit derfolgenden Tastenkombination, die beimschreiben von Batchdateien im PoFo eigenemTexteditor Gültigkeit hat, kann man Leer-zeilen für spätere Bildschirmausgabenerzeugen:

• Das Wort -ECHO- eintippen• Taste <FN> drücken und festhalten• Taste <N> drücken• Beide Tasten loslassen, der Cursor sollte

nun als Unterstrich dargestellt werden �_�• Taste <ALT> drücken und festhalten• Taste <K> drücken, Taste <I> drücken

und noch einmal Taste <I> drücken• Taste <ALT> loslassen• Taste <FN> drücken und festhalten• Taste <N> drücken, der Cursor wird

wieder zum Vollcursor �¦�• Die Taste �<+� (Enter o. Return) drücken,

fertig!

Mit dieser Tastaturakrobatik hat man dannalso endlich eine Leerzeile, für die spätereBildschirmausgabe, erzeugt. Auch einezentrierte Textausgabe kann so auf Wunschkreiert werden! Dazu muß für jedesgewünschte Leerzeichen vor dem Text, dieTastenkombination <Alt> halten, <K>drücken, <I> drücken, <I> drücken, Altloslassen, durchgeführt werden.

Optisch ansprechende und deutlicherkennbare Bildschirmmasken sind damitgarantiert und werden jedem Betrachter einerstauntes �Oh!� abringen! Das funktioniertauch auf dem PC, auch wenn man dort dasominöse Leerzeichen (ASCII-charachter 255)durch andere Tastendrücke erzeugen muß!

Wildcards * ? - Teil 2Im ersten Teil zeigte ich Euch, wie man dieWildcards * und? im Parameter %1 erkennenund verbieten kann. Dies ist ja immer dannvon Interesse, wenn das Batchprogramm nurmit einer Datei zur Zeit arbeiten soll. Wer dieTechnik aus dem ersten Teil verwendet, wirddann einen Abbruch des laufenden Batch-programmes erzwingen, wenn im Parameter%1 zumindest einmal eines der Wildcardsvorkommen sollte.

Dieser Abbruch mag aber für manchen vonEuch unbefriedigend sein, weil dadurch dasgewünschte Ziel nicht erreicht wird. So kannes ja vorkommen, daß das Batchprogrammwirklich mehrere Dateien benutzen oderbearbeiten soll. Darum gilt es nichtabzubrechen, wenn Wildcards verwendetwurden, sondern der Routine mitzuteilen, dasmehrere Dateien verwendet werden sollen:Schließlich haben wir ja gerade dafür dieWildcards!!!

Wie man also eine solche intelligenteBatchdatei schreibt, die selbständig erkennt,ob eine oder mehrere Dateien verarbeitetwerden sollen, will ich nun einmal beispielhaftdemonstrieren:

@echo offrem wildcards checken und erlauben!for %%a in (%1) do if not %1==%%a goto manyrem hier die Zeile für eine Datei:copy %1 b:goto off:manyrem hier die Zeile für mehrere Dateien:for %%a in (%1) do copy %%a b::off

Die oberste und erste FOR-Zeile prüft alsowieder die Wildcards ab und springt, wennein Wildcard im Parameter %1 steckte, zurSprungmarke :many. Dort wird dann mit derFOR-Zeile der Kopierbefehl für jede vor-handene Datei ausgeführt, auf die dieWildcards passen. War kein Wildcard imParameter %1 zu finden, so wird nur dieDatei kopiert, die als Parameter %1 überge-ben wurde:

COPY %1 B:

Danach wird zur Sprungmarke :offgesprungen, damit die Datei nicht nocheinmal kopiert wird.

Leider ist das Beispiel nicht sehr gut, weilman auf die Zeile COPY %1 B: verzichtenkann: Denn die FOR-Zeile aus :manyfunktioniert auch dann, wenn sich keinWildcard in %1 befindet. D.h., man kann aufdie Prüfung der Wildcards verzichten und dieRoutine wie folgt verkürzen:

@echo offfor %%a in (%1) do copy %%a b:

Diese Version geht immer, egal ob manWildcards verwendete oder nicht! Da die

Page 24: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

24

Wildcards ? und * nur mit Dateinamenfunktionieren, sollte man immer eine FOR-Schleife verwenden, wenn eine, oder mehrereDateien bearbeitet werden sollen! Manerreicht durch die FOR-Schleife auf jeden Falleine höhere Flexibilität.

Sprungmarken - Teil 3Es soll ja sehr sparsame Leute geben, derenSparsamkeit sich sogar bei derProgrammierung von Batchdateienbemerkbar macht!

So sparen sie sich die üblicherweiseeinleitende Anfangszeile @ECHO OFF, wenndie gesamte Batchdatei nicht mehr als elfZeilen lang wird. Dafür beginnen sie dann diezu schreibenden Batchzeilen mit demKlammeraffen @, der die Bildschirmausgabeunterdrückt:

@cls@dir /p

Weniger Geizige würden dieselben Zeilen soschreiben:

@echo offclsdir /p

Wer beide Versionen abtippt und speichert,wird feststellen, das die erste Version umneun Bytes kürzer ist und doch genau wie diezweite Version funktioniert. Warum sollteman also eine Batchdatei mit der Zeile@ECHO OFF beginnen, wenn ein Klammeraffe@, vor jeder Zeile, dasselbe bewirkt??? WeilSprungmarken da wieder einen Strich durchdie Rechnung des Programmierers machen,lautet darauf die Antwort!!! Denn steht voreiner Sprungmarke ein Klammeraffe, so kanndiese Sprungmarke nicht vom DOSangesprungen werden. Man erhält dannnämlich die bekannte Fehlermeldung�Sprungmarke nicht gefunden�!

Mit diesen Zeilen könnt ihr das ja einmalausprobieren:

@goto jj@rem@:jj@dir /p

Läßt man dagegen den Klammeraffen vor derSprungmarke :jj wieder weg, so wird die

Sprungmarke auch vom DOS gefunden undausgeführt. Sogar ohne die Anzeige der Zeileauf dem Bildschirm!Was lernen wir also daraus?

1. Egal ob das ECHO on oder off ist, eineZeile, die mit einem Doppelpunkt beginnt,wird nie auf dem Bildschirm angezeigt!

2. Möchte man zu Testzwecken dieAusführung einer Sprungmarke verbieten undstatt dessen einen Abbruch erzwingen, sofügt man den Klammeraffen @ vor demDoppelpunkt der Sprungmarke ein! Ein Punkt�.� hat übrigens dabei dieselbe Wirkung!

Letzteres ist nur bei der Erprobung undFehlersuche zu empfehlen. Oder hat jemandeine Idee, wie man das sonst nutzen könnte?

KnowHow: DIP-OSBedingtes SHIFTenMit dem Befehl SHIFT werden Parameterverschoben, oder Schleifen konstruiert, die inAbhängigkeit von Parametern ausgeführtwerden. Wer also diesen Befehl einsetzt, weißin der Regel genau, was bezweckt werdensoll.

Durch ein paar Experimente bin ich aufneue Erkenntnisse zu diesem Befehlgekommen, auch wenn ich noch keineRoutine präsentieren kann, die davonprofitiert. Angeblich ist der Befehl SHIFT nichtdurch Parameter, Variablen oder Optionenergänzbar. So kann man z.B. keinenParameter angeben, ab dem geshiftedwerden soll. Kurioserweise kann ich aberbeim PoFo eine beliebige Variable nach -SHIFT- angeben, die damit das Verhalten von-SHIFT- ändern kann:

-SHIFT %!%-

Wenn keine Variable! existiert, so wird ganznormal geshifted. Enthält aber die Variable!irgendwelchen Inhalt, so bekommt man dieFehlermeldung �Falscher Parameter� und -SHIFT- wird nicht ausgeführt. Auch dieVariable bleibt unverändert.

Weil ich die Fehlermeldung unterdrückenwollte, leitete ich sie dann nach NUL um:

-SHIFT %!%>nul-

Solange die Variable! nicht existiert, wirdauch ordnungsgemäß geshifted. Wenn aber!existiert, erscheint nicht nur obige

Page 25: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

25

Fehlermeldung, sondern auch die nächsteZeile kommt nicht zur Ausführung! Sie wirddann einfach übersprungen. Ich kann dieseFehlermeldung also nicht unterdrücken, wohlaber die Ausführung der nächsten Zeileunterbinden.

Wenn Ihr Euch davon selbst überzeugenwollt, so produziert mal die Variable! undmodifiziert die �NOSHIFT.BAT�:

@echo offecho %0 %1shift %!%>nulecho No SHIFT Test!echo %0 %1pause

Dank dieser undokumentierten Funktion kannman also Minisprünge machen, durch die einePassage von Befehlszeilen doppeldeutigverwendbar ist. Es liegt nur an uns, diesesnutzbar zu machen!

Das Gerät NUL... ist selten dokumentiert und dennochhäufig in Batchdateien zu finden. Was esdamit auf sich hat und wie es eingesetztwerden kann, möchte ich hier zu erklärenversuchen.

Meistens steht diese Gerätebezeichnung amEnde vieler Batchzeilen und präsentiert sichals Zeichenfolge �> NUL�. Mit dem Zeichen�>�, soviel dürfte bereits bekannt sein, wirdeine Aktion, ein Text oder eine Meldung, vomSchirm auf ein anderes Gerät oder in eineDatei umgeleitet. So erzeugt der Befehl -ECHO Hallo User! > USER.TXT- eine Dateinamens �USER.TXT�, in der der Text �HalloUser!� abgelegt wird. Schreiben wir aber nachdem Umleitungszeichen �>� z.B. �PRN:�, sowird der Text auf dem hoffentlichangeschlossenen Drucker ausgegeben.

Einige andere Aktionen, wieVerzeichnisanlegung, Dateikopierung oderFehlermeldungen, sollen aber erst gar nichtauf dem Bildschirm erscheinen, da sie evtl.Textmasken zerstören oder wichtigeInformationen vom Schirm verdrängen. Weildie Ablage in Dateien unnötigePlatzverschwendung wäre, sollten alleKommentare des Computers, er sabbelt haltgerne, im Nirwana (Nichts, EDV-Loch,Nullspeicher) landen. Und hier tritt das GerätNUL in Erscheinung, welches alles schluckt,aber nie wieder ausspuckt! Hungrig wie esist, arbeitet es mit jedem DOS-Befehlzusammen, auch wenn gerade dadurch diegewünschte Aktion vereitelt wird. So findetz.B. kein Verzeichniswechsel statt, wenn manden folgenden Befehl eingibt: -CD \ > NUL-.Die Meldung �X Datei(en) kopiert�, die nacheinem erfolgreichen Kopiervorgangausgegeben wird, kann man aber sehr wohldamit unterbinden: -COPY A:*.* C: > NUL-.Versucht man auf einem Laufwerk einVerzeichnis zu erzeugen, welches bereitsexistiert, gibt es immer einen gehässigenKommentar vom Computer. Hängt man dasNUL-Gerät an den Befehl -MD SYSTEM-, derhier als Beispiel zu verstehen ist, übt sich derComputer in Toleranz und schluckt seineMeinung herunter. Die Syntax dazu lautet:

-MD SYSTEM > NUL-.

Page 26: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

26

Besonders bei den Befehlen -MD-, -COPY-und -REN- kommt das Gerät NUL zur vollenGeltung, läßt sich aber noch bei vielenanderen Befehlen einsetzen. Den Nutzenbemerkt man erst beim ausprobieren!

Etliche Wochen funktionierte unserespezielle Batchdatei, die vollautomatisch alleDateien von A: auf C: kopierte, tadellos, abernun tritt trotz der NUL-Umleitung ein Fehlerauf, den der Bediener mit Abbruch,Wiederholen oder Ignorieren beantwortenmuß. Wozu leiten wir alleComputerkommentare nach NUL um, wenn erdoch eine Fehlermeldung ausgibt? Es handeltsich dabei um einen so elementaren Fehler,daß der Computer unsere Umleitungignorieren muß, damit der Bediener dieChance hat, diesen Fehler zu beseitigen.Kurz: Der Computer kann den Fehler nichtvon sich aus beheben, oder gibt es einen derselbständig Disketten wechseln kann?

Guten Batchprogrammierern, und diewollen wir ja alle werden, ist aber selbstdiese Unterbrechung ein Dorn im Auge. Siegeben daher die Antwort selbst durch einebereitgestellte Datei, die die Antwort A, Woder I an den Tastaturpuffer übergibt.Können wir also einen Abbruch verantworten,oder wollen den Fehler auf unsere Artbehandeln, so erstellen wir uns doch einmaldiese Datei mit einem Texteditor! Editorstarten, <A> eintippen, Rettern- bzw.Entertaste drücken und den Text unter demNamen �A.DAT� abspeichern - fertig. Inunserem bisherigen Kopierbefehl -COPY A:*.*C: > NUL- gilt es nun, die Datei �A.DAT�einzubinden.

Weil der geplante Tastendruck <A> aus derDatei kommen soll, muß eine Umleitung ausder Datei erfolgen. Dazu muß dasgegenteilige Umleitungszeichen �<�verwendet werden, inkl. der zuentnehmenden Datei, die in unserem Fall�A.DAT� heißt. Die neue Syntax lautet nun: -COPY A:*.* C: < a.dat > nul-.

Sollte also in Zukunft beim kopieren einFehler auftauchen, so wird die Aktionkommentarlos abgebrochen. Diese Technikmuß aber jeder Batchprogrammierer aufeigene Gefahr verwenden!!!

Ein DOS vor Version 3.30... kennt den Klammeraffen @ nicht, mit demman in der Regel die erste Zeile einerBatchdatei einleitet. Unser PoFo ist da einerühmliche Ausnahme!

Mit dem Klammeraffen @ erreicht man, unddas sollte bereits bekannt sein, dieUnterdrückung der Bildschirmausgabe, wenneine Batchzeile abgearbeitet wird. Läßt manz.B. diese Zeilen:

REM TEST.BATECHO Hallo User!

als TEST.BAT laufen, so ergeben sichfolgende Bildschirmausgaben des DOS:

c:\test>REM TEST.BAT

c:\test>ECHO Hallo User!Hallo User!

c:\test>Stellt man dagegen beiden Zeilen denKlammeraffen @ vor(an):

@REM TEST.BAT@ECHO Hallo User!

so sieht die Bildschirmausgabe dann so aus:Hallo User!c:\test>Um nicht vor jede Zeile den Klammeraffenschreiben zu müssen, gibt es den globalenBefehl:

ECHO OFFmit dem das DOS die Anzeige der geradeauszuführenden Batchzeile unterbindet. Weilsolche Anzeigen nur stören und viel zuschnell über den Bildschirm huschen, beginntman also eine Batchdatei mit der Zeile:

ECHO OFFDamit auch diese Zeile nicht angezeigt wird,stellt man den Klammeraffen voran:

@ECHO OFFUnd schon wird nur das vom DOS auf demBildschirm ausgegeben, was aus denBefehlen ECHO, DIR, COPY, HELP, CHKDSK,DATE, TIME, FORMAT usw. resultiert. Auchdie Fehlermeldungen werden ausgegeben.

Aber was tun, wenn das DOS nicht dieVersionsnummer 3.30 trägt und dieBatchdatei unter diesem DOS laufen soll? DasDOS würde nämlich die Zeile:

Page 27: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

27

@ECHO OFF

mit einer Fehlermeldung quittieren: �Befehloder Programm nicht gefunden�, da es denKlammeraffen @ nicht kennt. Das ECHO wäredann auch weiterhin eingeschaltet!

Aber die Lösung ist ganz einfach: Man lenktdie Fehlermeldung zum Gerät NUL um undwiederholt den Befehl ECHO OFF, aberdiesmal ohne @:@ECHO OFF>NULECHO OFFUnd schon läuft auch diese Batchdatei unterDOS Versionen vor 3.30! Okay, okay, eskommt nicht mehr allzu häufig vor, das eineDOS Version vor 3.30 noch in Betrieb ist,aber wenn doch, dann wißt Ihr nun jeden-falls, wie Ihr das Problem ganz galant lösenkönnt.Schließlich ist diese Lösung dann unterjedem DOS, ohne Änderung, einsetzbar!

Erste Hilfe!!!Der erste Start einer fremden Batchdatei istmit viel Ungewißheit verbunden! So weißman oft nicht, welche Parameter und wieviele Parameter angegeben werden müssen,welche Variablen vorher schon bereitzustellensind und was die Batchdatei überhaupterledigen soll.

Darum sollte man den Anwender nicht mitdiesen Fragen im Regen stehen lassen,sondern eine Hilfsfunktion implementieren,beim schreiben des Batchprogrammes, diedem unerfahrenen Anwender etwas unter dieArme greift, bzw. ihn informiert! Ich habe mirdafür die folgenden Zeilen ausgedacht:

@echo offfor %%a in (. h. H. help. HELP. -h. -H. -help.

-HELP.) do if %1.==%%a goto helpif %1.==?. goto helpif %1.==-?. goto helpif %1.==/?. goto helpif %1.==/h. goto helpif %1.==/H. goto helpif %1.==/help. goto helpif %1.==/HELP. goto helpremrem Hier wird dann das eigentliche Batchprogramm

eingebunden!!!remgoto offrem Hier beginnt die erste Hilfe!:help

echo Hier können beliebig viele Zeilen mit ECHOausgegeben werden, damit

echo man den Anwender über alles informieren kann!!!:off

Wird eine Batchdatei gestartet, die dieseZeilen enthält, so informiert sie denAnwender, wenn dieser eine der folgendeZeichenfolgen, als Parameter %1, übergebenhat:

? h H help HELP /? /h /H /help /HELP -? -h -H -help -HELP

Und wenn kein Parameter beim Startangegeben wurde, so wird der Anwenderebenfalls informiert!

4DOS für den PoFo und andereMS-DOS PocketsKönnt Ihr Euch noch an diese MS-DOS Erweiterung erinnern?Bis zur MS-DOS Version 3.30 feierte die Erweiterung 4DOSgroße Erfolge, da sie das MS-DOS um sehr interessante undnützliche Befehle ergänzte:

So kann man mit dem Alias-Befehl eigeneBefehle kreieren, mit Gosub und Return inBatchdateien herumspringen, mit Input undInkey Tastaturabfragen in Variablen packen(kein Errorlevel!), mit Screen Texte anbeliebiger Stelle des LCD-Schirms plazieren,mit Call zwischendurch bis zu fünf andereBatchdateien aufrufen, mit Text und Endtextganze Textblöcke ausgeben, mit Pushdir undPopdir sich Verzeichnisse und Laufwerks-bezeichnungen merken u.v.m.

Neulich fand ich also 4DOS inkl. Handbuchauf dem Grabbeltisch eines EDV- Händlersund nahm es auch nach kurzem Studium mit.Problemlos konnte ich 4DOS auf meinemPoFo mit Bios 1.072 installieren. Eigentlichhätte mich das ja schon stutzig machenmüssen, nachdem was man immer wiedermit dem PoFo erlebt. Der Reihe nach ging ichalso die neuen Befehle durch und probiertesie aus.

Überraschenderweise funktionierte das Grosproblemlos, aber die die nicht funktionierten,waren sinnigerweise die wichtigsten!

CLS, LIST, TYPE, HELP, KEYSTACK und DIRwollten nicht wie ich es wollte. Aber weil mansich mit 4DOS eigene Befehle kreieren kann,habe ich diese mit einigen Tricks undBatchdateien selber nachempfunden. Leiderist es dazu unerläßlich 4DOS zu verlassenund ins DIP-OS zurückzukehren. Nur bei den

Page 28: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

28

reparierten Befehlen CLS und KEYSTACK,verbleibt man im 4DOS, sofern man nicht mitKEYSTACK explizit den Ausstieg erzwingt!

Einige bisher vertraute Befehle des DIP-OSsind unter 4DOS leider nicht mehrzugänglich: APP, CHKDSK, FDISK, FORMATund OFF. Auch diese konnte ich aber mitFAKE, ALIAS und div. Batchdateien dem4DOS beibringen. Wendet man nun dieBefehle APP, CHKDSK und FORMAT wiegewohnt an, so ist die Rückkehr ins DIP-OSvorprogrammiert. Bei der Verwendung vonOFF gelangt man aber beim erneutenEinschalten des PoFo, automatisch ins 4DOS.Hat man 4DOS autostartend auf derMemorycard installiert, so gelangt man auchnach dem FDISK-Befehl wieder ins 4DOS.

Die Doskey-Funktion gehört zu deninteressantesten Erweiterungen, da man nunalle Eingaben mit den Cursortastenoben/unten durchblättern, modifizieren undreaktivieren kann.

Im großen und ganzen ist 4DOS also einesehr sinnvolle Ergänzung zum DIP-OS undbringt viele Möglichkeiten zurBatchprogrammierung mit sich. Obwohl ichUPDATE und PORTDIV installiert habe,erschienen zwar so manchmal unsinnigeFehlermeldungen, wie z.B.: �Unknowncommand �lias��, aber diese beeinträchtigtendie Arbeitsweise des PoFo bislang nicht.

Hier in Deutschland wurde diesesSharwareprogramm von der KirschbaumSoftware GmbH, Kronau 15, 8901 Emmeringvertrieben. Ob und zu welchem Preis es nocherhältlich ist, entzieht sich meiner Kenntnis.

Kurios fand ich nur, daß ich in einerProgrammliste des Atari-Forums aus demCompuServe, Stand: Juni �93, diese tolleErweiterung nicht zu finden war. Dabeistammt 4DOS aus den USA und wurde 1989programmiert! Vielleicht liegt es aber auchdaran, daß man ohne das dazugehörigeHandbuch nicht sehr weit kommt, gerade aufdem PoFo, da dort die Help-Funktion nichtohne weiteres installierbar ist. Die gesamteErweiterung benötigt schon alleine auf einerDiskette etwa 330 KB.

Zum Abschluß wieder eine Ungereimtheit,die mir in diesem Zusammenhang mit demPoFo auffiel: Ich habe die 4DOS-Befehle ausdem Handbuch in meinen PC eingetippt unddann auf die Memorycard übertragen. Als ich

mir dann diesen Hilfstext auf dem PoFo unter4DOS anzeigen ließ, funktionierte gleichdarauf meine CLS- Reparatur nicht mehr! Aufdie Schliche bin ich dem Fehler gekommen,als ich mir diesen Hilfstext mal in derTextverarbeitung des PoFo ansah. Hinter demTextende prangte doch glatt dasDateienzeichen �^Z�. Kaum hatte ich dasgelöscht und den PoFo von Grund auf neugestartet, war dieser Fehler nie mehrgesehen!

ALLREAD.BAT - für LeserattenWer eine ganz bestimmte Dateigruppesichten will, oder muß, ist gezwungen denTYPE-Befehl entsprechend häufig einzugeben.Diese Monotonie macht natürlich krank undschreit geradezu nach einer Batchdatei:

@echo offclsif %1.==. goto errfor %%d in (%1) do type %%d /pgoto off:errecho Dateigruppenangabe fehlt!:off

Ruft man diese Datei mit ALLREAD *.BAT auf,so sollte man alle Batchdateien seitenweiseangezeigt bekommen. Doch erste Testsergaben, das diese Routine nicht unter jederDOS-Version funktioniert, da es nicht immerdie Option /p beim TYPE-Befehl gibt.

Hier die technische Erläuterung:Zunächst wird nach dem Aufruf geprüft, ob

überhaupt eine Dateiengruppe als Parameter%1 angegeben wurde. Entweder springt DOSzur Sprungmarke :ERR und gibt eineFehlermeldung aus, oder es fährt mit derFOR-Schleife fort. In dieser verweilt das DOSsolange, bis die Menge (%1), also alleDateien die der Maske entsprechen, die alsParameter übergeben wurde, auf dem Schirmausgedruckt wurde. Danach entfleuchtALLREAD.BAT kommentarlos zurSprungmarke :off und stellt die Arbeit ein.

ANSI.SYS-TIP: EscapesequenzDas man mit dem Bildschirm- undTastaturtreiber ANSI.SYS viel erreichen kann,ist wohl unumstritten. Oftmals gibt man einesolche Befehlsfolge mit dem PROMPT-Befehlein, da man sonst die Escapesequenz

Page 29: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

29

(Charakter 27, Darstellung �^[�), nicht unterDOS erzeugen kann.

So kann man seinem Computer ein X fürein U vormachen, wenn man ANSI.SYSinstalliert hat und den BefehlPROMPT$e[�X�;�U�p eingibt. Leider wird aberdurch diese Eingabe auch das Promptgelöscht, welches danach also rekonstruiertwerden muß.

Zwar kann man das auch mit der folgendenBatchdatei realisieren, aber man verschenktdoch wertvollen Speicherplatz:

@set op=%prompt%@prompt$e[�X�,�U�p

@prompt=%op%

Kürzer und einfacher ist da der Weg über denBefehl ECHO, da erstens ECHO mit @ECHOOFF ausgeschaltet sein darf und zweitens,keine Leerzeile auf den PromptBefehl folgenmuß, die die Einstellung vornimmt:

@echo offecho ^[[�X�;�U�p

Problematisch an dieser Version ist aber, wieeingangs erwähnt, die Erzeugung dereinleitenden Escapesequenz, mit der jedeANSI betreffende Einstellung beginnen muß.Zwar kann man die Zeichenfolge �^[�, die fürdie Escapesequenz steht, per Tastatur einzelneingeben, aber sie ist dann nichtgleichbedeutend wie die Escapesequenz �^[�,da sie dann aus zwei Zeichen besteht, wäh-rend die Escapesequenz tatsächlich nur einZeichen beinhaltet, obwohl zwei auf demBildschirm ausgegeben werden.

Es bleibt einem also nur der Ausweg übereine �höhere� Programmiersprache, damit derCharakter 27 in Batchdateien genutzt werdenkann. Ich habe mir dieses Zeichen mittelsGW-BASIC geklaut und in die BatchdateiANSIECHO.BAT geschrieben:

10 open �ansiecho.bat� for output as #120 print #1,�ECHO �;chr$(27);chr$(91);30 close

Möchte ich also nun eine Einstellung mitANSI.SYS vornehmen, so lade ichANSIECHO.BAT in meine Textverarbeitungund ergänze den ECHO-Befehl um die

gewünschte Syntax, bevor ich den Text untereinem neuen Namen abspeichere.

Weil viele Wege nach ROM führen, kannman sich natürlich die Escapesequenz auchdurch andere Programmiersprachenergaunern!

Portfolio-User haben es dagegen etwaseinfacher und behelfen sich mit dereingebauten Tabellenkalkulation. Dort wirdeinfach in die erste Zelle, des ansonstenleeren Arbeitsblattes, der Wert 27eingegeben. Nach dem diese Eintragungunter dem Namen UNNAMED.WKSgespeichert wurde, lädt man diese in dieTextverarbeitung und löscht alle Zeichen vorund hinter der Zeichenfolge �^[�.Anschließend setzt man vor ihr noch denBefehl ECHO, bevor man den soentstandenen Text als ANSIECHO.BATabspeichert.

Auch alle anderen Steuerzeichen kann manso einfangen und in Variablen festhalten!

PS: Probiert doch mal in der PoFo-Textverarbeitung die Tastenfolge ALT-Ä ALT-Ü aus. Dieser Weg ist einfacher und erzeugtebenfalls das ESC-Zeichen.

Batch bearbeitet das Batchver-zeichnisNormalerweise zieht man sich dabei, pardonder Batchdatei, den Boden unter den Bytesweg! Hat nämlich diese Batchdatei ihrenStammplatz in dem Verzeichnis, in dem alleBatchdateien stehen und dieses Verzeichnismuß vorübergehend gelöscht werden, sokann das DOS die entsprechende Batchdateinicht mehr wiederfinden und bricht etwa mitfolgender Meldung ab:

Diskette mit Stapeldatei einlegen!Wenn bereit eine beliebige Taste drücken.

Da aber die Batchdatei sich selbst ausradierthat, kann man so viele Tasten drücken wieman will. Denn das DOS wird dieseBatchdatei nicht mehr finden!

Einzig der Abbruch mit <STG>+<C> hilftkurzfristig aus dieser Misereherauszukommen. Die restlichen geplantenBefehle müssen dann von Hand eingegebenwerden, damit man die Ordnungwiederherstellen kann.

Page 30: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

30

Ich habe dieses schon mehrmals erlebt undeine Lösung geschaffen, die die Batchdateiaus dem kritischen Verzeichnis verlagert:

@echo offif %1.==. goto errcopy c:\batch\%1.bat c:\>nulc:\%1 %2 %3 %4 %5 %6 %7 %8 %9:errecho Aufruf mit:echo BATCH Batchdatei Parameter

Möchte ich also das Verzeichnis BATCH mitmeiner Batchdatei �DEFRAG.BAT�defragmentieren, so starte ich diesenVorgang mit:

-BATCH DEFRAG \BATCH-

Die Routine �BATCH.BAT� kopiert daraufhin�DEFRAG.BAT� in das Hauptverzeichnis vonC: und startet anschließend �DEFRAG.BAT�vom Hauptverzeichnis von C:. Zwar erfolgtdieser Start nur mit maximal achtParametern, aber das dürfte in den meistenFällen auch genügen. Nachdem dieeigentliche Defragmentierung abgeschlossenwurde, müßt Ihr die �DEFRAG.BAT�eigenhändig aus dem Hauptverzeichnis vonC: entfernen, weil �DEFRAG.BAT� nichtrekursiv programmiert wurde!

[01] @echo off[02] cls[03] echo i������������������+[04] echo ¦° Lars Aschenbach�s Batchfiles °¦[05] echo ¦ «¡» ¦[06] echo ¦ in action: BATHELP .BAT v02-09-96 ¦[07] echo ¦° for DOS 3.30 or higher °¦[08] echo +������������������¥[09] rem[10] ::: User Explanation:[11] :::[12] ::: BATCHFILE : BATHELP.BAT[13] :::[14] ::: FUNCTION : show documentation of batch- or

other files[15] ::: SYNTAX : BATHELP filename[.ext][16] ::: EXAMPLES : BATHELP bathelp or: BATHELP

readme.1st[17] ::: GET HELP : BATHELP[18] ::: HINT : wildcards * ? aren�t allowed in filename

and extension[19] ::: HINT : lines including ::: get interpreted as

documentation[20] :::[21] ::: Technical Explanation:[22] :::[23] ::: DOS : 3.30 or higher

[24] ::: EXTERNAL : FIND, MORE[25] ::: PERMVAR : PATH[26] ::: OPTIONVAR : BDV, BDY[27] ::: TEMPVAR : FL[28] ::: USEDFILE : BATHELP.BAT[29] ::: TEMPFILES : unknown - made by FIND & MORE[30] ::: MAKEFILE : none[31] ::: SCREEN : 80 columns, 25 rows[32] ::: VERSION : 09 Feb 1996[33] ::: TESTED ON : MS-DOS 6.22[34] ::: AUTHOR : Lars Aschenbach, Germany[35] :::[36] if %PATH%.==. echo.[37] if %PATH%.==. echo Can�t work: Variable PATH is

missing![38] if %PATH%.==. goto err[39] set | find �windir�>nul[40] if not errorlevel 1 if errorlevel 0 echo.[41] if not errorlevel 1 if errorlevel 0 echo Can�t work:

Windows is running![42] if not errorlevel 1 if errorlevel 0 goto err[43] if not exist %BDV%%BDY%nul if exist

%BDV%%BDY%\nul set bdy=%BDY%\[44] if not %1.==. shift[45] if exist %BDV%%BDY%%0.bat set

fl=%BDV%%BDY%%0.bat[46] if exist %BDV%%BDY%%0.bat if %FL%.==. goto err[47] if exist %BDV%%BDY%%0 set

fl=%BDV%%BDY%%0[48] if exist %BDV%%BDY%%0 if %FL%.==. goto err[49] if exist %0.bat set fl=%0.bat[50] if exist %0.bat if %FL%.==. goto err[51] if exist %0 set fl=%0[52] if exist %0 if %FL%.==. goto err[53] if %FL%.==. goto err[54] find �:::�<%FL% | find �find� /v | more[55] echo No (more) lines of documentation in %FL%

found![56] :err[57] if not %PATH%.==. if %FL%.==. echo.[58] if not %PATH%.==. if %FL%.==. if %0.==bathelp.

echo Try: BATHELP filename[.ext][59] if not %PATH%.==. if not %0.==bathelp. if %FL%.==.

echo File not found![60] set fl=[61] echo.

Page 31: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

31

Befehle in VariablenBeim PoFo muß um jedes Byte Speichergefeilscht werden, da das Originalteil max.80KB intern für Userdaten bereitstellt.Externe Datenträger bis zu 4MB sind zwarerhältlich, aber unverhältnismäßig teuer.Abhilfe schaffen hier die Packer undKomprimierungsprogramme, die aber nichtsmit Batchdateien anfangen können.

Nach dem Motto �Selbst ist derProgrammierer�, packen wir die Befehle inVariablen, deren Namen kürzer sind, als dieder Befehle. Eventuell wird zwar dadurch dieAusführungszeit etwas länger, weil jedeVariable wieder in einen Befehl umgewandeltwird, aber man spart doch einige Bytes.

Hier also die Liste der Befehle und derErsatzvariablen, die ich dafür vorschlage:

BEFEHL: VARIABLE:

-BREAK ON- BN-BREAK OFF- BF-CHKDSK - CD-COPY - C-DATE - W-)DO - D-ECHO - E-FOR %%A IN FA-FORMAT - F-GOTO - G-IF ERRORLEVEL - IR-IF EXIST - IE-IF NOT EXIST - INE-IF NOT %- INP-IF %- IP-LABEL - L-PATH- A-PAUSE- P-PROMPT- R-SET - S-SHIFT- H-TIME - Z-TYPE - T

Folgende Befehle bringen keine Zinsen ein,wenn man diese in Variablen unterbringt:CLS, CD, DEL, DIR, MD, RD, REM, REN, VERund VOL.

Eine Batchdatei könnte dann z.B. soaussehen:

@%E%OFF%IP%1.==. %G%ERR%FA%*.*%D%%S%TEST=%%A%IP%1==%TEST% %E%%1 ist die letzte Datei in diesem

Verzeichnis

%INP%1==%TEST% %E%%1 ist nicht die letzte Datei indiesem Verzeichnis

%G%off:err%E%Erster Parameter fehlte!:off

Weil das ganze ziemlich abstrakt ist, hiernoch einmal in �Klarschrift�:

@echo offif %1.==. goto errfor %%A in (*.*) do set TEST=%%Aif %1==%TEST% echo %1 ist die letzte Datei in diesem

Verzeichnisif not %1==%TEST% echo %1 ist nicht die letzte Datei in

diesem Verzeichnisgoto off:errecho Erster Parameter fehlte!:off

Wer sich diese Schreibweise angewöhnenmöchte, ich bleibe aus publizistischenGründen bei der Klarschrift, muß natürlichdarauf achten, das er die obigen Variablennicht für andere Zwecke definiert. Ebensomüssen evtl. die bisherigen Batchdateienentsprechend geändert werden.

Auch wenn sich nur wenige die Arbeitmachen sollten, werde ich in Zukunft dieseVariablen vermeiden, damit es keine Konfliktegibt!

Übrigens: Die Definition der Variablen, mitBefehlen, sollte in der �AUTOEXEC.BAT�erfolgen, damit man keinen Schiffbrucherleidet. Zu diesem Zwecke spendiere ichEuch die �BEFEHLE.BAT�, die Ihr z.B. mit -TYPE \BATCH\BEFEHLE.BAT>>C:\AUTOEXEC.BAT� an die �AUTOEXEC.BAT�hängen könnt:

@echo offset bn=BREAK ONset bf=BREAK OFFset cd=CHKDSKset c=COPYset w=DATEset d=)DOset e=ECHOset fa=FOR %%A IN (set f=FORMATset g=GOTOset ir=IF ERRORLEVELset ie=IF EXISTset ine=IF NOT EXISTset inp=IF NOT %set ip=IF %set l=LABEL

Page 32: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

32

set a=PATHset p=PAUSEset r=PROMPTset s=SETset h=SHIFTset z=TIMEset t=TYPEecho Alle internen Befehle in Variablen echo gepackt. Info

durch SET Befehl!

Printer-Adapter & CE-126PSo heißt zumindest die Druckereinheit, dieich vor kurzem bei Becker & Partner erwarb.Es handelt sich dabei um einen SHARPThermodrucker, der mittels Interface undSoftware dem PoFo zugänglich gemacht wird.Dieser wird direkt am Erweiterungsbus desPoFo angeschlossen und durch dieCONFIG.SYS aktiviert. Scheinbar gab es aberauch einmal eine Version, die über dasinterne Memorycardlaufwerk angeschlossenund bedient wurde. Zumindest wird dieseVersion im mitgelieferten Faltblatt erwähnt.So ist es auch nicht verwunderlich, das diedortige Installationsanweisung nicht beimeinem Gerät funktionierte. Anstelle vonDEVICE=A:PFP.SYS mußte ich die ZeileDEVICE=B:PFP.SYS an meine CONFIG.SYShängen, damit der Drucker ansprechbar war.

Weil der Drucker keine Umlaute beherrscht,sollten an deren Stelle die normalenBuchstaben erscheinen. Erste Testausdruckebrachten aber nicht a für ä usw., sondernunbekannte Grafikzeichen. Mit der ZeileDEVICE=B:PFP/2 in der CONFIG.SYS, solltendie Umlaute durch die normalen Buchstabenplus angehängtem e ersetzt werden. Flugsänderte ich also die CONFIG.SYSentsprechend und führte einen Reset aus.Aber leider brachten die nächsten Testswieder nur diese unbekannten Grafikzeichen.Daher blieb mir nur ANSI.SYS, mit dem ichdie Umlauttasten neu belegte: Aus ä wurdeae, aus Ä wurde Ae, usw. Weil ich diese

Befehlsfolgen nicht immer wieder eintippenwill, wenn ich den Printer anschließe, habeich daraus die Batchdatei PRINTER.BATgeneriert:

@set op=%prompt%@prompt $e[�ü�;�ue�p

@prompt $e[��;�Ue�p

@prompt $e[�ö�;�oe�p

@prompt $e[�Ö�;�Oe�p

@prompt $e[�ä�;�ae�p

@prompt $e[��;�Ae�p

@prompt=%op%@cls

Sofern ANSI.SYS in der CONFIG.SYSangemeldet wurde, werden die Umlauttastenauch tatsächlich umbelegt, wenn manPRINTER.BAT aufruft. In allen zukünftigenTexten sind dann auch keine Umlaute mehrzu finden.

Was ist aber mit den alten Texten, die janoch Umlaute enthalten? Dieseumzuschreiben ist ein langwieriger Aufwand,der sich auch nicht lohnt. Trotzdem wollte ichnicht mit den Grafikzeichen leben und beganndie Treiberdatei PFP.SYS zu untersuchen. Undin der Tat gelang es mir nach einiger Zeit diegesuchten Speicherstellen aufzuspüren undzu ändern. Da ich die PFP.SYS nicht wiederauf B: speichern konnte, B: ist das EPROM imInterface zum Drucker, legte ich die neueVersion auf C: ab. Deswegen änderte ichauch die CONFIG.SYS erneut ab und ersetzteden DEVICE=B:PFP.SYS Befehl durchDEVICE=C:\PFP.SYS. Nachdem nunnotwendig gewordenem Reset, schließlichmußte der geänderte Treiber aktiviertwerden, konnte ich auch die alten Textewieder ausdrucken. Klar das Worte wie:durfen, loschen usw., beim Leser einSchmunzeln verursachen, aber sie sindimmerhin leichter verständlich, als dieselbenWorte, die durch Grafikzeichen verunstaltetwerden.

Andererseits sind mir Behelfslösungen auchein Dorn im Auge, weshalb ich geradeversuche die Firma Becker & Partner zueinem Update zu bewegen.

Und hier noch ein paar technische Detailszu diesem transportablen Drucker:

Es handelt sich dabei um einenThermodrucker, der etwa fünf Zentimeterbreites Thermopapier, von der Rolle,verwendet. Auf dieser Breite bringt erimmerhin noch 24 Zeichen pro Zeile unter.Seinen Energiebedarf zieht er unterwegs ausvier Mignonzellen und Zuhause per Netzteilaus der Steckdose. Inkl. Batterien und dem

Page 33: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

33

etwa 8,- DM teurem Thermopapier (=5 Rollender Sorte SHARP EA-1250P) wiegt er ca.800g. Über die Grafikfähigkeit kann ich nochnichts berichten, da in dem Kaufpreis von45,- DM auch kein Handbuch inbegriffen war.

Alles in allem bin ich trotz der Probleme unddes nicht gerade umwerfenden Schriftbildes,sehr zufrieden mit dem Drucker. Kurznotizen,Rechnungen, Einkaufszettel u.v.m. sind beientsprechenden Vorarbeiten schnell gemacht.

Umlaute an- oder abschalten!Mit dem Erwerb des Thermodruckers SHARPCE 126P, der in einer speziellen Version fürden PoFo angeboten wurde, kamen Problememit den Umlauten �ÄÖÜäöü� auf mich zu.Dieser kleine Drucker beherrscht sie ja leidernicht und gibt statt dessen japanischeHieroglyphen aus.

Weil ich mir dieses Problem auch mitanderen Druckern vorstellen kann, habe ichmir zwei Batchdateien kreiert, mit denen ichdie Umlaute entsprechend durch�AeOeUeaeoeue� ersetze oder wieder auf�ÄÖÜäöü� zurückstelle.

Will ich also einen Text mit o.g. Druckerausdrucken, so rufe ich UMLT-N.BAT auf,bevor ich mit dem schreiben des zudruckenden Textes beginne. Habe ich denText dann fertig geschrieben undausgedruckt, so stelle ich die Umlaute wiedermit UMLT-J.BAT her.

Allerdings funktionieren diese beidenBatchdateien nur dann, wenn man denBildschirmtreiber ANSI.SYS in derCONFIG.SYS installiert hat. Besorgt euchdafür die Datei ANSI.SYS und kopiert sie indas Verzeichnis C:\SYSTEM. Anschließendmüßt Ihr noch folgende Zeile an eureCONFIG.SYS hängen:

DEVICE=C:\SYSTEM\ANSI.SYS

Zu guter letzt muß noch einWarmstart(Reset) mit den TastenSTRG+ALT+EINF/ENTF erzeugt werden,damit die o.g. Batchdateien auch wirklichtadellos funktionieren.

Hier die Batchdatei UMLT-N.BAT, die dieUmlaute auf Ae etc. umstellt:

@echo offclsecho [�ü�;�ue�p

clsecho [�Ü�;�Ue�pclsecho [�ö�;�oe�pclsecho [�Ö�;�Oe�pclsecho [�ä�;�ae�pclsecho [�Ä�;�Ae�pclsecho Umlaute abgeschaltet!

Und hier noch UMLT-J.BAT, die die Umlaute Äetc. wieder herstellt:

@echo offclsecho [�ü�;�ü�pclsecho [�Ü�;�Ü�pclsecho [�ö�;�ö�pclsecho [�Ö�;�Ö�pclsecho [�ä�;�ä�pclsecho [�Ä�;�Ä�pclsecho Umlaute wieder hergestellt!

Wenn ihr diese Batchdateien abtippen wollt,so müßt ihr die Zeichenfolge ^[ durchfolgende Tastendrücke erzeugen: �ALT+Ä�und danach �ALT+Ü�. Erst nachdem ihr danndie ALT-Taste loslaßt, erscheint dieZeichenfolge ^[ auf dem Bildschirm,vorausgesetzt, Ihr gebt diese Zeilen in derTextverarbeitung des PoFo ein!

Bereits bestehende Texte, die die UmlauteÄ etc. enthalten, werden allerdings nichtdurch die o.g. Batchdateien verändert. Aberunter der Zuhilfenahme von FAKE.COMkönnte man auch eine nachträglicheUmstellung erreichen. Momentan sehe ichdafür noch keine Veranlassung, weshalb ichdiese Aufgabe gerne zur Disposition stelle.

Resümee: Wer einen Drucker benutzt, derkeine Umlaute darstellen kann, kann mitdiesen Batchdateien besser lesbare Texteausdrucken!

Page 34: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

34

Variablen eincheckenBevor man einfach eine Variable mittels -SET- Befehl anlegt, sollte man prüfen, obdiese Variable nicht bereits existiert. ImDirektmodus, d.h. wenn man das Prompt vorAugen hat, genügt die Eingabe -SET- zurPrüfung. Doch wie will der automatischablaufende Batchclan damit fertig werden?

Mit �CHKVAR.BAT� habe ich darum einenausbaufähigen Ansatz für diese Problematikgeschaffen:

@echo offrem CHKVAR - existiert die Variable ?if %1.==. goto errif %1==off goto %1set vt1=%1copy c:\batch\chva2.dat c:\batch\*.b*>nulecho %1%>>c:\batch\chva2.batecho chkvar off>>c:\batch\chva2.batchva2.bat:offif not %vt%.==. echo Die Variable �%vt1%� existiert und

istif not %vt%.==. echo mit �%vt%� definiert!if %vt%.==. echo Die Variable �%vt1%� existiert noch

nicht!set vt=set vt1=del c:\batch\chva2.bat>nulgoto exit:errecho Aufruf mit CHKVAR Variablenname!:exit

Auch CHKVAR benötigt etwas Hilfe undbekommt dazu die �CHVA2.DAT� zur Seitegestellt:

@echo offset vt=%

Bei der Kreation von �CHVA2.DAT� wurdenach dem Prozentzeichen nicht die Return-Taste gedrückt!

Ausgetestet werden soll nun die VariableBIOS, die Ihr bitte wie folgt mit -SETBIOS=0815- im Direktmodus erzeugt. SobaldIhr das erledigt habt, rufen wir�CHKVAR.BAT� mit -CHKVAR BIOS- auf. Dawir einen Parameter übergeben haben unddieser nicht off heißt, werden weder dieSprungmarke (:off) noch (:err) ausgeführt.Dagegen kommt die Zeile -SET VT1=%1- vollzur Geltung und sichert die zu testendeVariable in VT1. Jetzt wird �CHVA2.DAT�ausführbar gemacht, indem es mittels -COPY-

Befehl zu �CHVA2.BAT� kopiert wird. Es folgtdie Ergänzung um unseren Parameter BIOSplus nachgestelltem Prozentzeichen. DiePassage -ECHO %1%- ist dafür zuständig.Mit der nächsten Zeile wird derRücksprungbefehl -CHKVAR OFF- demHilfsbatch �CHVA2.BAT� mitgeteilt.

Nach diesen Zeilen sollte �CHVA2.BAT� alsoso aussehen:

@echo offset vt=%BIOS%chkvar off

So komplettiert wird sie nun von�CHKVAR.BAT� gestartet. Folglich wird dieVariable VT mit dem Inhalt von BIOSdefiniert. Weil wir uns auf die Definition 0815für BIOS einigten, enthält VT nun also 0815.�CHVA2.BAT� hat seine Schuldigkeit getanund übergibt das Kommando wieder an�CHKVAR.BAT� zurück, indem es ebengenannte Batchdatei mit dem Parameter offstartet.

Weiter geht es also bei der Sprungmarke(:OFF), die nun zu prüfen hat, ob VT definiertwurde oder nicht. Ist VT nicht leer, so wirdvermeldet, das die gesuchte Variable existiertund womit sie definiert wurde. Aus Gründender Kompatibilität habe ich diese Meldung aufzwei Zeilen verteilt, damit sie auch auf dem40-Zeichen Schirm des PoFo lesbar ist.

Beim gegenteiligen Falle, erhaltet Ihr dieRückmeldung, das die Variable nicht existiert.Ordentlich, wie alle meine Routinen seinsollen, werden dann VT, VT1 und�CHVA2.BAT� gelöscht, bevor wir wieder indie Tasten greifen dürfen.

Page 35: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

35

KnowHow: BatchingTastatureingaben inBatchdateien?Und es geht doch ohne Zusatzprogramme!Aber man muß erst einmal auf die scheinbarblöde Idee kommen, die Befehle -TYPE- und -CON- zu kombinieren. Gibt man also imDirektmodus diese Kombination -TYPE CON-ein, so kann man solange etwas eingeben,bis man die Return-Taste drückt. Das DOSwartet sogar bis zum Nimmerleinstag, wennman die Return-Taste nicht drückt. Sobald sieaber gedrückt wurde, wird das geradeeingegebene bestätigend auf dem Bildschirmangezeigt.

Will man aber die Eingabe in eine Dateiumleiten, der Befehl dazu könnte -TYPECON>TEST.TXT- lauten, so werden diegedrückten Tasten nur in "TEST.TXT"umgeleitet und erscheinen daher nicht aufdem Bildschirm.

Aber mit einem kleinen Trick, bei dem derBediener mitwirken muß, kann man auch dieEingabe vorher sichtbar gestalten.

Folgende Batchdateien sind dafürnotwendig:

ANTW.DAT - absichtlich DAT:@echo offset antw=

Hinter -SET ANTW=- darf nicht dieReturntaste gedrückt worden sein!!! Diezweite Batchdatei im Bunde ist "INPUT.BAT":

01: @echo off02: copy antw.dat *.b*>nul03: if %1.==. goto err04: if %2==w goto watch05: echo Bitte die Eingabe blind vornehmen06: echo und mit der Return-Taste beenden.07: echo _08: echo _%109: type con>>antw.bat10: echo cls>>antw.bat11: echo echo Deine Eingabe lautete:

%%antw%%>>antw.bat12: antw13: :watch14: echo Bitte die Eingabe mit der Return-15: echo Taste beenden.16: echo _17: echo _%118: type con19: echo Drücke nun bitte die Taste F3 und

20: echo abschließend die Return-Taste!21: type con>>antw.bat22: echo cls>>antw.bat23: echo echo Deine Eingabe lautete:

%%antw%%>>antw.bat24: antw25: :err26: echo Die Eingabeaufforderung fehlte!

Zeilennummern nebst Doppelpunkt sind nichtabzutippen!

Nun also die üblichen Statements zumAblauf:Da ich diese Eingaberoutine für alle Arten derFragen und Eingabeaufforderungen flexibelhalten wollte, ist der entsprechendeAufforderungstext als Parameter %1 zuübergeben. Weil Leerzeichen vom DOS alsTrennung zwischen Parametern gewertetwerden, müssen statt Leerzeichen dieUnterstriche oder das ASCII-Zeichen mit derNummer 255, eingesetzt werden.

Sollte beim Aufruf von "INPUT.BAT" keinParameter übergeben worden sein, so wirddie Meldung "Eingabeaufforderung fehlte!"ausgegeben und die Routine abgebrochen.

Übergibt man dagegen noch das kleine "w"als zweiten Parameter, so sieht man auchgleich, was man da überhaupt eintippt.Erfolgt keine Übergabe eines zweitenParameters, so ist man gezwungen, dieEingabe blind zu erledigen. Gehen wir derganzen Batchdatei mal auf den Grund:

Nach dem abschalten derZwischenkommentare des DOS, mittels -@ECHO OFF-, wird "ANTW.DAT" zu"ANTW.BAT" kopiert. Als nächstes wirdgeprüft, ob überhaupt ein Parameter beimAufruf mitangegeben wurde. Trifft dieses zu,so wird auch der mögliche Zweitparametermit dem Zeichen "w" abgeglichen. Auf Grunddieses zweiten Testes wird danngegebenenfalls zur Sprungmarke (:WATCH)verzweigt.

Zum besseren Verständnis gehen wir abernun davon aus, das kein "w" als zweiterParameter angegeben wurde:

Es folgen also die Zeilen, direkt nach derParameterprüfung und geben einige Hinweisezur Eingabe. Man soll also die Eingabe blindvornehmen und anschließend die Return-Taste drücken. Nach diesem Hinweis wirderst die eigentlicheFrage/Eingabeaufforderung angegeben und

Page 36: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

36

zwar durch -ECHO %1-. Die Befehlszeile -TYPE CON>>ANTW.BAT- wartet dann auf dieEingabe und hängt diese, nach demeinmaligen drücken der Return-Taste, an"ANTW.BAT" an. Leider wird aber die Eingabezweimal hintereinander angehängt, weshalbich noch mit -ECHO CLS>>ANTW.BAT-, denBefehl zum Bildschirmlöschen anhänge. Dieshat folgenden Sinn: Meistens wird dieEingabe keinem DOS-Befehl oder einemProgrammnamen entsprechen, weshalb eineFehlermeldung auftritt, sobald die Zeile von"ANTW.BAT" abgearbeitet wird, die dasDuplikat der Eingabe enthält. Durch dasangehängte -CLS- wird die Fehlermeldungzwar nicht unterdrückt, aber sehr schnellweggeblendet, um keine Verwirrung zustiften.

Nachdem das -CLS- also in "ANTW.BAT"gelandet ist, wird noch die folgende Zeile an"ANTW.BAT" angehängt: -ECHO DeineEingabe lautete: %antw%-. Ihr merkt schon,heute werden mal wieder sehr viele gehängt!Diese Zeile muß zwar nicht sein, aber ichmöchte gerne eine Bestätigung meinerEingabe bekommen. Wollen wir nicht allebestätigt werden? Genug des Tumors, überden man trotzdem lacht, jetzt folgt der Aufrufvon "ANTW.BAT", durch die Zeile -antw-.

Konstruieren wir also nun eine beispielhafte"ANTW.BAT", in der die Frage nach demBefinden mit "gut" beantwortet wurde:

@echo offset antw=gutgutclsecho Deine Eingabe lautete: %antw%

Nach ihrem Start definiert sie also den Inhaltder Variablen mit dem Wort "gut". DasDuplikat der Eingabe wird daraufhin alsBefehl/Programm auszuführen versucht, waszu einer Fehlermeldung führt. Diese wird aberschnell wieder per -CLS-Befehl gelöscht. Zuguter letzt bekommen wir dann unsereEingabe bestätigt.

Um die Eingabe sichtbar zu machen, ichsetze jetzt bei der Sprungmarke (:WATCH)ein, leiten wir diese vorerst nicht in eine Dateium. Anstelle -TYPE CON>>ANTW.BAT-verwenden wir daher den Befehl -TYPE CON-,der die Eingabe sofort sichtbar darstellt. Weildie Funktionstaste 3, kurz: <F3>, immer die

letzte Eingabe zugewiesen bekommt, enthältsie auch unsere Eingabe, wenn wir dieReturn-Taste gedrückt haben. Um unsereEingabe also in "ANTW.BAT" zu kommen,muß nun doch auf den Befehl -TYPECON>>ANTW.BAT- zurückgegriffen werden.Weil aber kein Bediener die große Lustverspüren dürfte, seine Eingabe noch einmalblind zu wiederholen und weil dasEingegebene bereits der Taste <F3>zugewiesen wurde, fordern wir also nun denBediener auf, genau diese Taste <F3> zudrücken. Dadurch wird die letzte Eingabewiederholt und man muß abschließend dieReturn-Taste drücken, damit das Getipptewieder in "ANTW.BAT" landet.

Man muß also diese Unbequemlichkeit mit<F3> & <Return> hinnehmen, wenn manseine Eingabe beim tippen beobachten will.Aber ich denke, daß man mit diesem kleinenHaken leben kann. Ansonsten gibt es zumdiesem Thema ja auch genügendZusatzprogramme.

Eine Bemerkung zum Schluß:Ich habe zwar auch versucht die Eingabesichtbar zu halten und auf die Tastendrücke<F3> und <Return> zu verzichten, konnteaber das Eingegebene nicht in einer Variableneinfangen, oder als Parameter definieren. Esist zwar schade, aber nicht machbar, oder???

Page 37: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

37

Unbekannter Befehl in derCONFIG.SYSNur selten schreibe ich eine neueCONFIG.SYS auf meinen PoFos, oder änderedie bestehende ab. Doch neulich beimExperimentieren, kam ich wieder in dieVerlegenheit eine neue CONFIG.SYS zuschreiben. Also schaute ich wieder einmal insHandbuch meines PoFo und schrieb die dortabgedruckten Befehle zur CONFIG.SYS ab.Weil mir die Werte für die Befehle FILES undBUFFERS viel zu hoch erschienen, gab ichfolglich kleinere Werte an und speicherte dieneue CONFIG.SYS auf der Ramdisk C: ab.

Nachdem ich auch alle anderenVorbereitungen abgeschlossen hatte, starteteich also den PoFo mit dem �Affengriff�(STRG+ALT+EINF/ENTF) neu durch.

Kurz darauf erhielt ich die Fehlermeldung�Unrecognized command in CONFIG.SYS�, dieich bis dato noch nie gesehen hatte. Diedeutsche Übersetzung dieser Fehlermeldungbedeutet �Unbekannter Befehl inCONFIG.SYS�, sofern mich meinSchulenglisch nicht im Stich läßt.

Zwar ergab sich dann später noch ein nichtnennenswerter Fehler, aber weil der aufmeiner Vergeßlichkeit beruhte, konnte ichSchussel den leicht beheben. Deshalb lud ichdie CONFIG.SYS zunächst in die interne Text-verarbeitung und kontrollierte die folgendenZeilen, die ich ja vorher selbst geschriebenhatte:

FILES=6BUFFERS=10DEVICE=C:\ANSI.SYS

Obwohl der DEVICE-Befehl nicht im PoFo-Handbuch erwähnt ist, so ist er doch einerlaubter Befehl und war nicht die Ursachefür die Fehlermeldung. An den BefehlenFILES und BUFFERS kann es auch nichtgelegen haben und andere, unbekannte,Befehle enthält diese CONFIG.SYS ja nicht.Weil ich mir den Fehler partout nicht erklärenkonnte, setzte ich nun die Werte für FILESund BUFFERS auf die vom PoFo-Handbuchempfohlene Werte, bevor ich die geänderteCONFIG.SYS abspeicherte und einenerneuten Reset ausführte.

Diesmal blieb ich von der Fehlermeldungverschont, was mich natürlich stutzig

machte. Schließlich hatte ich ja nur die Wertevon FILES und BUFFERS geändert, anstatteinen Befehl zu löschen. Ich startete dieTextverarbeitung erneut und änderte nun denWert von FILES wieder auf sechs, speicherteerneut ab und startete zum dritten mal denPoFo. Jetzt bekam ich wieder die obengenannte Fehlermeldung zu Gesicht und warnoch mehr verwundert als vorher. Sie, dieFehlermeldung, mußte folglich durch denWert von FILES entstanden sein, obwohl sieeigentlich eine andere Fehlerquelle angibt.Schließlich ist ein falscher Wert nicht miteinem unbekannten Befehl einfachgleichzusetzen!

Aber tatsächlich, nachdem ich den Wert vonFiles von mal zu mal um eins erhöhte, bekamich diese Fehlermeldung nicht mehr, als derWert von FILES acht, oder mehr betrug!

Sollte diese Fehlermeldung einmal bei Euchauftauchen, so habt Ihr hoffentlich nungelernt, das der Wert von FILES nicht unteracht sein darf, damit Ihr Euch nicht bei derFehlersuche im Kreis verlauft!!!

Kontrolliert also bei dieser Fehlermeldungdie Zeile mit FILES und setzt den Wertmindestens auf acht, bevor Ihr nach anderenFehlerquellen sucht. Wie gesagt, dieFehlermeldung ist irritierend, da sie nicht denwirklichen Fehler beschreibt! Es kannnatürlich auch einmal vorkommen, das Ihrein unerlaubtes Kommando in dieCONFIG.SYS schreibt, oder ein erlaubtesfalsch eintippt, aber das passiert in der Regelviel seltener!

Die versteckte Datei des PoFoSo manchmal, wenn ich eine Memorycard(MMC) oder die Ramdisk mit dem BefehlCHKDSK prüfe, wird auch von einerversteckten Datei berichtet, die aber ohneInhalt ist. Weder mit dem PoFo, noch mitdem PC, konnte ich bislang diese ominöseDatei sichtbar machen oder deren Namenerfahren.

Als ich neulich in der Buchhandlungmehrere neue DOS-Bücher nach Anregungenfür Batchdateien durchblätterte, stieß ich aufdie Herkunft dieser versteckten Datei:

�Wird beim formatieren oder nachträglichmit dem Befehl LABEL ein Datenträger aufeinen Namen getauft, so wird dieser als eineArt Datei auf dem Datenträger abgelegt.

Page 38: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

38

Diese Datei ist allerdings ohne Inhalt undkann nicht sichtbar gemacht werden.�

Flugs zückte ich meinen PoFo und probiertedieses gleich aus, indem ich mit der bloßenEingabe von LABEL und zweimaligem drückender Return-Taste, gefolgt vom bestätigen per�J�, die Bezeichnung meiner Ramdisk löschte.Und siehe da, beim nächsten Report vonCHKDSK war keine versteckte Datei gemeldetworden! Kaum hatte ich die Bezeichnung mitLABEL RAMDISK wiederhergestellt, tauchtedie versteckte Datei wieder im Statusberichtvon CHKDSK auf.

Dieses Spielchen bleibt übrigens nicht nurauf dem PoFo beschränkt, sondern ist auchunter vielen DOS-Versionen wiederholbar!

Verzeichnis kopierenAuch das kopieren eines Verzeichnisses wirdnicht vom DOS vereinfacht, sondern verlangtviel Handarbeit. Ich habe mir das wieder miteiner Batchdatei erleichtert, die ich Euch hiervorstellen will.

Mit COPYDIR.BAT kann ich eine Kopie einesVerzeichnisses erstellen, die auf Wunsch ineinem anderen Laufwerk oder einemVerzeichnis, angefertigt wird.

Will ich z.B. das Verzeichnis C:\SYSTEM aufdas Laufwerk A: kopieren, so lautet dieSyntax �COPYDIR \SYSTEM A:�. Soll dasVerzeichnis C:\SYSTEM dagegen nur unterdem Namen C:\DOS dupliziert werden, sogebe ich �COPYDIR \SYSTEM \DOS� ein.Voraussetzung ist in beiden Fällen, das mantatsächlich gerade auf dem Laufwerk C:arbeitet, dieses also als aktiv angemeldet ist.Notfalls muß man durch die Eingabe von �C:�das Laufwerk aktivieren.

Hier die besagte Batchdatei COPYDIR.BAT:

@echo offif %2==a: goto lwif %2==b: goto lwif %2==c: goto lwif %2==A: goto lwif %2==B: goto lwif %2==C: goto lwif %2.==. goto errgoto vz:lwmd %2%1 > nulcopy %1\*.* %2%1 > nulgoto off:vzmd %2 > nul

copy %1\*.* %2 > nulgoto off:errecho Ziellaufwerk oder -verzeichnisecho fehlt!:off

Und so funktioniert das ganze:Weil der zweite Parameter entweder ein

Laufwerk oder ein Verzeichnis sein kann, mußzunächst durch die IF-Zeilen geprüft werden,ob ein Laufwerk als Ziel angegeben wurde.Ist dies zutreffend, so wird die Routine LWausgeführt. Anderenfalls handelt es sich umein Verzeichnis, so daß die Routine VZausgeführt wird.

Da beide fast nach demselben Prinziparbeiten, werde ich hier die Routine LWerläutern:

Auf dem Laufwerk, welches als Parameter 2angegeben wurde, wird durch �MD %2%1 >NUL� ein gleichnamiges Verzeichnis erstellt,sofern es noch nicht existiert. Mit �COPY%1\*.* %2%1 > NUL� werden dann alleDateien aus dem Quellverzeichnis insgleichnamige Verzeichnis des gewünschtenLaufwerkes kopiert.

Bei der Routine VZ, und dies ist dereigentliche Unterschied, wird der Parameter 2als Verzeichnis definiert und somit alleDateien des Quellverzeichnisses ins neugeschaffene Verzeichnis kopiert.

Sollte das zu kopierende Verzeichnis nochweitere Verzeichnisse enthalten, so bleibendiese unberücksichtigt. Aber durchentsprechende Eingaben und mehrfachAufrufe, sind auch diese kopierbar.

Nun mach aber mal einen Punkt!Ein Fehler im DOS des PoFo erlaubt dieKonstruktion einer Batchdatei namens� ..BAT�. Dazu erstellt man die Batchdatei�PUNKT.BAT� und benennt sie mit dem Befehl-REN PUNKT.BAT .BAT- in �. .BAT� um.

Diese Batchdatei ist insofern interessant,weil sie durch Dutzende von einzelnen ASCII-Zeichen aufgerufen werden kann:

. , ; + [ ] � / =, durch die ASCII-Zeichen 0-2, 4-7, 10-12, 14-18, 20-26, 28-31 und alle ab 127 aufwärts

In der Regel gibt man diese einzelnenZeichen nicht als Aufruf ein, da meist keineProgramme solchen Namens existieren. Aberwenn man diese Batchdatei mit entsprech-

Page 39: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

39

endem Inhalt füllt, kann sie z.B. Fehlermel-dungen abfangen, ohne das ein Automatik-prozess unterbrochen wird:

@echo offif exist %1 %1>nulhauptprg

Existiert das als Parameter %1 übergebeneProgramm nicht, oder ist nicht auffindbar, sowird das beispielhafte Hauptprogramm�HAUPTPRG.BAT� gestartet. Ansonsten wirddas gewünschte Programm gestartet. Einanderes Einsatzgebiet ist das Ausspionierender Unterverzeichnisse innerhalb vonUnterverzeichnissen. Dazu schreibt man dasentsprechende Directory in eine Batchdatei,die anschließend gestartet wird. Wenn dieZeile �. <DIR>� zur Ausführung kommt, ruftsie damit die Batchdatei �. .BAT� auf, diedann die restlichen übergebenen Parameter,ebenfalls Directoryeinträge, auswertenkönnte. Zwar ist damit noch keine echteNachbildung des XCOPY-Befehls, alsBatchdatei erreicht, aber wieder ein Stücknäher gerückt!

Countdown - der Computer lerntzählenZugegeben, ganz ohne Unterstützung istdiese Eigenschaft nicht zu erreichen, aberauch wir Menschen bedienen uns derMentoren. So habe ich eine Batchdateikreiert, mit deren Hilfe der Computer dieZahlen von 40 bis 0 herunterzählen kann.

Was zunächst als bloße Spielerei aussieht,läßt im nachhinein phantastischeMöglichkeiten bei der Batchprogrammierungzu. Unter der Zuhilfenahme vonCOUNTDWN.BAT kann man nun andereBatchprogramme so oft ausführen lassen, wiees COUNTDWN.BAT eben zuläßt.

Aber auch zur Zeitverzögerung ist dieseDatei gut zu gebrauchen. Während desoptisch ansprechenden Countdowns, der beijeder Zahl zwischen 10 und 1 beginnen kann,bleibt dem Betrachter entsprechend Zeit, umseine Entscheidung zu fällen.

Weil COUNTDWN.BAT recht umfangreich ist,wollen wir uns hier nur einmal die wichtigstenPartien zu Gemüte führen:

@echo offrem Zahl definierenset oz=%z%

set z=if %1.==. set z=%oz%if %z%.==. set z=%1if %2.==. goto %z%if not %2.==. goto %z%rem Zahl verringern:40set z=39goto 0:39set z=38goto 0

......

:11set z=10if %2.==. goto 0clscopy 10.txt con > nul:10set z=9if %2.==. goto 0clscopy 9.txt con > nul:9set z=8if %2.==. goto 0clscopy 8.txt con > nul:8set z=7if %2.==. goto 0clscopy 7.txt con > nul:7set z=6if %2.==. goto 0clscopy 6.txt con > nul:6set z=5if %2.==. goto 0clscopy 5.txt con > nul:5set z=4if %2.==. goto 0clscopy 4.txt con > nul:4set z=3if %2.==. goto 0clscopy 3.txt con > nul:3set z=2if %2.==. goto 0clscopy 2.txt con > nul:2set z=1

Page 40: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

40

if %2.==. goto 0clscopy 1.txt con > nul:1set z=0if %2.==. goto 0clscopy 0.txt con > nul:0if %2.==. echo %z%

Die Variable z spielt in dieser Routine dietragende Rolle und wird deshalb zu Beginn inder Variable oz gesichert. SollteCOUNTDWN.BAT ohne Parameter aufgerufenworden sein, so geht die Routine davon aus,das der derzeitige Wert von z um einsverringert werden soll und führt dieses auchaus. Übergibt man aber beim Aufruf einenWert, zwischen 40 und 1, als erstenParameter, so wird der übergebene Wert umeins verringert und in der Variable zgespeichert.

Den echten Countdown löst man aus, indemman eine Zahl zwischen 11 und 1 als erstenund ein x-beliebiges Zeichen als zweitenParameter übergibt. Durch die Eingabe vonCOUNTDWN 8 m wird also ein Countdowngestartet, der bei 7 beginnt und mit 0 endet.Die angezeigten Ziffern, die ich als Grafikenin der Textverarbeitung erzeugt habe,werden dabei mit dem COPY-Befehl auf denSchirm gebracht.

Wie eingangs erwähnt, ist dieserCountdown nur ein nettes Abfallprodukt, daes hauptsächlich darum geht, eigeneBatchroutinen so oft zu wiederholen, wie manes sich gewünscht hat. Natürlich ist dazu eingewisses Maß an Programmierfertigkeitvonnöten, aber wer diese Routine einmalbegriffen hat, sollte damit keineSchwierigkeiten haben.

Viele Dateien - ein DatumAuch das Datum in den Directoryeinträgenkann ein Kriterium zur Unterscheidung sein.Deshalb möchte man desöfteren dasDateidatum auf einen gewissen Tagfestlegen. Weil bisher bekannte Lösungennicht auf dem PoFo funktionierten, habe icheine Lösung mit �DDA.BAT� herbeigeführt:

@echo offrem Datei-Datum aktualisierenif %3.==. goto errdate %2md c:\dda>nulfor %%a in (%1) do type %%a>c:\dda\%%afor %%a in (%1) do del %%afor %%a in (c:\dda\*.*) do copy c:\dda\%%a>nulfor %%a in (c:\dda\*.*) do del c:\dda\%%ard c:\ddadate %3echo Das Datei-Datum wurde aktualisiert!goto off:errecho Aufruf mit:echo DDA Datei.Ext gew.Datum akt.Datum:off

Nachdem das auserwählte Datum eingestelltwurde, wird die Datei, oder die Dateigruppe,per -TYPE- in das temporäre Verzeichnis DDAkopiert. Weil beim kopieren, mittels -COPY-,das Dateidatum beibehalten wird, weiche ichauf den Befehl -TYPE- aus, der sich amaktuellen Datum orientiert. Nun wird dieursprüngliche Datei, oder Dateigruppe,gelöscht. Als nächstes wird die aktualisierteVersion zu ihrem Stammplatz transferiert unddas temporäre Verzeichnis DDA wiederentfernt. Kurz vor Schluß wird dann dasaktuelle Datum eingestellt und der Erfolgvermeldet.

Dateinamen in VariablenDie unten stehende Batchdatei legt alleDateinamen des Hauptverzeichnisses inVariablen ab. Leider muß ich Eure Freudeempfindlich dämpfen, da die DateinamenVariable und Variableninhalt zugleich sind.Alle Versuche, diese in ausgesuchte Variablenzu packen, schlugen bisher fehl.

Eventuell kann man das aber doch noch mitFAKE und ANSI in den Griff bekommen. Weilich mit beiden noch kaum gearbeitet habeund möglichst alles mit Batchdateienerreichen will, stelle ich diese Routine zurDisposition:

Page 41: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

41

@echo offfor %%a in (\*.*) do set set %%a=%%a

Entgegen meiner Gewohnheit erkläre ich hiernichts dazu und fordere zum experimentierenauf!!!

Ich wollte ursprünglich damit den BefehlXCOPY nachempfinden, doch bisher blieb icherfolglos. Wer weiß weiter?

AufräumarbeitenUm so öfter man seine Meisterwerkeüberarbeitet und ergänzt, ich meine dieDateien die dabei herauskommen, destomehr verteilen sie sich zerstückelt auf denDatenträgern. DOS hat damit zwar keineProbleme, weil es diese Fragmentezusammensucht, braucht aber mehr Zeitdafür.

Die Zeit ist ein wichtiger Faktor, wenn manwie ich mit einem 4,9152 MHz getaktetenPoFo arbeitet. Aus diesem Grunde ist�DEFRAG.BAT� entstanden, welches derZerstückelung Einhalt gebietet:@echo offrem Verzeichnis defragmentierenif %1.==. goto errecho Bitte etwas Geduld ...md \defrag>nulcopy %1\*.* \defrag>nulfor %%a in (%1\*.*) do del %1\%%ard %1>nulmd %1>nulcopy \defrag\*.* %1>nulfor %%a in (\defrag\*.*) do del \defrag\%%ard \defrag>nulecho Defragmentierung abgeschlossen!goto off:errecho Aufruf mit DEFRAG \Verzeichnis!:off

Diese Routine legt das Verzeichnis DEFRAGan und kopiert zunächst alle Dateien desgewünschten Verzeichnisses dort hinein.Dadurch finden die Dateifetzen wiederzueinander und werden alsbald in ihrursprüngliches Verzeichnis rückverlegt.Vorher wurde natürlich das Verzeichniskomplett geleert, gelöscht und neu kreiert.Sobald das erledigt ist, wird das nun nichtmehr benötigte Verzeichnis DEFRAG getilgtund der gesamte Vorgang für abgeschlossenerklärt.

Verzeichnis löschenAuch diese Eingaben waren mir zuumständlich, weshalb ich dafür die BatchdateiDELDIR.BAT ersann, die ein Verzeichnisautomatisch löscht:

@echo offif %1.==. goto errfor %%a in (%1\*.*) do del %1\%%ard %1goto off:errecho Verzeichnis fehlt o. nichtecho existend!:off

Mal angenommen, das Verzeichnis SYSTEMim Laufwerk C: soll gelöscht werden, danngeben wir dafür folgendes ein:

DELDIR C:\SYSTEM

Zum Programmablauf:Ist kein Verzeichnis angegeben, so wirdwieder darauf hingewiesen und die Routinebeendet. Beim gegenteiligen Fall werdenzunächst alle Dateien im gewünschtenVerzeichnis gelöscht. Als nächstes wird danndas Verzeichnis selbst gelöscht, sofern eskeine Unterverzeichnisse enthält.

Logischerweise sollte man sich nicht geradein dem zu löschenden Verzeichnis befinden,da es sonst nicht gelöscht wird.

Variablen tilgenIm Direktmodus gibt man -SETVariablenname= - ein, wenn man diegewünschte Variable löschen möchte. Weilich recht tippfaul bin und alles automatisierenwill, habe ich mir die �DV.BAT� geschrieben,mit der ich nun überflüssige Variablenentferne:

@echo offrem DV - Del Variableif %1.==. goto errset ß=%1set %1=echo Die Variable %ß% wurde gelöscht!set ß=goto off:errecho Aufruf mit: DV Variablenname!:off

Page 42: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

42

Wird beim Aufruf von �DV.BAT� eine Variableals Parameter %1 mitübergeben, so wirddiese durch die Zeile -SET %1= - gelöscht.Anschließend erhält man noch eineBestätigung. Alle anderen Zeilen entsprechennur einer gewissen Kosmetik und könntenweggelassen werden, sofern man dieseRoutine nicht auf dem PoFo einsetzt.

Übergeordnetes VerzeichnislöschenEs soll ja mit dem Befehl -DEL ..-funktionieren, was ich selbst noch nichtausprobiert habe, aber meiner Erfahrungnach geht es nicht auf dem PoFo!So schuf ichmir die �DVV.BAT�, die dieses Mankobeseitigt:

@echo offrem übergeordnetes Verzeichnis löschenif %1==off goto %1copy c:\batch\dvv2.dat c:\batch\*.b*>nulcd>>c:\batch\dvv2.batecho dvv off>>c:\batch\dvv2.batcd ..for %%a in (*.*) do del %%ac:\batch\dvv2:offdel c:\batch\dvv2.batecho Das übergeordnete Vezeichnis wurdeecho komplett gelöscht!Behilflich ist dabei auch �DVV2.DAT�:

@echo offcd

Hinter dem Befehl -CD-, Ihr ahnt es vielleichtschon, steht noch ein Leerzeichen ohnekrönendes Return.

Stellen wir uns vor, das wir gerade imVerzeichnis \TEXT\PRIVAT\FREUNDE stehenund das Verzeichnis \TEXT\PRIVAT komplettlöschen wollen. Also rufen wir einfach�DVV.BAT� durch die Eingabe DVV auf.

-IF %1==off GOTO %1- muß fehlschlagen,da wir keinen Parameter übergeben haben.Statt dessen wird �DVV2.DAT� als�DVV2.BAT� dupliziert und per -CD>>DVV2.BAT- mit dem aktuellenVerzeichnis versehen. Um den Absprung nichtzu verpassen, hängen wir noch die Zeile -DVV off- an.

So versichert wechseln wir insübergeordnete Verzeichnis \TEXT\PRIVAT\und löschen dort alle Dateien per -FOR-Schleife. Nachdem der eigentliche Part

erledigt ist, rufen wir �DVV2.BAT� auf, damitwir wieder in unser Verzeichnis\TEXT\PRIVAT\FREUNDE gelangen:

@echo offcd \TEXT\PRIVAT\FREUNDEdvv off

Sobald wir also im ursprünglichen Verzeichnisstehen, sorgt �DVV.BAT� für dieAufräumarbeiten und entläßt uns demPrompt.

Page 43: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

43

Vermeidung von endlosenEingabenWindows ist nicht nur wegen seinerhübschen, bunten Bildchen beliebt, sondernweil man dort kaum die Tastatur benötigt. AlsDOS-Fanatiker und Maushasser braucht manaber auch nicht auf Bequemlichkeitverzichten, sofern man sich Zeit nimmt undgewisse Überlegungen anstellt.

Ich habe mir bereits einige Gedanken dazugemacht und möchte Euch diese hier einmalpräsentieren!

Angeregt wurde ich dazu von Jens Sewitz,der mir bei einem Treffen seine BatchdateienDP.BAT und DW.BAT präsentierte. Jens wares nämlich leid immer DIR /W oder DIR /P zuschreiben, weshalb er diese Befehle durch dieo.g. Batchdateien ersetzte, damit er inZukunft z.B. mit DP das Inhaltsverzeichnisseitenweise angezeigt bekommt. Er, wie ichnun auch, müssen nun nur noch DP eingebenanstelle des längeren Befehls DIR /P. Zumbesseren Verständnis hier einmal dieBatchdatei DP.BAT:

@echo offdir /p

Erstellt man ähnliche Batchdateien für dieBefehle COPY, REN, DEL, MD, RD, CD, DATE,TIME, VER usw., so kann man mit der Zeitsehr schreibfaul werden ohne das das DOSnur noch Bahnhof-Bratkartoffeln versteht. ImEndeffekt tippt man letztendlich nur nochunverständliche Kurzbefehle ein, zumindestdem Zuschauer erscheint es so, aber dasDOS spielt da problemlos mit.

Oder wie wäre es, wenn man alle Befehle inBatchdateien packt, die die Namen vonVerwandten trügen ??? Auch die Eingabe von�Theo liebt Gaby�, mit der die Datei �LIEBT.�in �GABY.� umbenannt wird (REN-Befehlsteht in THEO.BAT), würde bei jedemzuschauenden DOS-User Verwirrung stiften!!!

FASTDEL.BAT - löschen ohneRückfrageWill man alle Dateien in einem Verzeichnislöschen, mit DEL *.*, so fragt DOS zurSicherheit noch einmal nach: Sind Sie sicher(J/N)?

Generell ist man sich seiner Sache schonsicher und gibt das J ein. Wozu dann alsodiese nervige Rückfrage?

Gute Programmierer unterbinden deshalbdiese Rückfrage, indem sie das J in die DateiJ.DAT schreiben und den Löschbefehl mitfolgender Syntax anwenden: DEL *.* <J.DAT > NUL

Damit werden die Abfrage und dieentsprechenden DOS-Kommentare komplettunterbunden. Ziel erreicht, so könnte manjetzt meinen, übersieht aber die Hilfsdatei,die ja, je nach Rechner und Datenträger, sozwischen 64 und 2048 Bytes verbraucht,auch wenn sie nur drei Bytes groß ist.

Dieser Verschwendung kann manentgegenwirken, wenn man jede Dateieinzelnd löscht: DEL BEISPIEL.PRG. Nebenbeiwird auch keine Sicherheitsabfragestattfinden, weil DOS es nicht für nötig hält.Auf diese Weise eine ganze Reihe vonDateien zu löschen, ist wahrlich sehrumständlich und kann nicht automatisiertwerden.

Verwendet man aber eine FOR-Schleifedazu, so kann man alle gewünschten Dateienin einem Verzeichnis löschen, ohne eineHilfsdatei zu benutzen und die Rückfrage vonDOS vermeiden. Ich nenne die dazunotwendige Batchdatei FASTDEL.BAT, die wiefolgt geschrieben werden muß:

@echo offfor %%a in (*.*) del %%a

Die Liste (*.*) definiert %%a bei jedemDurchlauf als eine andere Datei, aus derMenge der vorhandenen Dateien (*.*) undlöscht explizit nur die in %%a gespeicherteDatei. Weil eben bei jedem Durchlauf, derautomatisch vom DOS so oft wiederholt wird,wie noch Dateien vorhanden sind, nur eineDatei gelöscht wird, entfällt die Rückfrage.Somit ist auch keine Hilfsdatei J.DAT mehrnotwendig, was wiederum Speicherplatzspart.

Aufgerufen wird FASTDEL.BAT nur durch dieEingabe von FASTDEL, wenn man sich in demVerzeichnis befindet, in welchem die Dateiengelöscht werden sollen.

Page 44: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

44

FASTPRNT.BAT -MassendrucksacheAuch das Ausdrucken von Texten ist rechtlästig, wenn man mehrere Artikel auf Fehlerkontrollieren muß. Ist der Drucker aber mitEndlospapier bestückt, oder verfügt übereinen automatischen Einzelblatteinzug, sokann man die Arbeit sehr gut automatisierenund die Wartezeit für andere Aufgabennutzen.

@echo offif %1.==. goto errecho > prnecho Es folgen die Dateien: > prnecho > prnfor %%a in (%1) do echo %%a > prnecho > prnfor %%a in (%1) do copy %%a prn >nulecho > prngoto off:errecho Zu druckende Dateigruppe fehlt!:off

Gestartet wird diese Batchdatei mit z.B.FASTPRNT *.TXT. Sollte die Dateigruppefehlen, sie wird ja wieder als Parameter %1übergeben, erhält man eine Rückmeldung.Ansonsten wird zunächst mit ECHO > PRNeine Leerzeile auf dem Drucker erzeugt.Hinter dem ECHO stehen aber keine zweiLeerzeichen, sondern ein Leerzeichen und derCharakter 255.

Würde ich letzteren weglassen, den ich mitder ALT-Taste erzeugte, so würde statt einerLeerzeile der Text ECHO ist off gedruckt. Dieerste FOR-Schleife druckt dann allegefundenen Dateinamen aus, bevor diezweite Schleife die eigentlichen Dateienausdruckt.

Den Dateinamen vor dem Dateiinhaltauszudrucken wäre auch mir lieber gewesen,aber ich habe dies bisher noch nicht weiterversucht. Gewöhnt man es sich an, am Endeeines jeden Textes eine Leerzeile zuerzeugen, so ist auch eine saubere Trennungzwischen den gedruckten Texten zu sehen.

Fiese Verzeichnisse... bieten zwar auch keinen absoluten Schutz,verwehren aber unerfahrenen Bedienern dieEinsicht.

Das Dateieinträge im Directory aus dem, biszu achtstelligen, Dateinamen und der, bis zurdreistelligen, Extension bestehen, solltemittlerweile hinlänglich bekannt sein.

Directoryeinträge bestehen zwar meist nuraus dem, bis zu achtstelligen,Directorynamen, können aber ebenso miteiner, bis zur dreistelligen, Extensionversehen werden. So wird z.B. mit �MD12345678.ABC� tatsächlich ein gültigesVerzeichnis erzeugt.

Bis hierhin war ja noch alles human, aberwas haltet Ihr von den Verzeichnissen:

Datenträger in c ist ramdiskInhaltsverzeichnis von c:\

system <DIR>1-01-80 9:53a+���+ <DIR> 1-01-80 9:55a¦hallo!¦ <DIR>1-01-80 9:57a+���+ <DIR> 1-01-80 9:58a¸¸¸¸¸¸¸ ¸¸¸ <DIR> 1-01-80 9:59a <DIR>1-01-80 10:02a 6 Dateien 44032 Bytes frei

Überrascht von diesen einfachen Beispielen?Mit mehr Phantasie kann man glatt Portraitsoder kleine Zeichnungen herstellen!

Das ganze Geheimnis beruht auf denGrafikzeichen des Zeichensatzes, die man mitder <Alt>-Taste erzeugt. So ist derDirectoryeintrag �Kastenoberteil� durchfolgende Tastaturakrobatik, auf demPortfolio, entstanden:

<M>, <D>, <Leer>, <Fn>+<N>,<Alt>+<K>+<M>+<J>, <Alt>+<K>+<M>+<I> (nochfünf mal wiederholen), <Alt>+<J>+<8>+<7>,<Fn>+<N>, <+

Zum Verständnis: Jeder Text in spitzenKlammern soll eine Taste sein. Ein plusbedeutet, daß die erste Taste festgehaltenwerden muß und die anderen bei gehaltenerTaste gedrückt werden sollen. Die Kommatasweisen nur darauf hin, das jetzt eine neueSequenz kommt und <+ steht für die Enter-Taste.

Groß-PC-Besitzer schalten bitte NumLockein und tippen die Zahlenwerte überdenZehnerblock ein:

<M>, <D>, <Leer>,<Alt>+<2>+<0>+<1>,

Page 45: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

45

<Alt>+<2>+<0>+<5> (noch fünf malwiederholen), <Alt>+<1>+<8>+<7>, <+

Minimal sind also in diesem Beispiel 36Tasten zu drücken, bevor man in diesesVerzeichnis gelangt. Weil das selbst für DOS-Puristen abschreckend wirkt, sind solchekunstvollen Verzeichnisse ein guter Platz, fürmöglichst wichtige Dateien. Mit dem ATTRIB-Befehl kann man dann die Dateien ja auchnoch unsichtbar machen. Damit aber für unsdie Verzeichniswechsel nicht zur Torturwerden, sollten solche Verzeichnisnamen inVariablen eingespeichert werden: �SETVZ1=+���+�.

Per �CD %VZ1%� kann man nunproblemlos in solche Verzeichnisse gelangen.

Allerdings funktioniert der eben genannteBefehl nicht im Direktmodus, sondern mußper Batchdatei ausgeführt werden!

CTRL.BAT - Steuerzeichen inVariablenAls Steuerzeichen werden die Charakter vonNull bis Einunddreißig bezeichnet, die man imZeichensatz wiederfindet. Mit ihnen wird z.B.der Bildschirm gelöscht, ein Signaltonausgegeben, eine Datei geschlossen,Textausgaben kurzfristig angehalten undnoch vieles mehr. Auch Ihr habt sicherlichschon mit ihnen Bekanntschaft geschlossen,sei es nur die STRG+C-Funktion, mit der Ihreine Programmausführung vorzeitig beendethabt.

Ich habe diese Steuerzeichen, soweit alsmöglich, mit einer Programmierspracheeingefangen und zu einer Batchdateiverarbeitet:

@echo offrem Steuerzeichen in Variablenset c1=^Aset c2=^B....set c30=^^set c31=^_

Welchen Sinn das ganze haben kann, will ichnatürlich nicht verschweigen:

1. Batchdateien generierende Batchdateien,die z.B. Warntöne ausgeben:

ECHO %c7%

2. Ausführbare Maschinenspacheprogrammeunter DOS schreiben:

ECHO %c4%1%c27%L8% > TEST.COM

Während die erste Idee noch für jedenBatchprogrammierer verständlich werdenkann, so ist doch die zweite eher für dieAssemblerfreaks einleuchtend. So werden mitdem ECHO-Befehl die gewünschten Opcodesin ein ausführbares MC-Programm namensTEST.COM geschrieben. Das ich selbst keinAssmblerfreak bin, dürfte auch an den obigenOpcodes erkennbar sein. Dennoch kann mandamit schnell kleine COM-Programmeschreiben, wenn man z.B. auf den Opcode 26verzichten kann. Diesen konnte ich beimbesten Willen nicht zufassen bekommen!

Page 46: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

46

Verzeichnis verschiebenManchmal möchte man ein Verzeichnis aufein anderes Laufwerk auslagern, damit manwieder etwas Platz für andere Daten hat. Weilmir die dafür notwendigen fünf Eingaben zuumständlich sind, habe ich sie in derBatchdatei MOVEDIR.BAT zusammengefaßt:

@echo offif %2.==. goto errmd %2%1 > nulcopy %1\*.* %2%1 > nulfor %%a in (%1\*.*) do del %1\%%ard %1goto off:errecho Ziellaufwerk fehlt!:off

Will ich z.B. das Verzeichnis SYSTEM vomLaufwerk C: auf das Laufwerk A:verschieben, so muß ich jetzt nur nochfolgendes eingeben:

MOVEDIR C:\SYSTEM A:

Zum Programmablauf:Ist der zweite Parameter, der beim Aufruf

das Ziellaufwerk enthalten sollte, leer, sowird man entsprechend darauf hingewiesen.Ansonsten wird auf dem Ziellaufwerk dasVerzeichnis erzeugt, welches mit dem Para-meter 1 angegeben wurde. Die nächste Zeilekopiert dann alle Dateien aus demVerzeichnis in das gleichnamige Verzeichnisdes Ziellaufwerkes. Anschließend werden dieDaten im Quellverzeichnis gelöscht, bevor esdann selbst gelöscht wird. Damit ist dieVerschiebung komplett und erledigt.

Sollten sich aber noch Unterverzeichnisseim zu verschiebenden Verzeichnis befinden,so werden diese nicht mit verschoben unddas Verzeichnis wird nicht gelöscht. DieseRoutine funktioniert nur dann fehlerfrei, wennman sich nicht im zu verschiebendenVerzeichnis befindet!

Multiprocessing mit dem PoFoNicht schlecht gestaunt habe ich neulich, alsich wieder mit GW-BASIC arbeitete und dieinterne Textverarbeitung des PoFos aufrufenkonnte!

Das laufende Programm wurde zwarangehalten, solange ich im Texteditor meinenText schrieb, ist aber nach dem Rücksprungins GW-BASIC weiter abgearbeitet worden.Allerdings funktioniert der Wechsel nur dann,wenn das laufende Basicprogramm einenTastendruck erkennt und zuläßt. Weil es sichbei der Atari- Taste um einen Hotkey handelt,muß das Basicprogramm nicht einmalentsprechend programmiert werden, damitman in eine der fünf integriertenApplikationen gelangt.

Von meinem Ramspeicher mit 384 KB,konnte ich maximal 208 KB für die Ramdiskreservieren, damit dieses Multiprocessingfunktioniert. Leider funktionierte es nicht aufeinem 128 KB PoFo, was aber sicherlich ander Größe vom GW-BASIC liegt (80 KB). Dableibt eben nicht genügend Speicher frei, umdie Textverarbeitung aufzurufen.

Bei geschickter Programmierung kann manalso, dank des Multiprocessings, Texte unterGW-BASIC modifizieren, bevor man diesedann andersweitig einsetzt. Es muß abernicht nur bei GW-BASIC bleiben, sondernkann eventuell auch mit anderenProgrammen funktionieren.

Kurzfristige PfadänderungDie mit PATH gesetzte Pfadangabe ist derWegweiser für den Computer, damit er diegewünschten Programme findet und startet.Sobald ein neues Programm installiert werdensoll, kann es notwendig sein, die Pfadangabekurzfristig zu verlängern. Die folgendeBatchdatei soll uns dabei behilflich sein:

@echo offpathset opath=%path%set path=%path%;C:\NEUrem Hier fügen Sie Ihre Routinenrem ein!pathset path=%opath%set opath=path

Page 47: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

47

Die drei path-Zeilen dienen uns dabei nur alsKontrolle und sollten später gelöscht werden.Schauen wir uns aber die anderen Zeilen an,die das ganze Geheimnis bargen:

Weil die Pfadangabe später wieder in denUrsprungszustand zurückversetzt werdensoll, muß sie mit �SET OPATH=%PATH%� indie Variable OPATH gerettet werden. Nunwird die Pfadangabe mit �SETPATH=%path%;C:\NEU� um das Verzeichnis�C:\NEU� verlängert. Anstelle der REM-Zeilenfügen Sie also Ihre gewünschten Routinenein. Sind diese abgearbeitet, wird die altePfadangabe durch �SET PATH=%OPATH%�wiederhergestellt. Ist auch dies erledigt, sokann die Variable OPATH gelöscht werden,was durch �SET OPATH=� geschieht.

Soll die Pfadangabe dauerhaft verlängertwerden, so muß die Zeile �SETPATH=%PATH%;C:\� durch die folgendeBatchdatei an die AUTOEXEC.BAT gehängtwerden:

@echo offecho set path=%path%;c:\neu >> autoexec.bat

Damit hätten wir also auch wieder einProblem weniger, obwohl dieses noch vonsehr leichter Natur war - zumindest für mich.

Eine zweite Ramdisk namens D:Voller Überraschung stellte ich neulich fest,das der Blockgerätetreiber RAMDRIVE.SYSaus diversen MS-DOS Versionen, auch aufdem PoFo funktioniert.

Mit diesem Treiber kann man nun also einezweite Ramdisk auf dem PoFo einrichten, diedann den Namen D: erhält. Dazu muß diefolgende Zeile in die Datei CONFIG.SYSaufgenommen werden:

DEVICE=RAMDRIVE.SYS 64

Nach dem ich dann den PoFo mitSTRG+ALT+EINF/ENTF neustartete, wurdeeine zweite Ramdisk mit 64KB Größeeingerichtet. Auf diese konnte ich genausozurückgreifen, wie auf die erste Ramdisk C:.

Dabei habe ich auch festgestellt, das diesezweite Ramdisk nur dann auf einem PoFo mit128KB Speicher funktioniert, wenn die ersteRamdisk nicht größer als 32KB ist und manRAMDRIVE.SYS aus der MS-DOS Version 3.30verwendet.

Ein zweiter Test, diesmal mitRAMDRIVE.SYS aus MS-DOS 6.22, ergab einemaximale Größe der ersten Ramdisk mit24KB. Haben Eure PoFos aber mehr Speicherals 128KB, so könnt Ihr den Wert 64, inobiger Zeile, auch gerne Schritt für Schrittum 64 erhöhen: 128,192,256,...

Die Verwendung der zweiten Ramdisk istaber nicht ganz risikolos: Sobald der PoFoneugestartet wird, egal ob Warm- oderKaltstart, geht die zweite Ramdisk und mitIhr alle Daten, verloren. Die Ramdisk C:verliert Ihre Daten zumindest bei einemWarmstart (STRG+ALT+EINF/ENTF) nicht!

Die Größe der Ramdisk C: verändert man jabekanntlich mit dem Befehl FDISK: FDISK 32und FDISK 24 sind für diese Tests dierichtigen und vollständigen Befehle. Dringenddabei zu beachten ist aber, daß man alleDaten und Programme auf C: verliert, wennman den FDISK Befehl startet!

�Wozu soll eine zweite Ramdisk gut sein?�

Man kann z.B. die Dateiprobleme des PoFoauch dann in den Griff bekommen, wenn mankeine Speicherkarte besitzt. Oder man legtdie Daten auf D: ab, die nur sehr kurzfristigbenötigt werden und deren Verlust man leichtverkraften kann. Auch eine bessere undgeordneter Dateiablage kann man mit derVerwendung der zweiten Ramdisk erreichen.

Diese Erfahrungen beruhen auf PoFos mitden Bios Versionen 1.072 und 1.130.

Page 48: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

48

Rekursive Batchdateien... sind besonders interessant, weil mandurch sie große Aktionen mit kleinemAufwand erreichen kann. Gerade fürtagtäglich wiederkehrende Aufgaben, habenwir entsprechend große Routinen parat,deren Inhalte sich oftmals gleichen. DieseSpeicherplatzverschwendung kann leichtverhindert werden, wenn man die Kernrou-tinen isoliert, in eigenen Batchdateien, undfür Rücksprünge sorgt.

Dafür werden in den Batchdateien, diejeweils eine Kenroutine enthalten, ich nennesie mal Slave-Batchdateien, Variablengesetzt, die von der großen Batchdatei, dieich Master-Batchdatei nennen möchte,überprüft werden. Durch die Parameter %0und %1 werden die rekursiven Aufrufegetätigt.

Hier die beispielhaften Batchdateien:

MB.BAT:@echo offif %rek%==1 goto zweiif %rek%==2 goto dreiecho Masterbatch zum ersten .sb1 %0:zweiecho Masterbatch zum zweiten ..sb2 %0:dreiecho Masterbatch zum letzten mal!set rek=

SB1.BAT:@echo offecho Slavebatch einsset rek=1%1

SB2.BAT:@echo offecho Slavebatch zweiset rek=2%1

Und so funktioniert das ganze:Die Master-Batchdatei, im folgenden nur

noch MB.BAT genannt, prüft bei jedem Aufrufzunächst den Inhalt von REK. Weil REK beimersten mal nicht definiert ist, werden einigeBefehlszeilen abgearbeitet. Irgendwannkommt dann der Aufruf der Slave-BatchdateiNr.1, kurz: SB1.BAT, die nun die Kontrolleübernimmt. Sie wird mit dem Parameter %0aufgerufen, der immer den Namen der

Batchdatei enthält, welche geradeabgearbeitet wird (hier: MB). Am Endedefiniert sie REK=1 und übergibt die Kontrollewieder an die MB.BAT, indem sie die MB.BATdurch den Parameter %1 aufruft, welcher jahier den Inhalt MB aufweist. MB.BAT prüftwieder die REK-Variable und stellt fest, dassie mit 1 definiert ist. Daher überspringtMB.BAT die nächsten Zeilen und fährt bei derRoutine :zwei fort. Kurz darauf wechselt nundie Kontrolle zu SB2.BAT, welches imspäteren Verlauf REK auf den Wert 2 setzt,bevor es die Kontrolle wieder an MB.BATzurückgibt. MB.BAT prüft REK erneut ab undspringt zur Routine :drei, in deren Verlauf esREK wieder löscht und seine Tätigkeitbeendet.

Würde REK nicht gelöscht, so würde beispäteren Aufrufen eine falsche Reihenfolgeeingehalten werden, durch die evtl. Dateienirreparabel beschädigt oder vernichtetwerden. Durch die Parameterübergabe, beimAufruf der Slave-Batchdateien, werden dieseso dressiert, das sie sich jeder Master-Batchdatei unterordnen und immer zurrichtigen zurückfinden.

Mit dieser Technik kann man z.B. gezielteDatensicherungen, Dateimanipulationen oderDatenauswertung betreiben!

Page 49: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

49

Verzeichnis umbenennenFür die Umbenennung von Dateien existiertja der RENAME-Befehl, aber für dieVerzeichnisse? Ja, da versagt das DOS ganzkläglich. Trotzdem braucht man aber nichtdarauf verzichten, sondern muß einen kleinenUmweg gehen.

Man kreiert einfach ein Verzeichnis mit demgewünschten Namen, kopiert alle Dateien insneue Verzeichnis und löscht zuletzt das alteVerzeichnis inkl. der Dateien. Kurzweiligexistiert also eine Doublette desVerzeichnisses, die auch dementsprechendPlatz benötigt. Daran muß natürlich gedachtwerden, bevor man also dieseautomatisierende Routine, namensRENDIR.BAT, einsetzt:

@echo offif %2.==. goto errmd %2 > nulcopy %1\*.* %2\ > nulfor %%a in (%1\*.*) do del %1\%%ard %1goto off:errecho Neuer Verzeichnisname fehlt!:off

Aufgerufen wird sie z.B. mit: �RENDIRC:\SYSTEM C:\DOS�, wenn das VerzeichnisSYSTEM in DOS umbenannt werden soll. Aberauch hier darf man sich nicht in demVerzeichnis befinden, welches umbenanntwerden soll. Befinden sich noch weitereUnterverzeichnisse in dem umzubenennendenVerzeichnis, so wird es nicht gelöscht!

Variablen umbenennen & kopierenOb man diese Routinen tatsächlich benötigt,sei einmal dahingestellt. Immerhin kann mandamit seine Variablen vor überschreibenschützen, wenn einem bewußt ist, das eineandere Routine dieselbe Variable benötigt.

Schauen wir uns �RV.BAT� doch einmal an:

@echo offrem RV - Rename Variableif %1==off goto %1if %2.==. goto errcopy c:\batch\rv2.dat c:\batch\*.b*>nulecho %1%%>>c:\batch\rv2.batecho set %1=>>c:\batch\rv2.batecho echo Variable %1 in %2

umbenannt!>>c:\batch\rv2.batecho rv off>>c:\batch\rv2.batrv2 %2:errecho Aufruf mit:echo RV alter Variablenname neuer Variablenname:offdel c:\batch\rv2.bat>nul

Benötigt wird außerdem noch �RV2.DAT�:@echo offset %1=%Und so soll das ganze funktionieren:

Weil �RV.BAT� später von �RV2.BAT�rekursiv aufgerufen wird, mit dem Wort offals ersten Parameter, darf zum einen keineVariable off umbenannt werden, und zumanderen sollte diese Zeile beim ersten Aufrufübergangen werden. Ist die korrekte Syntaxbeim Aufruf eingehalten worden, so wird�RV2.DAT� zu �RV2.BAT� kopiert. Nun wirdder Name der alten Variable an �RV2.BAT�gehängt, wodurch die Zeile -SET %1=%- umdiesen Variablenamen und das Prozentzei-chen vervollständigt wird. Weil die alteVariable ja auch gelöscht werden soll,gelangt als nächstes die Zeile -SET %1=- per-ECHO-Befehl in �RV2.BAT�. %1 wird aberdabei schon durch den alten Variablennamenersetzt! Jetzt wird die Rückmeldung für denBetrachter in �RV2.BAT� transferiert, wieauch der Rekursivaufruf von �RV.BAT�, der dalautet -RV off-.

Erfolgte also der Start durch RV test new,so sieht die �RV2.BAT� wie folgt aus:

@echo offset %1=%test%set test=echo Variable test in new umbenannt!rv off

Page 50: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

50

Die Vorkehrungen sind damit abgeschlossen,so daß der Aufruf mit -RV2 new- erfolgt. Mitdem ersten -SET- Befehl wird die neueVariable new mit dem Inhalt von testdefiniert. Der zweite -SET- Befehl löscht nundie Variable test, damit diese für andereZwecke verwendet werden kann. Imnächsten Moment erhaltet Ihr die Bestätigungfür den korrekten Verlauf, bevor �RV.BAT�erneut durch -RV off- aufgerufen wird.

Weil jetzt der erste Parameter off lautet,trifft die erste -IF- Zeile zu und bedingt densprung zu (:off). Diese Sprungmarke löscht�RV2.BAT� und beendet die ganze Routine.

Die �CV.BAT�, die dieselbe Technikverwendet, um eine Variable zu kopieren,unterscheidet sich nur in zwei Zeilen von�RV.BAT�. Ich gehe daher nicht weiter auf�CV.BAT� und �CV2.DAT� ein.

Schalt-TechnikEinige Batchdateien werfen geradezu mitBildschirmtexten um sich, die keinenBenutzer mehr interessieren, weil er siebereits auswendig kennt. Gerade die als dieNonplusultra gepriesenen Menüsysteme,kennen keinen Pardon!

�Wie schön wäre es doch, wenn man solcheSchirmmasken einfach abschalten könnte.�,höre ich Euch seufzen. Die Rettung nahtbereits, zumindest wenn diese Menüschirmedurch Batchdateien kreiert werden.

Handelt es sich bei dem Menüschirm nurum eine Textdatei, die per Batchdatei auf denSchirm kopiert wird, so kann die BefehlszeileCOPY �MENÜ.TXT� CON einfach aus derBatchdatei gelöscht werden. Wird die Maskedurch mehrere ECHO-Befehle generiert, sokönnen auch diese gelöscht werden.

Was werden aber Eure Bekannten sagen,wenn Ihr ihnen das Menüsystem kopiert? �Ichkomm damit nicht klar, weil nirgendwo zusehen ist, was ich einzugeben habe! Hilf mirdoch mal weiter.�

Die goldene Lösung ist also eineBildschirmmaske, die bei Bedarf an- oderabgeschaltet werden kann.

Und wer ist flexibler als unsere Helfer, dieParameter? Natürlich die Variablen! Aberdiesmal teilen sich beide die Arbeit undschalten mit der folgenden Batchdatei, dieintegrierte Bildschirmmaske ON oder OFF:

@echo offif %1.==. goto prüfset sw=%1:prüfif %sw%==off goto offif %sw%==OFF goto offclsecho ¦+ (T)exteditor (S)ystem (.)....... +echo ¦¦ (A)dressverw. (P)basic (.)....... ¦echo ¦¦ (Z)eitplaner (D)fü (C)hdir » ¦echo ¦¦ (K)alkulation (F)ilem. (H)ilfe » ¦echo ¦¦ (R)echner (U)til�s (O)ff ¦echo ¦+�� Anfangsbuchstabe + RETURN ��+:off

Zuerst wird geprüft, ob eventuell einParameter beim Aufruf der Batchdateimitgegeben wurde. Ist dies nicht der Fall,wird durch die Routine :prüf abgecheckt, obdie Variable SW als OFF oder off definiert ist.Wenn auch dieser Check negativ ausfällt, sosoll das Menübild sichtbar sein und wirddeswegen auch aufgebaut. Enthält der o.g.Parameter die Definition OFF oder off, so wirdkein Menübild gezeigt. Jede andereParameterübergabe wird als ON interpretiertund blendet die Maske wieder ein. Derjeweilige Schaltzustand bleibt solangebestehen, bis durch ein neuer Aufruf, inkl.Parameter, eine Umschaltung erfolgt.

Ur-Startlaufwerk ermitteln!Neulich bekam ich ein PD-Programm, welchessich nur halb installierte und dann startete.Das Programm suchte dann auch bald seineDateien im Laufwerk C:, weil es ja von dortgestartet wurde. Leider schlummerten aberdie fehlenden Dateien noch im Laufwerk A:,von dem ich bestimmungsgemäß dieInstallationsroutine gestartet hatte.Irgendwann sah auch das Programm es ein,das hier etwas nicht stimmen konnte undüberliess mich dem Prompt! Gottlob konnteich die Installationsroutine, die aus einerAUTOEXEC.BAT inkl. CONFIG.SYS-Erwei-terung bestand, reparieren. Diese Routinefand einfach nicht mehr zu dem Laufwerkzurück, von dem sie gestartet wurde!!!

Aber überlassen wir den Programmiererseiner Schande und versuchen selbst das Ur-Startlaufwerk festzustellen und ähnlich�doofen� Routinen an die Hand zu geben.

Beim Start der AUTOEXEC.BAT meinesPortfolios, wird automatisch der Parameter

Page 51: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

51

%0 mit dem folgenden Inhalt gefüttert:�A:\AUTOEXEC�. Vorausgesetzt, dieAUTOEXEC.BAT befindet sich im A:-Laufwerk- und das setze ich hier einmal voraus!

Festhalten wollen wir also nur dieZeichenfolge �A:� und das möglichst zurweiteren Nutzung in einer Variablen. AlleVersuche, das überflüssige Wort �AUTOEXEC�abzuschneiden, waren zum Scheiternverurteilt. Weil aber der Inhalt desParameters %0 bekannt ist, konnte ichdiesen mit allen Variationsmöglichkeitenvergleichen und bei passendem Vergleich, dieVariable LW, die ich zur Aufnahmeauserkoren hatte, dementsprechend selbstmit dem Laufwerksnamen definieren! Diefolgende AUTOEXEC.BAT erledigt das nun fürmich:

@echo offset lw=%0if %lw%==A:\AUTOEXEC goto aif %lw%==B:\AUTOEXEC goto bif %lw%==C:\AUTOEXEC goto cgoto fehler:aset lw=A:goto message:bset lw=B:goto message:cset lw=C::messageecho Das Startlaufwerk ist %lw%!goto ende:fehlerecho Das Startlaufwerk ist zumindest nichtecho A:, B: oder C:! Näheres konnte leiderecho nicht ermittelt werden, sorry!!!:ende

Diese Routine funktioniert wirklich nurunmittelbar nach dem Einschalten desRechners, oder nach einem Reset. Wird sienach längerer Computerbenutzung nochmalsaufgerufen, so geht damit der Inhalt derVariablen LW unwiederbringlich verloren!

Mit der folgenden Befehlszeile kopiere ichalle Dateien vom Ur-Startlaufwerk nach �C:�,wenn ich sie in einer Batchdatei einsetze:

copy %lw%*.* c:\

Im Direktmodus, so ist es zumindest beimPortfolio (=PoFo), kann ich diesen Befehlnicht verwerten.

Nun ist der PoFo auch sonst ein sehreigenwilliger Compi, weshalb der Inhalt desParameters %0, nämlich �A:\AUTOEXEC�,nicht dem Inhalt desgleichen Parameters, auf�großen� PC�s, gleichen muß!!!

Mit der folgenden AUTOEXEC.BAT kann manaber den Inhalt von %0 überprüfen:

@echo offecho %0 %1 %2 %3

Sollte also das Ergebnis anders ausfallen, soist die obige Batchdatei entsprechendabzuändern.

Eine unlöschbare Variable simu-lieren!Das geht nur direkt am DOS-Prompt indemman eingibt:

SET VAR=^ZWobei ^Z für die Tastenkombination STRG+Zsteht!Im Gegensatz zu den echt unlöschbarenVariablen, die auftreten wenn dasEnvironment voll ist, kann diese Variablewieder durch die Eingabe von:

SET VAR=gelöscht werden. Sie kann aber auch durcheine Batchdatei gelöscht werden! Einevermeintliche Leerzeile im Environmenterreicht man durch diese Direkteingabe:

SET ^Z=^ZAuch diese Leerzeile ist eine vermeintlichunlöschbare Variable! Diese kann nur durchdie Direkteingabe von:

SET ^Z=gelöscht werden. Eine Batchdatei kann dieseVariable nicht löschen!

Page 52: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

52

KnowHow: DIP-OSSYSTEMFEHLER -Verzeihung!... bittet meist die Textverarbeitung, wenn sieeinen Text nicht mehr laden kann. Dies liegtmeistens an einer Leerzeichen/Return-Kombination, die am Ende des zuletztgespeicherten Textes zu finden ist. Sie zwingtdamit zunächst den PoFo zu einem Neustart,setzt aber auch auf Dauer dieTextverarbeitung schachmatt. Leider wird jaimmer der letzte Text automatisch geladen,der in diesem Fall fehlerhaft ist und somiteine Kettenreaktion auslöst. Erfahrene undlangjährige User benutzen deshalb dasProgramm PORTDIV.COM, welches diesenSystemfehler verhindert. Aber was tun wennman dieses Programm nicht hat?

Damit man die Textverarbeitung überhauptwieder nutzen kann, kann man die DateiPERMDATA.DAT im Verzeichnis C:\SYSTEMlöschen. Mit �DEL C:\SYSTEM\PERMDATA.DAT� wird das erledigt. Weildamit der Text nach wie vor nicht repariertwird, ist die folgende Lösung besser underfolgreicher: Gebt einfach am Prompt denBefehl �ECHO M>>BEISPIEL.TXT� ein!

Damit wird der Text, hier BEISPIEL.TXT, umden Buchstaben M verlängert und überlistetsomit die Textverarbeitung. Problemlos kannman nun den Text wieder editieren undkorrigieren!

Als ich diese Lösung dem Jens Sewitz vomAtari Computer Team e.V. Bremen mitteilte,wir lernten uns auf der 10. BremerComputer- & Videobörse kennen, brachte ermich auf die Idee, diese Lösung in eineBatchdatei zu packen.

Und hier ist also die NOERROR.BAT:

@echo offif %1.==. goto errecho m>>%1.txtapp/egoto off:errecho Textdatei ohne .TXT angeben!:off

Wenn ich also unseren Text BEISPIEL.TXTkorrigieren muß, lautet dieEingabe:�NOERROR BEISPIEL�. NOERRORhängt dann automatisch ein kleines �m� anBEISPIEL.TXT und ruft anschließend dieTextverarbeitung auf. In dieser sind nun die

letzten drei Zeichen zu löschen, bevor manden Text neu abspeichert.

Theoretisch kann man dieses Löschen auchmit FAKE.COM automatisieren, aber ich mußja nicht alle Lösungen präsentieren.Schließlich sollt Ihr ja auch Nachdenken undErfolgserlebnisse haben!!!

Vergaloppiert & -kopiert?Stellt Euch einmal folgende Situation vor:

Larry L. benutzt gerade sein DOS undsteckt im Verzeichnis SEX auf dem LaufwerkA:. Die dort befindlichen Dateien will er nunins Verzeichnis BILDER auf Laufwerk C:kopieren. Unaufmerksam, wie er nun einmalist, gibt er den Kopierbefehl wie folgt ein:COPY *.* C:. Flugs werden alle Dateien vonA:\SEX nach C:\TEXTE kopiert, da unserLarry vergessen hat, zuvor auf Laufwerk C:ins Verzeichnis \BILDER zu wechseln! Dastecken nun also Texte und Bilder doch untereiner Decke, Pardon: in einem Verzeichnis,obwohl sie fein säuberlich getrennt seinsollten.

Larry macht sich also nun mühsam daranalle fehlplazierten Dateien von Hand zulöschen, damit auch ja kein wertvollerLiebesbrief verloren geht.

Armer Larry! Hättest du diese BatchdateiUNCOPY.BAT, so wäre dir viel Handarbeiterspart geblieben:

@echo offif %1.==. goto errfor %%a in (*.*) do if exist %1\%%a del %1\%%agoto off:errecho Laufwerk und Verzeichnis fehlen!:off

Du mußt sie mit dem Laufwerks- undVerzeichnisnamen aufrufen, in denen diefehlplazierten Dateien liegen. In deinem Fallalso mit UNCOPY C:\BILDER . Denn die FOR-IN-DO-Schleife prüft zunächst nach, welcheDateien (*.*) des aktuellen Verzeichnisses,sich ebenfalls im, als Parameter %1übergebenen, Zielverzeichnis befinden. Sinddort gleichnamige Dateien zu finden, sowerden sie dank DEL %1\%%A auch gleichgelöscht. Somit verlierst Du mit Sicherheitkeinen deiner Liebesbriefe und vergißt auchkeine Datei zu löschen!

Page 53: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

53

Larrylob sind wir, verehrte Leser, nicht solarry drauf, weshalb UNCOPY.BAT nur sehrselten bei uns zum Einsatz kommt, oder???

UPDATE.COM & PORTDIV.COMWeil mich mindestens einmal pro Monat einHilferuf zu diesen Dateien erreicht, möchteich mit diesem Text, der frei kopiert undweitergegeben werden darf, die Verwendungund die Installation dieser Programmeerklären. Allerdings sind gewisseVorkenntnisse übers DOS und dieTextverarbeitung des PoFos vonnöten, dennalle möglichen Varianten sind mir nichtbekannt und von Fall zu Fall verschieden.Diese Anleitung beschreibt den generellenFall.

Wer also nicht weiß, was Hauptverzeichnis,Unterverzeichnis, AUTOEXEC.BAT undCONFIG.SYS sind, der sollte sich schleunigstein Buch zu MS-DOS kaufen, indem auch dieim PoFo vorhandenen Befehle stehen underklären, wie man Dateien ablegt, ordnet undverändert.

1. Übertragen dieser Programme auf dieRamdisk C:

1.1 von der Memorycard im Kartenschacht A:des PoFo mit: COPY A:UPDATE.COM C:\ COPY A:PORTDIV.COM C:\1.2 vom PC via Serialinterface:1.2.1 Eingabe am PoFo: COPY AUX C:\UPADATE.COM1.2.2 Eingabe am PC : COPY UPDATE.COM AUX1.2.3 Eingabe am PoFo: COPY AUX C:\PORTDIV.COM1.2.4 Eingabe am PC : COPY PORTDIV.COM AUX

Andere Übertragungsarten sind auch möglich,habe ich aber noch nicht ausprobiert.

2. Einbinden der Programme:2.1 Starten Sie die interne Textverarbeitungdes PoFo: APP /E2.2 Laden Sie die AUTOEXEC.BAT ein, in demSie nach einander die folgenden Tastendrücken: ATARI-Taste (ganz links unten,rotes Atari-Logo), D-Taste, L-Taste folgendenText eingeben: C:\AUTOEXEC.BAT und dieWinkelpfeil-Taste drücken

2.3 Erscheint die Fehlermeldung �Datei nichtgefunden�, so drücken Sie zweimal die ESC-Taste (ganz links oben) und drücken dann dieN-Taste.2.4 Gehen Sie mit dem Cursor zum Anfangder Datei und fügen Sie dort die folgendendrei Zeilen vor:

@echo off update portdiv

2.5 Ist die AUTOEXEC.BAT nicht vorhanden,so geben Sie bitte die folgenden Zeilen ein:

@echo off update portdiv prompt$p$g path=c:\;c:\system

2.6 Speichern Sie die AUTOEXEC.BAT wiefolgt ab: Atari-Taste, D-Taste, S-Taste,folgenden Text eingeben: C:\AUTOEXEC.BATund die Winkelpfeil-Taste drücken2.7 Verlassen Sie die Textverarbeitung miteinmaligem Druck auf die ESC-Taste.3. Start der Programme:3.1 Führen Sie einen Warmstart aus, indemSie die Tasten STRG, ALT und EINF/ENTFzugleich drücken.

- Alle Angaben ohne Gewähr -

Wo bin Ich?Ob sich das DOS an diesem beliebtendeutschen Ratespiel beteiligt, ist leider nichtüberliefert. Anscheinend hat es dieLaufwerksverwaltung so gut im Griff, dasdiese Frage nicht aufkommen kann. Fürautomatische Abläufe kann es aber sehrhilfreich sein zu wissen, welches Laufwerkgerade aktuell ist. Dem soll meine Batchdatei�WOBINICH.BAT� Rechnung tragen:

@echo offrem Wo bin ich momentan ? - aktuelles Laufwerkrem ermitteln!if %1==. goto .copy c:\batch\wbi*.dat c:\batch\*.b*>nulcd>>c:\batch\wbi2.batcd\cd>>c:\batch\wbi3.batecho echo Das Laufwerk %%alw%% ist

aktuell!>>c:\batch\wbi3.battype c:\batch\wbi2.bat>>c:\batch\wbi3.batecho wobinich .>>c:\batch\wbi3.batwbi3

Page 54: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

54

:.del c:\batch\wbi*.bat>nul

�WBI2.DAT�:cd

�WBI3.DAT�:@echo offset alw=

Besprechen wir zunächst die Gedanken, diedieser Routine vorausgegangen sind:

Weder Laufwerk, noch Verzeichnis, sindbeim Start bekannt. Helfen kann da nur derBefehl -CD-, dessen Reaktion in Dateienumgeleitet wird. Unter alten DOS-Versionenist ja keine Trennung zwischen derLaufwerkskennung und demVerzeichnisnamen möglich, weshalb einwechsel in ein bekanntes Verzeichnisstattfinden muß. Bestens geeignet ist dafürdas Hauptverzeichnis, da es erstens aufjedem Datenträger vorhanden ist undzweitens, einen markanten Namen besitzt,der leicht verglichen werden kann. Bevoraber dieser Wechsel ausgeführt wird, solltenoch das aktuelle Verzeichnis gerettetwerden, damit es später wieder aktualisiertwird.

Soweit die Vorgeschichte, jetzt geht es andes Routinens Kern:

Beim ersten Start d.h., wenn Ihr�WOBINICH.BAT� durch die EingabeWOBINICH aufruft, werden als erstes dieHilfsdateien kopiert. Es folgt die Sicherungdes aktuellen Verzeichnisnamens in die Datei�WBI2.BAT�, der Wechsel insHauptverzeichnis und die Sicherung desHauptverzeichnisnamens in �WBI3.BAT�.Jetzt wird die Rückmeldung in �WBI3.BAT�plaziert, bevor sie durch �WBI2.BAT�, mittels-TYPE- Befehl, verlängert wird. Die�WBI2.BAT� enthält ja den Verzeichnisnamen,der beim Start von �WOBINICH.BAT aktuellwar. Per -ECHO- wird nun der Befehl zumRücksprung -WOBINICH .-, der �WBI3.BAT�mitgeteilt, bevor sie dann gestartet wird.

Angenommen, mein PoFo steckt gerade indem Verzeichnis SYSTEM des Laufwerkes C:,dann sähe die �WBI3.BAT� schließlich so aus:

@echo offset alw=c:\echo Das Laufwerk %alw% ist aktuell!cd c:\systemwobinich .

Sie setzt die Variable ALW und definiert siemit dem Laufwerksnamen und demBackslash, der die Kennzeichnung für dasHauptverzeichnis ist. Eigentlich müßte dieserBackslash noch weg, da wir nur dieLaufwerkskennnung C: suchten, aber dieRoutine wäre dadurch nochunverhältnismäßig länger geworden. Nunbekommt Ihr die Rückmeldung auf denSchirm und es folgt der Rückwechsel insVerzeichnis SYSTEM, von wo die ganzeRoutine gestartet wurde. Mit dem erneutenStart von �WOBINICH.BAT�, sorgt�WBI3.BAT� für die Wiederherstellung dervorherigen Ordnung. Die Variable ALW wirdallerdings nicht gelöscht, damit andereRoutinen auf sie zurückgreifen können!

KnowHow: DIP-OSAuch Kleines wird einmal GroßMit der folgenden Routine kann manParameter in Großschrift umwandeln. Somitkann man viele Überprüfungszeilenvermeiden, oder Worte besondershervorheben. Doch leider funktioniert dieTechnik nur auf dem PoFo:

set ß=halloecho %ß%

Werden diese Zeilen in eine Batchdateigepackt, so wird nach dem Aufrufderselbigen, das Wort hallo inGroßbuchstaben auf dem LCD-Schirmerscheinen. Definiert man nämlich eineVariable, in deren Name ein ASCII-Charakteroberhalb von 126 steckt, so wird der Inhaltautomatisch vom PoFo in Großschriftumgewandelt. Weil lange Variablennamen nurSpeicherplatz verschwenden und das

�ß� direkt neben dem �=� auf der Tastaturliegt, habe ich mir diesen Variablennamenausgesucht. Ärger, Müll, Öl, Übel oder alleKonstruktionen aus Grafikzeichen vermögendasselbe zu leisten.

Diese Erfahrung brachte mich auf die Idee,eine Batchdatei zu schreiben, mit derbestehende Variablen in Großschriftumgewandelt werden können. Und weil mirdas ganze so gut von der Hand ging, kannman damit auch noch nicht existierendeVariablen gleich in Großschrift definieren.

Page 55: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

55

GV.BAT:

@echo offrem GV - Großgeschriebene Variableninhalteif not %ü%.==. if %ß%.==. goto err2if exist c:\batch\gv2.bat goto msgif %1.==. goto errif %2.==. goto old:newset ü=%1set ß=%2set %1=%ß%:msgecho Die Variable %ü% enthält nun %ß%set ß=set ü=goto off:oldset ü=%1copy c:\batch\gv2.dat c:\batch\*.b*>nulecho %1%%>>c:\batch\gv2.batecho set %%1=%%ß%%>>c:\batch\gv2.batecho gv>>c:\batch\gv2.batgv2 %ü%:errclsecho Aufruf bei noch nicht existierenderecho Variable:echo GV Variablenname Variableninhaltecho echo Aufruf bei existierender Variable:echo GV Variablennamegoto off:err2echo Die Variable %ü% existiert nicht!set ü=:offdel c:\batch\gv2.bat>nul

GV2.DAT:

@echo offset ß=%

Gehen wir nun einmal in der Annahme, daßdie Variable TEST existiert und mit �ja�definiert ist. Wollen wir dieses �ja� inGroßschrift verwandeln, so rufen wir�GV.BAT� mit -GV Test- auf. Da die Variablenü und ß sowie �GV2.BAT� noch undefiniert,bzw. nicht existieren, werden weder dieSprungmarke �err2� noch �msg� ausgeführt.Als nächstes wird das Vorhandensein desParameters %1 geprüft. Wurde keinParameter angegeben, so wird man auf denfehlerhaften Start hingewiesen und bekommtdie mögliche Syntax angezeigt. Weil beiunserem Testlauf eine bereits vorhandeneVariable umgewandelt werden soll, trifft eszu, das kein zweiter Parameter angegeben

wurde. Somit erfolgt ein Sprung zu (:old).Dort wird aus optischen Gründen zunächstder erste Parameter, der ja einemVariablennamen gleicht selbst in Großschriftumgewandelt: -set ü=%1-.

Nun tritt aber das Problem auf, das mannicht an den Inhalt der Variablen kommt, dieals Parameter übergeben wurde. -SETß=%%1%- wäre zwar die richtige Lösung fürdieses Problem, funktioniert aber leider nicht.Deswegen nehmen wir �GV2.DAT� zu Hilfe,welche zu �GV2.BAT� kopiert wird. Imnächsten Moment wird die unvollständigeZeile -set ß=%- von �GV2.BAT� mit �test%�komplettiert, weil %1 in unserem Falle jadem Wort �test� entspricht. Somit kommenwir doch an den Inhalt der Variablen heran,die als Parameter übergeben wurde.Gleichzeitig wird dadurch der dem Wort �ja�entsprechende Inhalt in Großschriftverwandelt, sofern �GV2.BAT� zur Ausführungkommt. Damit wir aber später über diegeglückte Umwandlung informiert werden,muß �GV2.BAT� noch angewiesen werden,zur �GV.BAT� zurückzukehren. Diesgeschieht mittels des Befehles -echogv>>c:\batch\gv2.bat-. Endlich sind alleVorkehrungen getroffen und �GV2.BAT� wirddurch die Zeile -gv2-gestartet.

Kaum das Ruder in die Hand genommen,wird nun die Variable ß mit �JA� definiert,bevor die Kontrolle wieder an �GV.BAT�zurückgeht.

�GV.BAT� stellt nun die Existenz von�GV2.BAT� fest, geht daher von der korrektenUmwandlung aus und springt zu (:msg). Esfolgt die Ausgabe der Bestätigung, bei derVariablenname und der Variableninhalt inGroßschrift erfolgt. Der guten Ordnung halberwerden dann noch die Hilfsvariablen ß und ü,sowie die �GV2.BAT� gelöscht.

Wer schreibfaul ist oder nicht die SHIFT-Taste findet, kann die Variable AUTO mitNEIN definieren, wenn er �GV.BAT� durch dieEingabe von �GV auto nein� startet. Indiesem, unserem Falle muß die Sprungmarke(:new) ausgeführt werden.

Durch die drei dort befindlichen -SET-Zeilenwird die Umwandlung vollzogen, was Ihrebenfalls leicht nachvollziehen solltet.

Nahtlos geht es mit (:msg) weiter, die denkorrekten Verlauf bestätigen soll und für dieBeseitigung der Hilfsvariablen zuständig ist.

Page 56: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

56

Obwohl wir bei diesem zweiten Testlauf�GV2.BAT� nicht angelegt hatten, war ja nichtnotwendig, wird diese Datei versucht zulöschen. Dank der Umleitung nach NULbekommen wir aber keine Fehlermeldungmitgeteilt.

Natürlich kann man die Variable AUTO auchim Direktmodus mit NEIN definieren wennman -SET AUTO=NEIN- eingibt. Dieser Wegist zwar einfacher, aber bei automatischablaufenden Batchdateien ist meist keineuserbedingte Eingabe möglich oder gar uner-wünscht. Deshalb hat die zweite Möglichkeitder Umwandlung auch Sinn!

GW-Basic auf dem PoFo - Teil 3Ich habe mich noch einmal hingesetzt und dieStartroutine zum GW-Basic überarbeitet, weilmeine alte Version, aus dem Jahre 12 nachDOS (1993), nicht mehr zeitgemäß und vielzu umständlich ist!

Herausgekommen ist eine neueAUTOEXEC.BAT, die ins Hauptverzeichniseiner 128KB Memorycard gehört:

@echo offif not exist a:\gwbasic.exe goto errif not exist c:\system\*.* goto nextif exist c:\system\@!@-@[email protected] goto nextclsecho +������������������+echo ¦!ATTENTION! ATTENZIONE! ACHTUNG! ¦echo +������������������+echo echo Try formatting C: with 200K!fdisk 200echo Try formatting C: with 8K!fdisk 8:nextmd c:\system>nulrem>c:\system\@!@-@[email protected] $p$gpath=a:\;c:\a:\portdiv>nulclsecho +����������������+echo ¦ GW-BASIC 3.22 - Startroutine ¦echo ¦developed 1996 by Lasse Assebasse¦echo +����������������+a:\gwbasic:errif not exist a:\gwbasic.exe echo File GWBASIC.EXE is

missing!

Ersatzlos gelöscht werden können die DateienAUTO2.BAT, AUTO3.BAT, AUTO4.BAT,AUTOEXEC.ORI und J.DAT.

Diese Version formatiert die Ramdisk nichtmehr automatisch, weil man den PoFo ja aufdrei verschiedene Sprachen(Englisch/Francais/Deutsch) einstellen kannund dieses zu Problemen führt:

Bei der alten Version bin ich von �aufDeutsch eingestellten� PoFos ausgegangenund habe die automatische Formatierungdurch:

FDISK 8 < j.dat > nul

erreicht. Bei auf Deutsch eingestelltenGeräten gibt es damit auch keine Probleme,aber bei denen, die auf Englisch oderFranzösisch eingestellt sind!

Denn dort muß man die Rückfrage vomDIP-OS mit der Taste Y für YES oder O fürOUI beantworten!!! Und somit kann die nicht-deutsche-Rückfrage nichts mit der Taste Janfangen, die ich in die Datei J.DAT, zwecksUmleitung an FDISK, gestellt habe!

Meine Versuche alle möglichen underlaubten Tasten (YOJ) in YOJ.DAT zu stellen,quittierte der PoFo durch totaleArbeitsverweigerung!

Wer es probieren möchte, sollte so

YOJ.DAT mit der Textverarbeitung schreiben:YOJ

und dann den Befehl: FDISK 8 < YOJ.DAT imDIP-OS (DOS) eingeben.

Zu gerne hätte ich dieses Problem aus derWelt geschafft und EINE Lösung für alleSprachen geschaffen, aber der PoFo spielt da(noch) nicht mit!

Und was lernen wir daraus:Wenn wir Batchdateien schreiben, die

Tastendrücke aus Dateien benötigen, somüssen wir daran denken, das es nicht nurdie deutsche Sprache gibt!!!

Aber allem Anschein nach sind dieCompuServe-User echte Freaks und habenmeine alte Lösung, ohne zu murren!, IhrenSprachen gemäß verändert. Ich hoffe nur,das Ihr nicht so tolerant seit, weil solcheFehler nicht gerade jahrelang unentdecktbleiben sollten!!!

Noch ein paar Worte zur Programmtechnik:Wie allseits bekannt sein dürfte, formatiert

man mit dem Befehl FDISK die Ramdisk C:des PoFo. Weil dadurch ALLE Dateien auf C:verloren gehen, auch CONFIG.SYS und

Page 57: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

57

AUTOEXEC.BAT, muß der PoFo danach neugestartet werden. Denn ein evtl. vorhervorhandener Gerätetreiber ist nun nicht mehrda und kann auch nicht mehr genutztwerden! Deshalb nimmt der frisch formatiertePoFo den Neustart automatisch vor.

Nun bedeutet ein Neustart auch diewiederholte Suche nach einer ausführbarenCONFIG.SYS und AUTOEXEC.BAT.

Da auf C:\ keine AUTOEXEC.BAT mehrexistieren kann und eine auf A:\ zu finden ist,nämlich die obige, wird die von A:\ gestartet.Selbst wenn eine AUTOEXEC.BAT auf B:\ zufinden ist, so kommt diese nicht zurAusführung, weil die auf A:\ Vorrang hat!

Rein theoretisch müßte die obigeAUTOEXEC.BAT also wieder die Ramdisk C:formatieren und damit wieder einen Neustartauslösen. Und wieder, und wieder undwieder, ....: Eine Schlange die sich selbst inden Schwanz beißt!!!

Wenn Ihr aber diese AUTOEXEC.BATausprobiert, und das hoffe ich doch sehr, sowerdet Ihr feststellen, daß dies aber nicht derFall ist!

Schuld daran ist die Zeile:

if not exist c:\system\*.* goto next

... die prüft, ob sich keine Datei imVerzeichnis C:\SYSTEM befindet, was nurunmittelbar nach einer Formatierung derRamdisk C: so sein sollte. Wenn diesePrüfung positiv ausfällt, so wurde also dieRamdisk erfolgreich formatiert und das GW-Basic kann gestartet werden, was dieSprungmarke :next erledigt.

Und damit nicht bei jedem Warmstart desPoFos die Ramdisk C: formatiert wird, lasseich von :next eine leere Datei @!@-@[email protected] Verzeichnis C:\SYSTEM anlegen:

rem>@!@-@[email protected]

und diese mit der Zeile:

if exist c:\system\@!@-@[email protected] goto next

prüfen. Nur wenn jemand von Euch soperfide Gedanken hegt, die DateiC:\SYSTEM\@!@-@[email protected] mutwillig zulöschen und eine x-beliebige Datei nachC:\SYSTEM zu kopieren, wird mit demnächsten Warmstart eine Formatierung derRamdisk C: fällig!!!

Spielereien mit dem PROMPTAls Prompt bezeichnet man dieEingabeaufforderung, die uns das DOS zeigt,wenn es für weitere Aktionen bereit ist.Oftmals hat es die folgenden, beispielsweisenErscheinungsformen: �a>� oder �a:\>�.

Im Handbuch stehen auch einige Beispiele,wie man diese Formen ändern kann. Dochleider werden dort zumeist nur dieStandardvariationen wiedergegeben. Dabeikann man das Prompt ganz nach seinenWünschen gestalten!

So wird das Prompt auf das blinkendeQuadrat reduziert, wenn man den Befehl�PROMPT$h$h� eingibt. Wer auf die sonstübliche Laufwerks- und Pfadangabe �A:\�verzichten kann, hat auch die Möglichkeit,daß Prompt mit einem individuellen Text zubelegen. Die Eingabe von �PROMPT PoFo�erzeugt so immer die Meldung �PoFo� alsPrompt. Grafische Prompts kann man mittelsder Alt- oder der Strg- Taste erreichen.Ändert man das Prompt durch �PROMPT Wielautet die richtige Antwort?�, so kann mandamit dem Bediener eine Tastatureingabevorgaukeln.

Weil in Batchdateien keine echtenTastatureingaben möglich sind, muß eineBatchdatei existieren, die als Dateinamen dieAntwort enthält und die die Auswertungvornimmt. Für jede mögliche Antwort mußalso eine eigene Batchdatei produziertwerden.

Sobald die Frage beantwortet undausgewertet wurde, sollte das Promptnatürlich seine vorherige Form wiederannehmen. Deshalb wird es zuerst in einerVariablen gerettet, dann wie gewünschtgeändert und abschließend von derAntwortdatei wiederhergestellt. In der Batch-datei, in der also die Frage gestellt wird,müssen die folgenden Zeilen zu Beginnplaziert werden:

SET PRZ=%PROMPT%PROMPT=Wie lautet die korrekte Antwort ?

Jede Batchdatei, die jeweils eine möglicheAntwort auswertet, ist um die folgende Zeilezu ergänzen:

PROMPT=%PRZ%

Page 58: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

58

Weil viele Antwortmöglichkeiten auchdementsprechend viele Batchdateien zurAuswertung verlangen, sollte man die Fragenmöglichst so gestalten, das mit J für JA oderN für NEIN geantwortet werden kann. Eswerden dann also nur die Batchdateien J.BATund N.BAT benötigt.

Gesetzt der Fall, es sollen mehrere Fragenvom Bediener per J/N beantwortet werden,so können J.BAT und N.BAT die Antwortenfehlinterpretieren, da sie ursprünglich nur füreine Frage konzipiert wurden. Man stelle sicheinmal vor, daß der Computer fragt, ob wirheute schönes Wetter hätten. Durch dieAntwort mit J erhielten wir dann denKommentar vom Computer, daß man dochbesser im Garten arbeiten solle, als auf ihm,den Computer, rumzuhacken. Im nächstenMoment soll dann die Frage, ob wir mit demComputer zufrieden sind, beantwortetwerden. Die meisten von uns werden auchdiese Frage mit J beantworten undbekommen erneut den Kommentar geliefert,daß man doch besser im Garten arbeitensolle. Eine Reaktion wie �Vielen Dank, dasehrt mich sehr!� wäre hier nicht nur passen-der, sondern auch logischer.

Aber auch diese Unlogik ist mit ein paarZeilen behebbar! So definiert man in jederFrage-Batchdatei eine Variable und baut inJ.BAT und N.BAT entsprechende Prüfroutinenein, mit denen dann die richtigenKommentare geliefert werden. Die definierteVariable sollte immer denselben Namenhaben und nur von jeder Frage- Batchdateimit neuem Inhalt definiert werden. Nennenwir diese Variable FRG für Frage und gebenwir ihr den Inhalt �1�, wenn die Frage nachdem Wetter beantwortet werden soll. DieFrage-Batchdatei, die ich WETTER.BATnennen möchte, sähe dann so aus:

@echo offset frg=1set prz=%prompt%prompt=Ist heute schönes Wetter (J/N) ?

Die Frage-Batchdatei nach der Zufriedenheit,ich nenne sie hier COMPUTER.BAT, definiertdie Variable FRG mit �2� und sieht dann etwawie folgt aus:

@echo offset frg=2set prz=%prompt%

prompt=Bist Du mit mir, dem Computer, zufrieden (J/N) ?

Und so sieht dann beispielsweise die Antwort-Batchdatei J.BAT aus:

@echo offif %frg%==1 goto einsif %frg%==2 goto zweigoto end:einsecho Du solltest besser im Garten arbeiten!goto end:zweiecho Vielen Dank, das ehrt mich sehr!:endprompt=%prz%

Durch die IF-Zeilen wird die Variable FRGüberprüft und zu der Routine weitergeleitet,die dann den richtigen Kommentar ausgibt.Bei entsprechender Weiterprogrammierungkann man damit aus seinem Computer glattden privaten Psychiater oder Lebensberatermachen!!!

Echten Sinn macht diese Frage-Antwort-Technik aber erst in Installationsroutinenoder Menüsystemen. Die hier vorgestellteTechnik ist ausführlich auf dem Atari Portfoliogetestet worden und kann sich natürlichdurch neuere DOS-Versionen erübrigen.

Die automatische Sicherung desEnvironmentsEin volles Environment, zu altdeutsch:Umgebungsspeicher, macht sich ja immerdurch die Meldung �Umgebungsspeicher voll!�bemerkbar und ist sehr ärgerlich, weil keineVariablen mehr gesetzt werden können.Startet man nach dieser Meldung nochweitere Batchdateien, die Variablen anlegenwollen, so werden diese Batchdateien nichtmehr korrekt funktionieren und womöglichwichtige Dateien löschen. Also heißt esentweder Variablen von Hand löschen oderDELENV.BAT einsetzen, damit der Ablauf vonBatchdateien nicht gefährdet ist. Doch wasist, wenn man Variablen löscht, die späterwieder benötigt werden? Um später nicht wieder Ochs vorm Berg zu stehen, sollte manvor dem löschen der Variablen diese liebersichern, damit sie später wiederhergestelltwerden können. Einen automatisiertenLösungsansatz dafür stellt SAVENV.BAT dar:

Page 59: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

59

@echo offif %1.==. c:\batch\savenv.bat §§if not %§§%.==. set §§=if not %1.==§§. goto nxecho @c:\batch\savenv.bat>c:\ batch\savenv2.batecho @echo off>c:\batch\rstenv.batecho PATH=%path%>>c:\batch\rstenv.batpath=-goto sv:nxif not %1.==. shiftif not %1.==. path=%1if not %2.==. path=%path% %2if not %3.==. path=%path% %3if not %4.==. path=%path% %4if not %5.==. path=%path% %5if not %6.==. path=%path% %6if not %7.==. path=%path% %7if not %8.==. path=%path% %8if not %9.==. path=%path% %9if %0==PATH goto exif %1.==. goto execho set %0=%path%>>c:\batch\rstenv.batset %0=:svif exist c:\batch\savenv2.dat copy c:\batch\savenv2.dat

c:\batch\*.b*>nulif exist c:\batch\savenv2.bat set>>c:\batch\savenv2.batif not %0.==§§. if exist

c:\batch\savenv2.batc:\batch\savenv2.bat:execho Ist RSTENV.BAT so okay?echo.if exist c:\batch\rstenv.bat type c:\batch\rstenv.batif exist c:\batch\savenv2.bat del c:\batch\savenv2.batif exist c:\batch\rstenv.bat c:\batch\rstenv.bat

Diese Batchdatei sichert nach Möglichkeit dasgesamte Environment in einer ausführbarenBatchdatei namens RSTENV.BAT. Dazunotwendig ist allerdings auch die DateiSAVENV2.DAT die durch folgende Eingabenzu erstellen ist:

copy con c:\batch\savenv2.dat<ENTER>@echo off<ENTER>c:\batch\savenv.bat<SPACE><STRG>+<Z><ENTER>

Dabei steht <ENTER> für die Enter- bzw.Return-Taste, <SPACE> für ein Leerzeichenund <STRG>+<Z> soll das Dateiendezeichensein welches man erhält, wenn man die TasteSTRG drückt, festhält und dann die Taste Zdrückt. Anstelle von <STRG>+<Z> reichtaber auch ein Druck auf <F6> aus! DieLaufwerks- und Verzeichnisangaben müssenSie gegebenenfalls Ihrem Systementsprechend anpassen. Aus folgenden

Gründen ist SAVENV.BAT nur bedingteinsetzbar:

1. Es kann das Environment nur danngesichert werden, wenn dieVariablennamen aus einem Wort bestehen.Variablen wie TEST;VAR1=X oderTEST,VAR1=H führen zu Endlosläufen, weilSemikolon, Kommata, Gleichheits- undLeerzeichen im DOS als Trennungszeichenfungieren. Diese Trennungszeichen dürfenalso nicht in Variablennamen vorkommen,wenn SAVENV.BAT korrekt sichern soll.

2. In den Variableninhalten dürfen maximalneun Worte durch Trennungszeichengetrennt, enthalten sein. Bei der VariableTEST=1 2 3 4 5 6 7 8 9 0 würde die Nullnicht mehr mitgesichert.

3. Ist eine Variable ohne Definition imEnvironment, d.h. ohne das üblicheGleichheitszeichen und erkennbarenInhalt, so wird nur bis zu dieser Variablegesichert. Sie und die nachfolgendenVariablen müssen aus technischenGründen unberücksichtigt bleiben.

Ansonsten sollte SAVENV.BAT korrektfunktionieren und das Environment inRSTENV.BAT startfähig ablegen. Weil dieSicherung über die Variable PATH erfolgt,werden die Variableninhalte automatisch inGroßbuchstaben umgesetzt, sofern es sichdabei um Buchstaben handelt und die Inhaltenicht bereits in Großbuchstaben geschriebenwurden. Dies gilt allerdings auch nur bis zumAuftritt einer unlöschbaren Variable, wie imdritten Ausnahmegrund beschrieben.

Weil während der Sicherung diebestehenden Variablen nach Möglichkeitgelöscht werden müssen, damit dieautomatische Sicherung funktioniert, wirdRSTENV.BAT abschließend gestartet, um dasEnvironment wiederherzustellen. Folglichwerden dann alle, bzw. die meisten,Variableninhalte bereits in Großbuchstabenumgewandelt sein. Sollten sich in denVariableninhalten andere Trennungszeichenals das Leerzeichen befinden, so werden siedurch das Leerzeichen ersetzt. DieBeibehaltung der anderen Trennungszeichenist aus DOS-internen Gründen leider nichtmöglich.

Zum Schluß wird dann der Inhalt vonRSTENV.BAT zur Sicherheit angezeigt, damit

Page 60: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

60

man diesen Inhalt mit dem noch aktuellenEnvironment vergleichen kann. Der SETBefehl wirkt da ja bekanntlich Wunder.

Eine halbautomatische Lösung, bei der dieaus einem Wort bestehendenVariablennamen als Parameter an dieBatchdatei übergeben werden, ist zwarsicherer, aber leider auch nicht gerade sehrkomfortabel.

Aber wie gesagt: Dies ist nur einLösungsansatz, der in Zukunft weiterverfolgtund verbessert werden soll!

Umgebungsspeicher löschenAls Umgebungsspeicher, zu neudeutsch:Environment, bezeichnet man denSpeicherbereich vom DOS, der die Variablenenthält. Diesen Speicherbereich kann man jabekanntlich mit dem Befehl SET verändernoder anzeigen lassen:

COMSPEC=C:\COMMAND.COMPROMPT=$p$gPATH=C:\DOS;C:\BATCH;C:\WINDOWSTEMP=C:\tempOS=MS-DOSVER=6.22BDV=C:BDY=\BATCH\EV1=123456789012345678901EV2=1234567890123456789012EV3

Bei vollautomatisch ablaufenden Batchdateienkann das Löschen des Umgebungsspeicherssehr nützlich sein, damit wieder Platz fürneue Variablen geschaffen wird. Und genaudieses Löschen bewerkstelligt DELENV.BATbis zu einem gewissen Grad, sogar ohne dieVariablennamen zu kennen:

01: @echo off02: if %0==delenv if %1.==.:.. %003: if %2.==. if exist c:\batch\delenv2.bat

c:\batch\delenv.bat %1 .:.04: if %1.==. c:\batch\delenv.bat . .05: set path=%PATH%06: if %PATH%.==. set path=---07: set prompt=%PROMPT%08: set comspec=%COMSPEC%09: set temp=%TEMP%10: if %.:.%.==.:.. set .:.=11: if not %1.==PATH. set %1=12: echo @c:\batch\delenv.bat .:. .:.>c:\batch\delenv2.bat13: if exist c:\batch\delenv2.dat copy c:\batch\delenv2.dat

c:\batch\*.b*>nul14: if exist c:\batch\delenv2.bat set>>c:\batch\delenv2.bat

15: if not %1.==PATH. if not %2.==.:..c:\batch\delenv2.bat

16: if not %1.==.:.. if %2.==.:.. echo Ich konnte dieVariable %1 und die ihr folgenden Variablen nichtlöschen!

17: if not exist c:\batch\delenv2.bat echo Ich konnte denUmgebungsspeicher nicht löschen, weilDELENV2.BAT fehlt!

18: if %1.==.:.. if %2.==.:.. echo Kein löschen möglich, daDELENV2.DAT nicht oder fehlerhaft erstellt wurde!

19: if %PATH%==--- echo Die Pfadangabe muß neueingegeben werden!

20: if %PATH%==--- set path=21: if exist c:\batch\delenv2.bat del c:\batch\delenv2.bat

Die Laufwerks- und Verzeichnisnamenmüssen sowohl in DELENV.BAT, als auch inder selbst zu erstellenden DELENV2.DAT deneigenen Verhältnissen entsprechendangepaßt werden. Und mit diesen Eingabenerstellt man DELENV2.DAT:

copy con c:\batch\delenv2.dat<ENTER>@echo off<ENTER>c:\batch\delenv.bat<SPACE><STRG>+<Z><ENTER>

Dabei steht <ENTER> für die Enter- bzw.Return-Taste, <SPACE> für ein Leerzeichenund <STRG>+<Z> soll das Dateiendezeichensein welches man erhält, wenn man die TasteSTRG drückt, festhält und dann die Taste Zdrückt. Anstelle von <STRG>+<Z> reichtaber auch ein Druck auf <F6> aus!

Das Leerzeichen hinter c:\batch\delenv.batist ungemein wichtig und darf auf gar keinenFall vergessen werden!!! Wird diesesLeerzeichen nämlich vergessen,so muß DELENV.BAT vorzeitig abbrechen,ohne eine Variable gelöscht zu haben!

Hier die Funktionsweise von DELENV.BAT ingroben Zügen:

Weil DELENV.BAT die einzelnen Variablenaus dem Environment nicht kennt und auchnicht kennen soll, müssen die einzelnenVariablen als Parameter, beim Start vonDELENV.BAT angegeben werden. Aus diesemGrunde wird beim Start von DELENV.BAT dieDatei DELENV2.BAT gefertigt, die durchUmleitung des Befehles SET, ein Abbild desEnvironments aufnehmen muß:

@echo offc:\batch\delenv.bat OS=MS-DOSVER=6.22...usw.

Page 61: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

61

Sie startet nach dieser AufnahmeDELENV.BAT mit den Angaben OS und MS-DOS als ersten und zweiten Parameter neu.Zeile elf von DELENV.BAT kommt nun zumZuge und löscht die als Parameter %1übergebene Variable OS. Zwischenzeitlichwurde vom nun mehr verkleinertenEnvironment ein neues Abbildin die erneut gefertigte DELENV2.BATgepackt:

@echo offc:\batch\delenv.bat VER=6.22BDV=C:...usw.

Diese neue DELENV2.BAT startet also wiederDELENV.BAT und sorgt damit für dieLöschung der Variable VER. Theoretischwürde sich dieses rotierende System so langefortsetzen, bis keine Variable mehr existiert!

Aber dem aufmerksamen Beobachter wirdnicht entgangen sein, das die erste zulöschende Variable eigentlich COMSPEC hättesein müssen, wenn man das Abbild desEnvironments betrachtet, welches eingangsgezeigt wurde.

Weil es natürlich nicht sehr klug ist dasgesamte Environment zu löschen, schließlichsind Variablen wie PATH, PROMPT, COMSPECund TEMP für DOS und uns nützlich oder garnotwendig, werden diese Variablen vorher"gesichert". Sie werden durch die Zeilen fünfbis neun mit Ihrem eigenen Inhalt definiertund rutschen dadurch ans Ende desUmgebungsspeichers:

OS=MS-DOSVER=6.22BDV=C:BDY=\BATCH\EV1=123456789012345678901EV2=1234567890123456789012EV3PATH=C:\DOS;C:\BATCH;C:\WINDOWSPROMPT=$p$gCOMSPEC=C:\COMMAND.COMTEMP=C:\temp

Weil sie aber selbst dort nicht sicher sind, dasrotierende System löscht fast alles, fungiertdie Variable PATH als Grenze zwischen den zulöschenden und den zu erhaltenen Variablen.Sobald also DELENV.BAT die Variable PATHals ersten Parameter geliefert bekommt,

bricht sie das Löschen ab. Somit bleiben beidiesem Beispiel die Variablen PATH, PROMPT,COMSPEC und TEMP erhalten.

Für mich, bzw. meine Batchdateien, sind dieVariablen BDV und BDY ebenfalls sehrwichtig, weshalb ich die folgenden Zeilennoch zwischen die Zeilen neun und zehneinfüge, um auch BDV und BDY zu behalten:

set bdv=%BDV%set bdy=%BDY%

Nach diesem Schema können Sie also allewichtigen Variablen bewahren, wenn Siediese nach Zeile neun von DELENV.BATeinfügen! Auf jeden Fall sollte keine Variablevor der Zeile fünf eingefügt werden, weil alleVariablen, die vor PATH stehen, gelöschtwerden!In bislang nur einem bekannten Fall muß dasLöschen vorzeitig abgebrochen werden, daDELENV.BAT die Variable nicht löschen kann.Die Rede ist von EV3, die man im obendargestellten Environment entdecken kann.

Sie ist wie alle Variablen durch den SETBefehl entstanden, konnte aber nicht korrektangelegt werden, weil derUmgebungsspeicher während der Anlegungvoll wurde. Trotz intensivster Bemühungen istes mir bislang nicht gelungen, diese Variablewieder per SET Befehl zu löschen. Und genaudeswegen kann sie anscheinend auch nichtper Batchdatei gelöscht werden: Sie bleibtsolange im Environment, bis der Rechner neugestartet wird!!!

Es spielt keine Rolle wie die Variable beiIhnen heißt oder wie lang ihr Name ist,sobald sich eine Variable ohneGleichheitszeichen im Environment befindet,kann diese nach derzeitigem Kenntnisstandnicht vom DOS gelöscht werden.Somit muß das rotierende System vonDELENV.BAT fehlschlagen, wenn diefehlerhafte Variable an die erste Stelle desEnvironments hochgerückt ist. In Mitleiden-schaft sind all die Variablen gezogen, die sichdann zwischen der fehlerhaften und der PATHVariable befinden. Diese können dann auchnicht mehr gelöscht werden, weil dasEnvironment immer wieder mit der störendenVariable beginnt.

Immerhin habe ich DELENV.BAT sodressiert, daß es dieses Problem erkennt unddie Arbeit dann einstellt. Auch wenn die

Page 62: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

62

Variable PATH, die Datei DELENV2.DAT, dieDatei DELENV2.BAT nicht existiert, wird dasbemerkt und entsprechend reagiert. Selbsteinen unsinnigen Start von DELENV.BATdurch die Eingabe DELENV .:. .:. verzeiht siegroßzügig!

Selbst wenn eine brandgefährliche Variableim Environment vorkommen sollte, ich denkeda z.B. an FDISK, so wird dieserVariablenname nicht zum Start desgleichnamigen Programmes führen, welchesansonsten die gesamte Festplatte formatierenkönnte!!!!

Weil Kontrolle seit jeher besser alsVertrauen ist, kann man ja dieses Risikoherausfordern und eine Variable namensFORMAT definieren, die als Inhalt mit denWerten gesetzt wird, die ansonsten zurFormatierung einer 1.44MB Diskette imLaufwerk A: nötig sind:

set format=a: /f:1440

Nun sollte man eine Diskette ins Laufwerk A:einlegen, DELENV.BAT starten und abwarten.

Sollte sich aber in Ihrem Environment eineVariable befinden, in deren Name sich einLeerzeichen, oder ein ähnlichesTrennungszeichen, befindet, so wirdDELENV.BAT diese Variable nicht löschenkönnen und das führt zu einer Endlosschleife.D.h. DELENV.BAT wird nicht mehr beendet!

Wer DELENV.BAT auch tatsächlich in einenvollautomatisch ablaufendenBatchdateienverbund nutzen möchte, kanndies erreichen, wenn er DELENV.BAT um die22. Zeile ergänzt. Weil auch ich noch keinePatentlösung dafür habe, muß sich jederLeser selbst so seine Gedanken dazumachen.

GW-Basic auf dem PoFo!!!Nach dem also das GW-BASIC 3.22 aufmeinem PoFo lief, störte ich mich noch andem Bildschirmformat von 80 Zeichen und 25Zeilen. Der PoFo hat ja nur einBildschirmformat von 40 Zeichen und 8Zeilen, weshalb etliche Basicprogrammeunübersichtlich wirken.

Versuchsweise begann ich also dasProgramm GWBASIC.EXE zu patchen, hörteaber alsbald wieder damit auf, weil die Werte80 und 25, die es ja in 40 und 8 abzuänderngalt, etwa 3000 mal vorkamen. Das war mirdann doch zuviel Arbeit, so daß ich micheines einfacheren Lösungsweges besann undder Firma Microsoft mein Problem schilderte.Kurz darauf erhielt ich von Microsoft, es warnicht Bill Gates persönlich, den gewünschtenRückruf: �Weil die Entwicklung schon solangezurück liegt, ist es leider nicht möglich, diegewünschte Arbeit vorzunehmen.�

Also blieb es doch wieder an mir haften undich machte mich an diese langwierigeProzedur. Mit mehreren Basicprogrammenund Batchdateien, die sich gegenseitigaufriefen und die Ergebnisse festhielten, istes mir dann doch schon nach einer Stundegelungen, auf einem 386er PC mit 25 MHzwohlgemerkt, die Zeilenzahl von 25 auf 8abzuändern. Die Zeichenzahl von 80 mußteich kurioserweise nicht mehr ändern, da dasGWBASIC 3.22 dann problemlos auf demPoFo funktionierte. Dazu muß derBildschirmmodus �MODUS� im Systemmenü,auf Normal eingestellt werden. DieFunktionstasten werden dann allerdings nichtmehr komplett angezeigt, sondern nur dieersten fünf. Um die restlichen fünf sichtbar zumachen, muß man den Befehl KEY LISTverwenden.

Zwar ist die unterste, also die achte Zeile,nicht im Eingabemodus zu erreichen, aber siekann von den Programmen problemlosmitbenutzt werden. Bevor Ihr nun beginntEuer GWBASIC 3.22 mit dem unten stehen-den Basicprogramm zu patchen, solltet Ihrsicherheitshalber eine Kopie der DateiGWBASIC.EXE anfertigen.

Sollte nämlich die gepatchte Version nichtkorrekt auf dem PoFo funktionieren, so habtIhr immer noch die Originalversion für denPC!!!

Page 63: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

63

10 OPEN�gwbasic.exe� AS #1 LEN=1 20 FIELD #1,1 AS B$ 30 RESTORE 260 40 FOR A=1 TO 5 50 READ B,C 60 LSET B$=CHR$(C) 70 PUT #1,B 80 NEXT 90 FOR A=73923 TO 73985100 READ A$110 LSET B$=CHR$(VAL(�&H�+A$))120 PUT #1,A130 NEXT140 FOR A=22652 TO 22655150 READ A$160 LSET B$=CHR$(VAL(�&H�+A$))170 PUT #1,A180 NEXT190 RESTORE 320200 FOR A=77473 TO 77632210 READ A$220 LSET B$=CHR$(VAL(�&H�+A$))230 PUT #1,A240 NEXT250 CLOSE260 DATA 21942,0,21943,30,39445,0,39446,7,39471,8270 DATA 47,57,2D,42,41,53,49,43,20,33,2E,32,32,

20,2D,20280 DATA 50,6F,46,6F,20,56,65,

72,73,69,6F,6E,0D,0A,28,43290 DATA 29,20,43,6F,70,79,72,69,

67,68,74,20,4D,69,63,72300 DATA 6F,73,6F,66,74,20,31,39

,38,33,2D,31,39,39,33,0D310 DATA 0A,7F,7F,7F,7F,80,00,00,C9,00,28,00,

00,C9,00,77320 DATA 43,4C,53,27,0D,00,00,00,00,00,00,

00,00,00,00,00330 DATA 41,55,54,4F,20,00,00,00,00,00,

00,00,00,00,00,00340 DATA 47,4F,54,4F,20,00,00,00,00,00,00,00 ,00,00

,00,00350 DATA 4C,49,53,54,20,00,00,00,00,00,

00,00,00,00,00,00360 DATA 52,55,4E,0D,00,00,00,00,00,

00,00,00,00,00,00,00370 DATA 46,49,4C,45,53,00,00,00,00,00

,00,00,00,00,00,00380 DATA 4C,4F,41,44,22,00,00,00,00

,00,00,00,00,00,00,00390 DATA 53,41,56,45,22,00,00,00,

00,00,00,00,00,00,00,00400 DATA 4F,50,45,4E,22,00,00,00,00,00,

00,00,00,00,00,00410 DATA 53,59,53,54,45,4D,0D,00,

00,00,00,00,00,00,00,00

Dieses Programm habe ich mehrfach aufmeinem PC angewandt und immer einefunktionsfähige Basicversion für den PoFobekommen. Sollte es also nicht bei Euchfunktionieren, so kann ich Euch leider nicht

mit der angepaßten Version aushelfen, da siedem Copyright von Microsoft unterliegt.

Weitere Erkenntnisse zum GWBASIC 3.22:Es ist nicht alles Gold was glänzt und daher

gibt es einige Befehle des GWBASIC, die nichtauf dem PoFo funktionieren:

Circle, Draw, Line, Get (x1,y1)-(x2,y2), Put(x1,y1)-(x2,y2), Color, Pset, Preset, Paint -und alle weiteren Grafikbefehle Enter, OnTimer Gosub, On Key Gosub, On String(x)Gosub - und ähnliche InterruptgesteuerteBefehle

Die Notbremse STRG+PAUSE, mit denenman gewaltsam Basicprogramme auf dem PCabbrechen kann, ist auf dem PoFo dank derfehlenden Pause-Taste, nicht möglich.

Darum ist es notwendig, in jedemBasicprogramm für den PoFo, eineAbbruchfunktion selbst zu programmieren.Ich erledige das über die folgendeBefehlszeile:

xxx IF INKEY$=CHR$(27) THEN CLOSE:CLS:END

Diese Befehlszeile muß immer in demHauptteil des Programmes landen, damit mandas Programm dann auch mit der ESC-Tasteabbrechen kann. Setzt man diese Zeile in einUnterprogramm, die drei xxx stehen für dieZeilennummer, so kann das Programm nichtjederzeit abgebrochen werden, was ja nichtgerade wünschenswert ist. Ich habe bewußtdie ESC-Taste ausgewählt, weil ja damit auchjede der eingebauten Applikationen,verlassen wird. Außerdem wird sie so gut wienie von anderen Basicprogrammen benötigt!

Relative Dateien stellen auch ein Problemdar: Sie dürfen eine Maximalgröße nichtüberschreiten, die sich auf die augenblicklicheSektorengröße bezieht. Entweder ist alsonach 128, nach 256 oder nach 512 BytesSchluß. Sequentielle Dateien sind davon nichtbetroffen. Allerdings gilt diese Einschränkungnur für die PoFos mit den BIOS-Versionen1.030, 1.052 und 1.072!

Wer weitere Probleme mit GWBASICentdeckt oder mit dieser Ausführung nichtzurecht kommt, sollte darüber berichten,damit ich darauf eingehen kann.

"GROß und artig"Flexible Batchdateien sind oftmals aufParameter (%1 usw.) angewiesen, die der

Page 64: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

64

User beim Start der Batchdatei mitangebenmuß. Durch diese Parameter, das könnenZahlen, Zeichen, Wörter oder gar ganzeSätze sein, wird dann der Ablauf dergestarteten Batchdatei beeinflußt. DieseParameter auf Richtigkeit zu überprüfen, isteine nicht leichte Aufgabe für jede Batch-datei, ganz besonders wenn es sich umWörter handelt.

Denn es ist schon ein großer Unterschied,ob ich das Wort TEST in Großbuchstaben, alstest in Kleinbuchstaben oder gemischt alsTest schreibe.

Um dieses Problem der Groß-,Kleinschreibung und auch der gemischtenSchreibweise zu beheben, behalf ich mirzuerst mit z.B. folgenden Batchzeilen:

if %1==test echo Parameter korrektif %1==Test echo Parameter korrektif %1==TEST echo Parameter korrekt

um die häufigsten Schreibweisen desbenötigten Wortes TEST zu prüfen. Als ichdann mit der FOR-IN-DO Schleife vertrautwar, konnte ich diese Prüfung wie folgtverkürzen:

for %%a in (test Test TEST) do if %%a==%1 echoParameter korrekt

Doch leider werden die beiden Verfahrennicht mit den Schreibweisen TeST, TEst,teST, TesT usw. fertig, die durchüberhastetes Eintippen entstehen können.Bei kurzen Worten wie TEST kann man zwaralle Möglichkeiten im vorauseinprogrammieren, aber bei Worten wieDISKETTE oder FESTPLATTE wäre dieseintelligente Programmierung zu umfangreichund ineffektiv.

So kam ich nach eingehendenBeobachtungen und Versuchen zu dieserTechnik:

set oldpath=%PATH%path=%1set xyz=%PATH%path=%OLDPATH%if %XYZ%==TEST echo Parameter korrekt

Ihr ganzes Geheimnis liegt in der ZeilePATH=%1, die für die Umsetzung desParameters in Großbuchstaben zuständig ist.

Damit der PC auch später noch dieProgramme wiederfindet, wird derursprüngliche Pfad vorher gesichert undnachher wieder restauriert. Zum Schlußfindet man den Parameter %1 komplett inGroßbuchstaben geschrieben in der VariableXYZ und braucht zum prüfen nur noch eineAbfrage.

Bis ich zum ersten Mal die Fehlermeldung"Umgebungsspeicher voll" vom DOS zuGesicht bekam, konnte ich mich auch aufdiese Technik verlassen. Weil dieseFehlermeldung besagt, daß man keineweiteren Variablen anlegen kann, bevor mannicht einige andere Variablen gelöscht hat,kann es passieren das die Variablen OLDPATHund XYZ nicht oder fehlerhaft angelegtwerden.

Und wenn das passiert, dann kann diePfadangabe auch nicht mehr korrektrestauriert werden, was zu einer ganzenMenge Ärger führt: Schließlich wird der PCeinen Großteil der gespeicherten Programmenicht mehr starten können!

Als Alheilmittel wird dagegen der Aufrufeines zweiten Kommandointerpretersempfohlen, mit gleichzeitigem Neustart dero.g. Technik in Form einer Batchdatei. Sobaldaber der zweite Kommandointerpreterbeendet wird, ist auch die Variable XYZ undihre Definition wieder verschwunden. Einnachfolgender Batch wird, der auf XYZangewiesen ist, die Variable vergebenssuchen und sehr wahrscheinlich fehlerhaftenden. Das kann vom Abbruch mitFehlermeldung über den endlosen Ablauf derRoutine bis zum Verlust von Dateien reichen!So kam ich nach umfangreichemBrainstorming und etlicher Tests auf einesicherere Technik der Umwandlung, diehauptsächlich durch Parameter getragenwird. Nur die Variable PATH wird auchweiterhin verändert, da ohne sie bisher keineUmwandlung von Klein- in Großbuchstabenmöglich zu sein scheint.

Page 65: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

65

UPCASE.BAT:@echo offif not %0==%BDV%%BDY%upcase.bat goto offif %1.==. goto offif not %1.==.. if %2.==. goto offif not exist %2.bat if not exist %BDV%%BDY%nul goto offecho @echo off>%BDV%%BDY%pfad.batif not exist %BDV%%BDY%pfad.bat goto offecho path=%PATH%>>%BDV%%BDY%pfad.batpath=%1shiftif %1.==.. shiftif exist %1.bat call %1 %PATH% %2 %3 %4 %5 %6 %7

%8 %9set path=:loop1shiftif %1.==. goto offif %1.==:. goto loop2if not %1.==:. goto loop1:loop2shiftif not %1.==. if not exist %1\nul goto loop2if not %1.==. if %PATH%.==. set path=%1if not %1.==. if not %PATH%.==. if not %PATH%.==%1.

set path=%PATH%;%1if not %1.==. goto loop2:offif not exist %BDV%%BDY%pfad.bat if not exist %3.bat

echo Die Umwandlung ist unmöglich, weil der PFADnicht rekonstruiert werden kann!

if %PATH%.==. if exist %BDV%%BDY%pfad.bat call%BDV%%BDY%pfad.bat

if %PATH%.==. echo ACHTUNG: Der PFAD wurdegelöscht! Bitte neu eingeben.

Sie wird von der Batchdatei gestartet, die denParameter %1 in Großschrift umgewandelthaben will. Ein erstes Beispiel dafür istUPTEST1.BAT:

UPTEST1.BAT:@echo offif not %0==%BDV%%BDY%uptest1

%BDV%%BDY%upcase.bat %1 . %BDV%%BDY%%0 :%PATH%

echo.if %1.==BATCHING. echo %1 macht Spaß!!!if not %1.==BATCHING. goto errgoto off:errecho Probieren Sie doch einmal das Wort BaTcHiNg

aus...:offecho.

Um dem Beispiel gerecht zu werden, mußUPTEST1.BAT mit dem Wort Batching alsersten Parameter gestartet werden. Und daskönnen z.B. folgende Eingaben sein:

UPTEST1 BATCHingUPTEST1 BATchINGUPTEST1 BaTcHiNg

Ein Beispiel für die Parameter beim Start vonUPCASE.BAT, durch Zeile zwei derUPTEST1.BAT veranlaßt, könnte sein:

BaTcHiNg . c:\batch\uptest1 : C:\DOSC:\BATCH C:\WINDOWS

Und das macht UPCASE.BAT mit diesenParametern:

BaTcHiNg - umwandeln in BATCHING- löschen durch SHIFT-Befehl

c:\batch\uptest1 - Batchdatei starten, da sie das WortBATCHING haben will:- löschen durch SHIFT-Befehl

C:\DOS - Pfadangabe wiederherstellen: PATH=C:\DOS;C:\BATCH - Pfadangabe wiederherstellen:

PATH=C:\DOS;C:\BATCH;C:\WINDOWS - Pfadangabe wiederherstellen:

PATH=C:\DOS;C:\BATCH;C:\WINDOWS

Bevor UPCASE.BAT aber die Pfadangaberestauriert, ruft es die ursprünglicheBatchdatei, hier: UPTEST1.BAT, inklusiveneun Parameter auf. UPTEST1.BAT kann nunden Parameter %1, das Wort BATCHING,prüfen und entsprechend reagieren. Am Endekommt wieder UPCASE.BAT zum Zuge, damitdie Pfadangabe restauriert wird.

Zwar werden beim besagten Restart vonUPTEST1.BAT, in Zeile zwölf derUPCASE.BAT, noch die Parameter %2 bis %9mitübergeben, aber da UPTEST1.BAT sienicht benötigt, bleiben sie unbeachtet.

Um die Übergabe und Verwendung dieseracht Parameter zu demonstrieren, habe ichdie Batchdatei ZU.BAT aus der Ausgabe12/95, Seite 212-214, umgeschrieben undfür UPCASE.BAT aufbereitet:

ZU.BAT: 1: @echo off 2: if not %0==%BDV%%BDY%zu

%BDV%%BDY%upcase.bat %1 . %BDV%%BDY%%0%2 : %PATH%

3: if not %2.==. if exist %2\nul echo if not %%1.==. if%%1.==%1. cd %2>>%BDV%%BDY%zu.bat

4: rem Hier landen die gewünschten und geprüftenVerzeichnisse:

Die Syntax von ZU.BAT lautet auchweiterhin: ZU KurznameLaufwerk+Verzeichnis. So wird durch deneinmaligen Start mit der Eingabe "ZU ute

Page 66: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

66

C:\TEXTE\PRIVAT\UTE" ein schneller Ver-zeichniswechsel in C:\TEXTE\PRIVAT\UTEermöglicht, wenn man bei späteren Startsnur "ZU ute" oder auch "ZU UTE" eingibt.

Beim ersten Start sind also zwei Parameter,%1 und %2, nötig, damit man später ZU.BATnur noch mit einem Parameter, %1,aufzurufen braucht und in den Vorteil deseinfachen Verzeichniswechsels kommt.

Um die Funktionsweise dieserParameterübergabe zu verstehen, stellen wireinmal die Zeilen mit der Nummer zwei ausUPTEST1.BAT und ZU.BAT gegenüber:

if not %0==%BDV%%BDY%uptest1%BDV%%BDY%upcase.bat %1 . %BDV%%BDY%%0: %PATH%

if not %0==%BDV%%BDY%zu%BDV%%BDY%upcase.bat %1 . %BDV%%BDY%%0%2 : %PATH%

Ins Auge springen sollte dieParameterangabe %2 in der Zeile ausZU.BAT, da sie in der Zeile von UPTEST1.BATnicht zu finden ist. Demnach wird alsoC:\TEXTE\PRIVAT\UTE aus unserem Beispielzu ZU.BAT, als weiterer Parameter anUPCASE.BAT gegeben, wenn dieser als %2hinter %BDV%%BDY%%0 eingefügt wird.Für UPCASE.BAT ist dieser Parameter zwarnicht wichtig, aber sie gibt ihn doch beimRestart von ZU.BAT zurück, weil dieserParameter ansonsten verloren wäre.Und so kann man alle neun Parameter ausder eigenen Batchdatei zur Sicherung anUPCASE.BAT geben:

if not %0==%BDV%%BDY%batchdateiname%BDV%%BDY%upcase.bat %1 . %BDV%%BDY%%0%2 %3 %4 %5 %6 %7 %8 %9 : %PATH%

Welche Parameter man dabei verwendet oderin welcher Reihenfolge man diese schreibt,das bleibt einem selbst überlassen.Hauptsache ist, daß der Parameter, der inGroßbuchstaben umgewandelt werden soll,hinter %BDV%%BDY%upcase.bateingetragen wird!

Der Doppelpunkt vor %PATH% soll durchseine Anwesenheit der UPCASE.BAT klarmachen, das die auf ihn folgenden Parameterden ursprünglichen Inhalt der Pfadangabedarstellen. Wenn die also auf denDoppelpunkt folgenden Parameter auchtatsächlich Verzeichnisse darstellen,

UPCASE.BAT prüft auch das, so landen dieseParameter wieder in der Variable PATH.

Wird beim Aufruf der Batchdatei, die dieUmwandlung eines Parameters inGroßbuchstaben wünscht, vergessen einParameter anzugeben, so schützt der Punktvor %BDV%%BDY%%0 vor Fehlfunktion vonUPCASE.BAT. Vorausgesetzt, man hat diesenPunkt selber nicht beim schreiben der Zeilezwei vergessen!

Wer UPCASE.BAT nutzen möchte, muß mitdiesen Zeilen seine Batchdatei beginnen,damit UPCASE.BAT benutzt werden kann:

@echo offif not %0==%BDV%%BDY%batchdateiname

%BDV%%BDY%upcase.bat %1 . %BDV%%BDY%%0%2 %3 %4 %5 %6 %7 %8 %9 : %PATH%

Anstelle von Batchdateiname muß man denbis zu achtstelligen Namen dieser Batchdateieintragen. Wichtig dabei ist, das alleDateinamen in Kleinbuchstaben geschriebenwerden! Diese Zeile zwei ist in SachenParameterreihenfolge und -anzahl als Stan-dardbeispiel zu verstehen und den eigenenWünschen gemäß anzupassen. Wer abermeine Erklärungen dazu nicht verstandenhaben sollte, sollte dieses Beispiel in allenBatchdateien verwenden, die UPCASE.BATbenutzen sollen!

Wer es mag, kann noch zwischen denbeiden Zeilen eine Zeile einfügen, die dasVorhandensein des ersten Parameters prüftund im negativen Falle, z.B. zu einerSprungmarke führt, die den Bediener auf denfehlenden Parameter hinweist und dieBatchdatei anschließend beendet.

Ausgefuchste Freaks, d.h. sehr gute Batch-programmierer, können UPCASE.BAT auchdurch Ergänzung um eine 29. Zeile, sogestalten, daß UPCASE.BAT vollautomatisch,in einem Verbund von Batchdateien, desNachts arbeitet!

Es ist nicht notwendig UPCASE.BAT zuverstehen, aber man muß wissen dasUPCASE.BAT immer nur einen Parameter undauch nur den ersten übergebenen Parameter,pro Durchlauf, in Großbuchstaben umwan-delt!

Für den Fall der Fälle, Verlust der VariablePATH, hat UPCASE.BAT auch einigeSicherheitsmaßnahmen eingebaut und brichtdie Umwandlung möglichst vor dem Verlust

Page 67: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

67

ab. Sollte dennoch einmal eine so unglück-liche Konstellation zum Verlust der VariablePATH führen, so wird UPCASE.BAT dieseswenigstens melden und seine Tätigkeiteinstellen.

Ungefährliche Testläufe kann man auch mitUPTEST2.BAT fahren und lernt durchaufmerksame Beobachtung, wie UPCASE.BATarbeitet:

UPTEST2.BAT:@echo offif not %0==%BDV%%BDY%uptest2

%BDV%%BDY%upcase.bat %1 . %BDV%%BDY%%0%2 %3 %4 %5 %6 %7 %8 %9 : %PATH%

clsecho.echo Die Parameternamen stehen nicht immer genau

über dem Parameterinhalt!echo.echo %%1 %%2 %%3 %%4 %%5 %%6 %%7 %%8 %%9echo %1 %2 %3 %4 %5 %6 %7 %8 %9echo.

Den ersten Test sollte man durch die Eingabevon:UPTEST2 Hallo! a b c d e f g hstarten und bei jedem weiteren Test einenBuchstaben weglassen.

KnowHow: BatchingDas kleine Einmaleins für DOSEin Computer der nicht rechnen kann, dürfteerst gar nicht Computer genannt werden.Dennoch schimpft man die PC's so, obwohlihr Betriebssystem nicht in der Lage ist,Berechnungen durchzuführen. Dummesdos,oder wie hieß der Haushaltsreiniger nocheinmal?

Aber DOS ist ja auch sehr flexibel und lerntimmer wieder dazu. So konnte ich es perBatchdateien testweise zu kleinenBerechnungen überreden. Weil ich dieErgebnisse später in anderen Batchdateienverwenden will und DOS auch nur ganze undpositive Zahlen verarbeiten kann, werdenNegativergebnisse zu 0 und krumme Werteeinfach abgerundet.

Den Beginn macht die BatchdateiRECHNE.BAT, mit der die Berechnunggestartet wird. Folgende Aufrufe sind z.B.denkbar:

RECHNE 0 + 8RECHNE 7 - 9

RECHNE 5 * 2RECHNE 1 : 4RECHNE + 3RECHNE 6 -

Anhand des Rechenzeichens wird dann dieBatchdatei PLUS.BAT, MINUS.BAT, MAL.BAToder GETEILT.BAT gestartet. Weil dasallgemeinübliche Zeichen "/", um Zahlen zuteilen, unter DOS eine bestimmte Funktioninne hat, mußte ich auf das Zeichen ":"ausweichen. Kommen wir aber nun zu dennötigen Batchdateien, hier RECHNE.BAT:

@echo offclsset z1=%1set op=%2set z2=%3set g=gotorem Volle Syntax angegeben?if not %3.==. %g% runrem Syntax unvollständig, mit E sollrem also weitergerechnet werden!rem Ist E leer, so wird E zur 0:if %e%.==. set e=0rem Entspricht E einem Wert von 0 bisrem 10 ? Wenn ja, so kann mit Erem gerechnet werden.if %e%==0 %g% wif %e%==1 %g% wif %e%==2 %g% wif %e%==3 %g% wif %e%==4 %g% wif %e%==5 %g% wif %e%==6 %g% wif %e%==7 %g% wif %e%==8 %g% wif %e%==9 %g% wif %e%==10 %g% wrem E war kein Wert zwischen 0 und 10!echo Mit dem Ergebnis %e% kann nichtecho weitergerechnet werden!!!rem Abbruch durch Sprung zu :off%g% offrem E liegt zwischen 0 und 10:wrem Ist %1 ein Rechenzeichen, so sollrem E als erste Zahl gelten.if %1==+ %g% 1if %1==- %g% 1if %1==* %g% 1if %1==: %g% 1rem %1 war kein Rechenzeichen, folg-rem lich soll E als z2 gelten.set z2=%e%%g% run:1rem %1 war ein Rechenzeichen, deshalbrem müssen die Werte neu definiertrem werden.

Page 68: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

68

set z2=%2set op=%1set z1=%e%:runrem Volle Syntax vorhanden, bzw.rem hergestellt, die Berechnung kannrem beginnen.if %op%==+ plus %z1% %z2%if %op%==- minus %z1% %z2%if %op%==* mal %z1% %z2%if %op%==: geteilt %z1% %z2%:errrem Syntax unbekannt oder fehlend:echo Aufruf z.B. mit:echo RECHNE 5 + 7, o. RECHNE 1 - 8, o.echo RECHNE 2 * 0, o. RECHNE 9 : 3, o.echo RECHNE 4 + , o. RECHNE 6 - usw.echo Zahlen von 0 bis 10 sind erlaubt!:off

Weil die eigentlichen Batchdateien, die dieBerechnungen durchführen zu umfangreichsind, hier ein Ausschnitt aus PLUS.BAT:

@echo off%g% %1%2:00set e=0%g% o:01:10set e=1%g% o

....

:oecho %e%

Beschäftigen wir uns nun zunächst mitRECHNE.BAT:

Die übergebenen Parameter werden inVariablen gespeichert, wie auch der BefehlGOTO, der somit in allen Batchdateien durch%g% ausgeführt wird.

Wird die volle Syntax eingehalten, alsobeide Zahlen und die Rechenart alsParameter übergeben, so ist %3 als Zahldefiniert. DOS springt deshalb zur Marke RUNund fährt dort fort. Ist aber %3 nichtdefiniert, so geht DOS davon aus, das das inE gespeicherte Ergebnis, zur Neuberechnungherangezogen werden soll und arbeitet dienächste Zeile ab, in der die Variable E mit 0definiert wird, sofern E nicht definiert war.Dieser Fall kann theoretisch nur dannauftreten, wenn man zum ersten mal etwasberechnen läßt und beim Aufruf eine Zahlvergißt, oder absichtlich wegläßt.

Wenn E zur Berechnung herangezogenwerden soll, so muß DOS jetzt prüfen, ob Eüberhaupt einem der erlaubten Werte 0 bis10 entspricht. Im positiven Falle, geht DOSzur Sprungmarke :w. Im negativen Falle wirdeine entsprechende Meldung auf den Schirmgebracht und anschließend komplettabgebrochen.

Gelangt DOS zur Sprungmarke :w, so mußes nun abklären, ob das letzte Ergebnis alserste oder zweite Zahl in die Berechnungeinfließen soll. Dafür prüft es den Parameter%1 ab, ob dieser als Rechenzeichen definiertwurde. Tritt dieser Fall ein, so verzweigt DOSnun zu der Sprungmarke :1, wo es dieVariablen umdefiniert, das Ergebnis aus Eeinbindet und damit wieder die volle undkorrekte Syntax erreicht. Soll aber dasErgebnis als zweite Zahl gelten, so muß nurdie Variable Z2 mit dem Inhalt von E definiertwerden, damit die gestellte Aufgabe derkorrekten Syntax entspricht.

Letztendlich landet man aber bei derSprungmarke :RUN, die die Variable OP prüftund die entsprechende Batchdatei aufruft, diedie Berechnung durchführen soll. Ist OP z.B.als + gesetzt, so wird PLUS.BAT inkl. beiderZahlen aufgerufen.

Besprechen wir also nun die DateiPLUS.BAT, die beispielsweise die Zahlen 1und 0 addieren soll:

Durch die Zeile %g% %1%2 wird aus denbeiden Zahlen 1 und 0 eine Sprungmarkegebildet, nämlich :10, die durch den BefehlGOTO, der in der Variable %g% gespeichertist, angesprungen wird. Die Variable E wirddaraufhin mit dem Ergebnis 1 definiert.Anschließend wird mit %g% o zur Marke :ogesprungen. Sie gibt nun das Ergebnismittels ECHO %E% auf dem Schirm raus.Theoretisch ist damit die Berechnungbeendet, aber praktisch gesehen muß ichnoch ein paar Erklärungen abgeben:

Bei etlichen Berechnungen entsteht oftmalsdasselbe Ergebnis. Daher wird zwar jedeSprungmarke angesprungen, die sich aus denübergebenen Zahlen konstruiert, aber erstetliche Zeilen später, wird das Ergebnis durchSET E "errechnet". In Wirklichkeit wird ja nurdas logische Ergebnis, welches ichvorprogrammiert habe, ermittelt undausgegeben.

Page 69: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

69

Hätte ich jeder Sprungmarke gleich dieentsprechende SET E-Anweisungnachgestellt, so wäre der Speicherbedarf umein vielfaches angestiegen! Zu dieserErkenntnis, mit den oftmals gleichenErgebnissen, kam ich aber auch erst relativspät. Es bedurfte erst drei vorhergehendenVersionen, die von anfangs 30KBProgrammlänge auf nun 5KBzusammenschrumpften!

Wie und wofür man die Ergebnisseweiterverarbeitet, überlasse ich nun Euch.Auf jeden Fall kann man damit viele Routinengestalten, wenn man diese Dateien rekursivnutzbar macht.

KnowHow: MS-DOSFehlverhalten des Befehles SETunter MS-DOS!Unter MS-DOS gibt es manchmal einProblem, wenn man eine Variable mit SETsetzen mochte. So erhält man desofteren dieFehlermeldung das der "Umgebungsspeichervoll!" ist. Da eine Batchdatei, die eineVariable setzt, meist auf diese Variableangewiesen ist, kann das katastrophaleAuswirkungen haben, wenn diese Variableeben nicht existiert (Datenverlust o.a. jenach Batchdatei)!!!

Normalerweise kann man dieses Problemwie folgt beheben, muß aber mit der o.g.Fehlermeldung leben, wenn das Environment(der Umgebungsspeicher) voll ist:

SET O=PIF %O%.==. GOTO OFFremrem Rest der Routinerem:off

Eine Batchdatei mit diesen Zeilen bewahrtden Anwender vor dem Datenverlust, weil siebei nicht vorhandener Variable O rechtzeitigaussteigt!

Jede Batchdatei, die Variablen erzeugt,sollte also immer prüfen, ob die geradegesetzte Variable auch existiert undgegebenenfalls rechtzeitig aussteigen.

Aber leider kann sich dieses Problem geradeunter MS-DOS noch schlimmer auswirken:

Bei mir ist es schon desofterenvorgekommen, das der Platz im Environmentnicht mehr fur die ganze Variable ausreichte.So wollte ich z.B. eine Variable EV3 setzen,die mit einer Zahlenkolonne wie:0123456789012345678901234567 definiertwerden sollte. Wenn ich Gluck hatte, dannwurde diese Variable wenigstens noch sogesetzt:

EV3=0123456788901234

Dann kann ich wenigstens noch die EV3wieder löschen, da sie nicht vollstandiggesetzt wurde:

SET EV3=0123456789012345678901234567IF NOT %EV3%.==0123456789012345678901234567.

SET EV3=IF %EV3%.==. GOTO OFF

Page 70: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

70

Aber im krassesten Fall hatte ich dann dasfolgende Abbild vom Environment:

COMSPEC=C:\COMMAND.COMPATH=C:\DOS;C:\BATCHPROMPT=$P$GTEMP=F:\OS=MS-DOSVER=6.22BDV=C:BDY=\BATCH\LG=049MSG=2EV3

Im Environment ist zwar die ZeichenfolgeEV3 zu sehen, aber kein Gleichheitszeichenund keine Definition mehr! Was ich auchversuchte, ich konnte diese Zeichenfolge EV3nicht mehr mit dem SET-Befehl löschen!!!Nur über DEBUG gelang mir das löschen perHand!

Die meisten Batchprogrammierer wurdennun mit den Achseln zucken und sagen:"Naund? Mit dieser Variablen-Leiche kann ichleben!".

Aber ich kann es nicht, da ich auchBatchdateien habe, die das Environmentmanipulieren (z.B. vollautomatisch dieReihenfolge der Variablen umstellenkönnen)!!!!

Sobald also so eine Variablen-Leiche imEnvironment steckt, müssen meine Routinendie Waffen strecken und vorzeitig abbrechen- ich habe sie auch darauf getrimmt.

Ich habe wegen dieses, fur mich sehrrelevanten Problems, bereits mit Microsoftund anderen Batchexperten kommuniziert -ohne Erfolg! MS denkt z.B. auch nicht daran,die fehlerhafte COMMAND.COM zuüberarbeiten weil DOS fur sie (MS) tot ist!!!

Ob dieses Problem unter PC-DOS,NovellDOS oder auch PTS-DOS existiert, istmir nicht bekannt! Auf jeden Fall gibt esunter 4DOS und auf meinem PoFo keineVariablenleichen, wie ich durch intensiveTests feststellte.

Ich habe dennoch nicht die Flinte ins Korngeworfen und versucht dieses Problem in denGriff zu bekommen - und tatsächlich gibt eseine Losung, die sogar die Fehlermeldung"Umgebungsspeicher voll!" nicht erscheinenlaßt:

@echo offremrem How to solve the problem with environmententries

without equal-sign orrem with a full environment! (knowned at MS-DOS)remrem C:\BATCH\TRYTOSET.BAT - this filerem C:\BATCH\TTS2.BAT - made by

C:\BATCH\TRYTOSET.BATremrem SYNTAX: TRYTOSET VARIABLE=DEFINITIONrem SYNTAX: CALL C:\BATCH\TRYTOSET.BAT

VARIABLE=DEFINITIONremrem written by: Lars Aschenbach, Germanyremif %1%2.==. goto errif %2.==. goto errif %3.==@. goto nextif %COMSPEC%.==. goto errecho @set %1=%2>c:\batch\tts2.batif not exist c:\batch\tts2.bat goto errecho @if %%%1%%.==. c:\batch\trytoset.bat %1 %2

@>>c:\batch\tts2.batif exist c:\batch\tts2.bat %COMSPEC% /c

c:\batch\tts2.bat>nul:nextif %0.==trytoset. if %3.==@. echo Can't set the variable

%1!if %0.==TRYTOSET. if %3.==@. echo Can't set the

variable %1!if %3.==. set %1=%2:errif %1%2.==. echo The name and the definition of the

variable is missing!if %2.==. echo Definition of the variable is missing!if %COMSPEC%.==. echo The variable COMSPEC is

missing!if not %COMSPEC%.==. if not exist c:\batch\tts2.bat echo

Disk is full!if exist c:\batch\tts2.bat del c:\batch\tts2.bat

Weil das Problem international bekannt undreproduzierbar ist, habe ich die Meldungen inEnglisch gehalten und will diese Losung auchnoch an einige bekannte Batchexpertenschicken!

Will man nun z.B. im Direktmodus dieVariable O anlegen und mit P definieren, soruft man diese Batchdatei mit der Eingabe:TRYTOSET O=P auf.

In einer Batchdatei konnte TRYTOSET.BATso eingebunden werden, wenn nicht einParameter als Variable oder Definition inFrage käme (CLTST1.BAT):

@echo offcall c:\batch\trytoset.bat o=pif not %o%.==p. echo The environment must be full!if %o%.==p. echo Well done!

Page 71: Batch dateien handbuch

Batch

© Lars Aschenbach - Batchprogrammierung - 06-03-04

71

Und so lautet die Einbindung vonTRYTOSET.BAT, wenn der Parameter %1 alsVariablenname und der Parameter %2 alsDefinition genutzt werden soll (CLTST2.BAT):

@echo offcall c:\batch\trytoset.bat %1 %2set | find /i "%1=%2">nulif errorlevel 1 echo The Environment must be full!if not errorlevel 1 if errorlevel 0 echo Well done!

Aber selbst bei diesen Losungen tauchenneue Probleme auf: Wird die HilfsdateiTTS2.BAT ein Null-Langen-File, also dieDiskette muß voll sein, so kann nichtversucht werden die gewünschte Variable zusetzen!Ist das Programm FIND unauffindbar, weilPATH leer oder inkorrekt, so wirdCLTST2.BAT fehlschlagen!

Dennoch ist TRYTOSET.BAT weitaussicherer als der SET-Befehl und wird daherdemnächst verstärkt in meinen Batchdateienauftauchen. Die Verzeichnisse werden dannauch durch die Variablen BDV und BDYersetzt worden sein.

Page 72: Batch dateien handbuch

Stichwort

© Lars Aschenbach - Batchprogrammierung - 06-03-04

72

�LW&DISK.BAT, 7(*.*), 8@, 47@cls, 20@DEL %1, 13@DIR %1, 13@echo, 45ANSI.SYS, 28; 31ATTRIB-Befehl, 37AUTOEXEC, 42AUTOEXEC.BAT, 44batch, 49BIOS, 29BUFFERS, 31CHKDSK, 22; 31CHKDSK /F, 14CHKDSK /V, 14CHKVAR, 28CHKVAR.BAT, 28CLOCK$, 13con, 33CONFIG.SYS, 27; 31; 44copy, 19; 21; 22; 42; 43DATE, 22defrag, 34DEFRAG.BAT, 34del, 11DIR, 22DISKFOLIO, 16DVV.BAT, 35DVV2.DAT, 35ECHO, 9; 19ECHO,, 22errorlevel, 25FILES, 31FolioDrive, 16FORMAT, 22GW-BASIC, 38; 52gwbasic.exe, 46HELP, 22HELP., 22if exist, 32INKEY$, 53KEY LIST, 52Klammeraffen, 22LABEL, 31message, 42MS-DOS, 44Multiprocessing, 39nul, 13; 17; 21; 34; 36; 38; 40; 46OPTIONVAR, 25path, 39PoFo, 8; 27

print, 24prn, 36PROMPT$h$h, 47Ramdisk, 38set, 33SET OPATH, 39SET VAR, 42SHIFT, 20Steuerzeichen, 38STRG+ALT+EINF, 31Syntax, 8SYSTEM, 38Temporäres Verzeichnis, 8TIME, 22TYPE, 34Umgebungsspeicher voll, 16Unrecognized command, 31Variable, 35; 41; 45Wildcards, 12; 19