Sie sind auf Seite 1von 72

125

KnowWare
e e ! Stapelverarbeitungsdateien
Fr
Start mit

BATCH
Programmierung
Ideen & Beispielsammlung
fr DOS - relevant unter Windows 9x

?
@echo off

!
if %2.==.goto err
copy %1 %2 > nul
del %1
goto off
:err
echo Zielangabe fehlt!
:off

Lars Aschenbach

www.KnowWare.de 2. Ausgabe
2 KnowWare

Start mit BATCH Programmierung


Lars Aschenbach, lasche68@cs.com
2. Ausgabe, 3. Auflage, 1996-10, 4. Auflage 2001-04
ISBN 3-931666-25-5
Copyright 2001, Autor und KnowWare

www.knowware.de

Lars Aschenbach - Batchprogrammierung - 06-03-04


Inhalt 3

Das kleine DOSsier ............................. 5 Variablen tilgen ................................ 41


Laufe ich auf dem PoFo oder dem PC? ... 6 bergeordnetes Verzeichnis lschen .... 42
Laufwerk vorhanden, Diskette Vermeidung von endlosen Eingaben .... 42
eingelegt? ....................................... 9 FASTDEL.BAT - lschen ohne Rckfrage43
Ausgeklammert? .............................. 11 FASTPRNT.BAT - Massendrucksache .... 44
Die Entwicklung................................ 12 Fiese Verzeichnisse ........................... 44
Der gute Ton ................................... 12 CTRL.BAT - Steuerzeichen in Variablen 45
KILL.BAT - lschen mit Reserve .......... 13 Verzeichnis verschieben ..................... 45
Verzeichnisanlage mit folgendem Multiprocessing mit dem PoFo............. 46
Verzeichniswechsel ......................... 13 Kurzfristige Pfadnderung .................. 46
Eine Zeitschleife im DIP-OS................ 14 Eine zweite Ramdisk namens D: ......... 47
Datei verschieben ............................. 14 Rekursive Batchdateien ..................... 47
Der Agentenaustausch ...................... 14 Verzeichnis umbenennen ................... 48
Fehlerhafte Eingaben minimieren ........ 16 Variablen umbenennen & kopieren ...... 49
Label lschen ................................... 17 Schalt-Technik ................................. 50
Die geheimen Optionen /F und /V ....... 17 Ur-Startlaufwerk ermitteln! ................ 50
DOS Fehlermeldungen....................... 18 Eine unlschbare Variable simulieren! .. 51
Exklusives Datei lschen.................... 18 SYSTEMFEHLER -Verzeihung! ............. 52
IF ... ECHO .>Datei ........................ 19 Vergaloppiert & -kopiert? ................... 52
In einem Atemzug ............................ 20 UPDATE.COM & PORTDIV.COM............ 53
Stringbearbeitung unter DOS ............. 21 Wo bin Ich? ..................................... 53
Batchdateien in der Literatur .............. 22 Auch Kleines wird einmal Gro............ 54
Leerzeilen bei der Bildschirmausgabe GW-Basic auf dem PoFo - Teil 3 .......... 56
durch Batchdateien? ....................... 22 Spielereien mit dem PROMPT .............. 57
Wildcards * ? - Teil 2 ........................ 23 Die automatische Sicherung des
Sprungmarken - Teil 3 ...................... 24 Environments................................. 58
Bedingtes SHIFTen ........................... 24 Umgebungsspeicher lschen............... 60
Das Gert NUL ................................. 25 GW-Basic auf dem PoFo!!!.................. 62
Ein DOS vor Version 3.30 .................. 26 "GRO und artig" .............................. 63
Erste Hilfe!!! .................................... 27 Das kleine Einmaleins fr DOS ............ 67
4DOS fr den PoFo und andere MS-DOS Fehlverhalten des Befehles SET unter
Pockets ......................................... 27 MS-DOS! ....................................... 69
ALLREAD.BAT - fr Leseratten ............ 28 Der Lupus Basicus - eine Erweiterung
ANSI.SYS-TIP: Escapesequenz ........... 28 des brehmschen Tierleben ............... 71
Batch bearbeitet das Batchverzeichnis . 29
Befehle in Variablen .......................... 30
Printer-Adapter & CE-126P................. 32
Umlaute an- oder abschalten! ............ 33
Variablen einchecken ........................ 33
Tastatureingaben in Batchdateien?...... 35
Unbekannter Befehl in der CONFIG.SYS 36
Die versteckte Datei des PoFo ............ 37
Verzeichnis kopieren ......................... 38
Nun mach aber mal einen Punkt! ........ 38
Countdown - der Computer lernt zhlen39
Viele Dateien - ein Datum .................. 40
Dateinamen in Variablen.................... 40
Aufrumarbeiten .............................. 41
Verzeichnis lschen........................... 41

Lars Aschenbach - Batchprogrammierung - 06-03-04


4 Vorwort

Vorwort

Batchdateien sind wahre Helferlein bei


der tglichen PC / EDV-Arbeit. Vielen
Programmen sind mit zustzliche *.BAT
vorangestellt um Treiber fr
Netzwerkkarten, Modem, ISDN etc. zu
laden. Da die tgliche Arbeit mit dem PC
mit Batchdateien wesentlich erleichtert
werden kann ist, eingefleischten DOS -
Fans durchaus bekannt. Nach wie vor
laufen reine DOS Programme, meist um
Faktor 10 schneller als Programme die
eine grafische Benutzeroberflche
benutzen WINDOWS / GEM / MAC etc.
Besonders im Netzbetrieb in Verbindung
mit Datenbanken ist auf DOS und somit
auf Batchdateien und Routinen nicht zu
verzichten.

Lars Aschenbach hat sich in den letzten


drei Jahren sehr intensiv mit der
Batchprogrammierung unter verschiede-
nen Betriebssystemen
auseinandergesetzt und uns eine kleine
Auswahl seiner gesammelten Werke, die
alle ohne Kopierrecht wiederverwendet
werden drfen, unentgeltlich zur
Verfgung gestellt.

Lars ist sehr daran interessiert, weitere


BATCHES kennenzulernen. Wer welche
hat - bitte per Email schicken.

Wer von euch keine Lust auf die


Tipparbeit hat oder mehr Batches
kennenlernen mchte, kann
Christian Peter, Im Osterbach 5, 36211
Alheim
einen Scheck ber DM 10.- schicken und
bekommt eine gute Auswahl mit allen
Erklrtexten zugeschickt.
Und nun heit es: batch as batch can...

Lars Aschenbach

Lars Aschenbach - Batchprogrammierung - 06-03-04


Batch 5

Das kleine DOSsier der Russe zuvor verstehen. Mal abgesehen


davon das es meines Wissens nach keinen
Jeder Computer bentigt ein Programm, Computer gibt, der mit Taschentchern
damit sein Bediener mit ihm kommunizieren ausgeliefert wird oder wurde!
kann. Schlielich mu der Computer das ber Auch wenn das DOS von den jeweiligen
die Tastatur eingegebene analysieren und Herstellern z.T. ber die Jahre hinweg
ausfhren, damit der Bediener sein weiterentwickelt und bedienerfreundlicher
gewnschtes Ziel erreicht. gemacht wurde, soweit ist es heute noch
Dieses Programm nennt man nicht, das es die komplette englische Sprache
Betriebssystem, da es den gesamten Betrieb verstehen wrde. Das es berhaupt
im Computer systematisch steuert und die weiterentwickelt wurde, kann man an meh-
Vorgaben des Bedieners zu erfllen hat. reren Ziffern sehen, die meistens dem Wort
Sklave Betriebssystem, denn nur der DOS folgen.
Bediener befiehlt seine Ttigkeit, ist Einige Beispiele sind: MS-DOS 6.22, PC-
hauptschlich dazu da, die Daten des DOS 6.3, MSX-DOS 2.31 und DIP Operating
Bedieners zu speichern, auszufhren und zu System 2.11. Doch zurck zu den Befehlen,
verwalten. Weil schon alt zu nennende mit denen man das DOS also zur Arbeit
Computer nur ber Disketten als Datentrger antreibt: Bei den ersten DOS-Versionen
verfgten, nannte und nennt man das waren nur solche Befehle erlaubt, die das
Betriebssystem auch heute noch Disk DOS intern gespeichert hatte. Aus diesem
Operating System, kurz DOS. Grunde nennt man solche Befehle auch
Auch wenn es heute DOS-Versionen wie interne Befehle. Durch die Weiterentwicklung,
MS-DOS, PC-DOS, NWDOS, MSX-DOS, die z.T. noch anhlt, kamen noch externe
4DOS, oder DIP OS gibt, so sind doch alle im Befehle dazu, die als Zusatzprogramme zum
Kern fast gleich, weshalb ich hier nur die DOS ausgeliefert wurden.
Schreibweise DOS verwenden werde. Interne Befehle kann man dem DOS immer
Damit das DOS die Daten des Bedieners erteilen, aber externe Befehle nur dann,
speichern und verwalten kann, hat es eine wenn das dazugehrige Programm auch auf
Menge Befehle, mit denen der Bediener das dem Computer zur Verfgung steht.
DOS befehligen soll und mu. Wir wollen uns hier nur mit den internen
Es ist deshalb ein Mu, weil das DOS Befehlen weiterbeschftigen, da diese
erstens nichts von alleine macht und zahlenmig unterlegen und bei fast allen
zweitens keine natrliche Sprache versteht. DOS-Versionen vorhanden sind. Auerdem
Wer DOS benutzen will ist gezwungen die reichen diese bereits fr die ordentliche
Sprache des DOS, also die DOS-Befehle, zu Verwaltung der Daten des Bedieners aus.
lernen. Ansonsten kommt keine Damit alle stolzen DOS-Besitzer diesen Kurs
Zusammenarbeit zwischen Bediener und DOS weiterverfolgen knnen, setze ich die recht
zustande. Man kann das am besten durch alte DOS-Version 2.11 mit ihrem Befehlssatz
einen natrlichen Vergleich verstehen: Wenn voraus. Zwar schauen nun alle MSX-DOS 1
ich als Deutscher kein Russisch beherrsche, Anwender in die berhmte Rhre, aber diese
aber trotzdem einen Russen der kein Deutsch Version ist schlicht und einfach eine
beherrscht, um ein Taschentuch bitte, so Katastrophe, weil sie nur ber dreizehn
kann mich der Russe nicht verstehen und ich interne Befehle verfgt und keine geordnete
warte vergebens auf das Taschentuch. Datenablage ermglicht.
Um diesen Verstndigungsproblemen zu Es wird zwar nie die perfekte Datenablage
entgehen, haben sich die Entwickler geben, dies liegt auch mit am Bediener, aber
smtlicher DOS-Versionen auf die ab den DOS-Versionen 2.11 wird sie durch
Weltsprache Englisch geeinigt, die allerdings ordentliche Planung zumindest mglich.
nur zu einem kleinen Teil vom DOS Hier also endlich die internen Befehle des
verstanden wird. So kann ich zwar das DOS DOS 2.11 in alphabetischer Reihenfolge:
ebenfalls bitten mir ein Taschentuch zu
geben, wenn ich Give me an handkerchief, BREAK, CHDIR, CHKDSK, CLS, COPY, DATE,
please ber die Tastatur des Computers DEL, DIR, DO, ECHO, ERRORLEVEL, EXIST,
eingebe, aber es wird mich genausowenig wie FOR, GOTO, IF, IN, MKDIR, NOT, PAUSE,

Lars Aschenbach - Batchprogrammierung - 06-03-04


6 Batch

PATH, PROMPT, RMDIR, REM, REN, SET, Eine gemeinsame Schreibweise, die auf
TIME, TYPE, VER und VERIFY beiden Gerten gltig und unproblematisch
ist, gibt es immerhin fr die ersten drei
Was diese Befehle bedeuten und bewirken, Batchzeilen:
erklre ich in einem spteren Teil des Kursus,
da ich vorher noch auf das Thema Dateien IF %1.==L. ECHO Der Buchstabe L!
IF EXIST ..\NUL.* CD ..
und Dateienverwaltung eingehen mu und IF NOT EXIST C:\DOS\NUL.* MD C:\DOS
damit setzen wir in der nchsten Ausgabe
fort. Doch bei den restlichen vier Zeilen fand ich
keinen gemeinsamen Nenner und mute
Know How: Batching daher prfen, vor dem Einsatz dieser Zeilen,
ob die Syntax vom PoFo oder vom PC
Laufe ich auf dem PoFo oder dem anzuwenden ist.
PC? Angeregt durch DR-DOS und NovellDOS
Diese Frage mssen sich Batchdateien stellen half ich mir deshalb mit den Variablen OS
und selbst beantworten knnen, wenn sie auf (Operating System) und VER (Version)
beiden Computern laufen sollen. Denn es gibt weiter, die ich dann auf dem jeweiligen
leider ein paar Unterschiede in der Computer von Hand setzte. So nahm ich Teile
Batchsyntax zwischen PoFo und PC! der Bildschirmmeldung auf, die sich aus der
So kann jede einzelne, der folgenden Anwendung des Befehles VER ergeben, um
Batchzeilen, dem PC unter bestimmten zwischen PC und PoFo unterscheiden zu
Umstnden Probleme bereiten: knnen.

IF %1==L ECHO Der Buchstabe L! Beim PoFo: SET OS=DIP-OS


CD..>NUL SET VER=2.11
MD C:\DOS>NUL
FOR %%A in (C:\DOS\*.*) DO TYPE C:\DOS\%%A
TYPE C:\CONFIG.SYS /P Beim PC: SET OS=MS-DOS
APP /E SET VER=6.22
OFF
Auerdem fgte ich dann die jeweils zwei
Sie fhren zu Fehlermeldungen und bringen
gltigen Zeilen noch in die entsprechende
damit Daten in Gefahr, da die Batchdatei, die
AUTOEXEC.BAT meines PCs und des PoFos
nur eine dieser Zeilen beinhaltet, mit einem
ein.
falschen Resultat endet. Zumindest tritt das
Nun kann ich in meinen Batchdateien die
sehr oft beim Einsatz auf dem PC ein. Fr den
Variable OS abfragen und die, fr das
PoFo sind diese Batchzeilen dagegen
jeweilige DOS gltige Batchzeile, zur
vollkommen korrekt und werden auch, beim
Ausfhrung kommen lassen:
Einsatz in Batchdateien, wohlgemerkt,
ordentlich ausgefhrt. IF %OS%.==DIP-OS. FOR %%A IN (C:\DOS\*.*) DO
Um aber diese Batchzeilen auf dem PC TYPE C:\DOS\%%A
einsetzen zu knnen, mssen diese so IF NOT %OS%.==DIP-OS. FOR %%A IN (C:\DOS\*.*)
DO TYPE %%A
geschrieben werden:
IF %1.==L. ECHO Der Buchstabe L! IF %OS%.==DIP-OS. TYPE C:\CONFIG.SYS /P
IF EXIST ..\NUL CD .. IF NOT %OS%.==DIP-OS. TYPE C:\CONFIG.SYS |
IF NOT EXIST C:\DOS\NUL MD C:\DOS MORE
FOR %%A IN (C:\DOS\*.*) DO TYPE %%A
TYPE C:\CONFIG.SYS | MORE IF %OS%.==DIP-OS. APP /E
EDIT - Anm.: MS-DOS als DOS vorausgesetzt IF NOT %OS%.==DIP-OS. EDIT
OFF - Anm.: Dazu gibt es keinen vergleichbaren Befehl IF %OS%.==DIP-OS. OFF
beim PC IF NOT %OS%.==DIP-OS. ECHO Bitte nun den
Computer ausschalten!
In dieser Schreibweise sind aber leider nicht
alle Zeilen auch fr den PoFo gltig und Ich teste mit diesen Zeilen nur auf den
wrden bei ihm zu Fehlermeldungen fhren. Variableninhalt DIP-OS ab, da DR-DOS und
NovellDOS von Haus aus eine Variable OS

Lars Aschenbach - Batchprogrammierung - 06-03-04


Batch 7

besitzen, die mit DR-DOS, bzw. NWDOS Batchdatei sich selbst neustarten lasse und
definiert ist. Es reicht ja aus zu prfen, ob die den Parameter %1 berprfe!
Variable OS mit DIP-OS definiert wurde, Und tatschlich kann ich das mit der
damit die PoFo-Syntax angewendet wird! Batchdatei DIPOS.BAT beweisen:
Somit kann ich also tatschlich
01: @echo off
Batchdateien schreiben, die sowohl auf dem 02: rem Ist die Batchdatei unter DIP-OS gestartet worden
PC, als auch auf dem PoFo lauffhig sind! oder nicht?
Doch leider ist damit das Problem noch nicht 03: rem
ganz gelst: 04: rem Selbstaufruf, wegen Trennprfung beim DIP-OS:
Keine Batchdatei kann sich mit absoluter 05: rem
06: if not %0==dIpOs.BaT if not %1.==.BaT. dIpOs.BaT
Sicherheit darauf verlassen, das die Variable
07: rem
OS vom Bediener angelegt wurde. Fehlt diese 08: rem Ergibt folgende Parameter:
Variable, oder ist sie nicht mit DIP-OS 09: rem
definiert, so wird immer die vom PC gltige 10: rem bei DIP-OS: %0 = dIpOs %1 = .BaT
Syntax verwendet und das ohne Rcksicht 11: rem bei MS-DOS: %0 = dIpOs.BaT %1 =
auf Verluste und Fehlermeldungen! 12: rem
13: if %1.==.BaT. echo Ich laufe unter DIP-OS!
Wie eingangs erwhnt, mu sich jede
14: if %1.==.BaT. set OS=DIP-OS
Batchdatei fragen, ob das zugrundeliegende 15: if %1.==. echo Ich laufe NICHT unter DIP-OS!!!
Gert ein PoFo oder ein PC ist. Diese Frage 16: if %1%os%.==. set OS=MS-DOS
mu die Batchdatei dann auch noch selbst
beantworten knnen, damit es keine Die Zeilennummern nebst Doppelpunkt sind
Probleme gibt! nicht abzutippen! Die wechselnde
Deshalb habe ich verschiedene Techniken Schreibweise ist zwar lstig, aber absolut
ausprobiert und bin auch zu sehr notwendig!!!!
umstndlichen, aber funktionierenden DIPOS.BAT sollte durch die Eingabe von
Lsungen gekommen. Weil die nun wirklich "DIPOS" oder "dipos" gestartet werden!
nicht akzeptabel waren, habe ich dann fr ein Weil bei diesem Start noch die Extension
halbes Jahr von diesem Thema Abstand .BaT fehlt, was ja vollauf beabsichtigt ist,
genommen. fallen die Prfungen in Zeile 06: negativ aus
Vor einigen Tagen dann, ich beschftigte und sorgen fr den Neustart inklusive der
mich gerade intensiv mit dem Verhalten der Extension: dIpOs.BaT
Parameter %0 und %1 auf dem PoFo, ffnete Dieser Neustart fhrt zu unterschiedlichen
mir Kollege Zufall die Augen: Reaktionen bei PC und PoFo, weshalb wir
Starte ich eine Batchdatei, z.B. TEST.BAT, diese einmal getrennt betrachten:
auf dem PoFo, indem ich ihren Namen TEST Beim PC wird ja der Parameter %0, hier:
inkl. der Extension .BAT eingebe, so wird der dIpOs.BaT, unbehelligt gelassen, weshalb die
Name im Parameter %0 und die Extension im erste IF NOT-Abfrage in Zeile 06: greift und
Parameter %1 gespeichert: somit kein weiterer Neustart mehr notwendig
ist.
PoFo: %0 = TEST %1 = .BAT Weil kein Parameter %1 existiert der .BaT
Starte ich auf dieselbe Weise beim PC, so lauten knnte, kommt die Zeile 15: zur vollen
werden der Name TEST und die Extension Geltung und gibt kund, das DIPOS.BAT nicht
.BAT zusammen im Parameter %0 unter DIP-OS (PoFo) gestartet wurde!
gespeichert. Ein Parameter %1 existiert dann Die Zeile 16: hlt dann dieses Ergebnis
nicht: nach Mglichkeit in der Variable OS (fr
Operating System) fest, sofern bislang keine
PC : %0 = TEST.BAT %1 = Variable OS existiert. Damit knnen
Wer genau hinschaut, wird also deutliche nachfolgende Batchdateien das OS prfen,
Unterschiede zwischen den Parametern beim ohne erst einen Neustart veranlassen zu
PoFo und beim PC feststellen! mssen. Existierte aber bereits eine Variable
Demnach mu es immerhin mglich sein zu OS, bei DR-DOS und NovellDOS sollte das ja
prfen, ob die Batchdatei unter DIP-OS der Fall sein, so bleibt die bisherige Definition
gestartet wurde oder nicht, wenn ich die von OS erhalten.

Lars Aschenbach - Batchprogrammierung - 06-03-04


8 Batch

Beim Neustart auf dem PoFo findet dagegen Verzeichnis C:\BATCH mit in die PATH-
die Aufteilung von dIpOs.BaT in dIpOs und Anweisung aufgenommen:
.BaT statt. Somit lautet der Parameter %0 PATH=C:\DOS;C:\BATCH
dIpOs und der Parameter %1 .BaT. Diese Das ganze hat folgende Vorteile:
Aufteilung und Umwandlung findet brigens Will ich meine Batchdateien verffentlichen,
noch vor der Ausfhrung der Zeile 01: statt! in ein anderes Laufwerk und Verzeichnis
Nun greift die zweite IF NOT-Abfrage der verlagern oder auf einen anderen PC
Zeile 06: und verhindert einen weiteren bertragen, so mu weder ich noch ein
Neustart. Da jetzt der Parameter %1 existiert anderer User, die Laufwerks- und
und zudem noch .BaT lautet, sind die Verzeichnisangaben in den ganzen
Bedingungen der Zeile 13: erfllt und es wird Batchdateien ndern, damit sie unter den
gemeldet, das DIPOS.BAT unter DIP-OS neuen Bedingungen auch funktionieren. Es
(PoFo) gestartet wurde. mu lediglich dafr Sorge getragen werden,
Hier hlt dann die Zeile 14: das Ergebnis fr da die Variablen BDV, BDY und PATH
nachfolgende Batchdateien in der Variablen angepat oder bereitgestellt werden:
OS fest. Voila! Dadurch haben alle User deutlich weniger
Nun kann man entweder DIPOS.BAT vor Tipparbeit und sind sehr flexibel!
den eigentlichen Batchdateien starten, damit Wer dieses Grundgerst in Zukunft fr
die Variable OS auch existiert, oder man setzt seine Batchdateien verwendet, kann nun auf
seine Routine in das zweierlei Wegen abprfen, ob die Batchdatei
folgende Grundgerst ein: auf dem PoFo luft oder nicht:
Entweder man prft die Variable OS also
01: @echo off
02: for %%a in (%bdv%. %bdy%.) do if %%a==. goto err auch weiterhin auf den Inhalt DIP-OS ab,
03: if not %0==%BDV%%BDY%bAtCh.BaT if not oder man prft den Parameter %0, der dann
%1.==.BaT. %BDV%%BDY%bAtCh.BaT %1 %2 %3 beim PoFo .BaT heien mu, wenn die
%4 %5 %6 %7 %8 %9 eigentliche Routine zum Zuge kommt. Weil
04: if %1.==.BaT. set OS=DIP-OS die Variable OS nicht in allen Fllen existiert,
05: if %1%os%.==. set OS=MS-DOS
oder angelegt werden kann, ist die Prfung
06: if %1.==.BaT. shift
07: rem des Parameters %0 auf .BaT besonders zu
08: rem Hier mu dann die eigentliche Routine empfehlen!!!
eingebunden werden! Warum die Variable OS berhaupt von der
09: rem Firma Digital Research eingefhrt wurde und
97: :err ich mir diese zu Nutze mache:
98: for %%a in (%bdv%. %bdy%.) do if %%a==. echo
So manches Programm will nur partout
Eine der Variablen BDV und BDY existiert nicht!
99: :off unter MS-DOS oder PC-DOS funktionieren
und fragt daher die Betriebssystemversion
In der Zeile 03: mu dann anstelle von ab. Lautet diese z.B. nicht "MS-DOS 4.0", so
bAtCh.BaT und bAtCh.BaT der endgltige stellt das Programm seine Arbeit unverzglich
Name der Batchdatei eingetragen werden. ein. Den Entwicklern von DR-DOS, welches
Bitte achtet dabei auf die wechselnde spter zu NovellDOS wurde, war dies
Schreibweise, da sie sehr, sehr wichtig ist!!! natrlich ein Dorn im Auge, weshalb sie den
Neu sind dabei die Variablen BDV und BDY: Kufern eine einfache
Hinter diesen Variablen, die in vielen meiner Manipulationsmglichkeit dieser
Batchdateien vorkommen, verbergen sich das Betriebssystemversion boten:
BatchDriVe (das Laufwerk AUF DEM sich Mittels SET-Befehl kann man dort die
meine Batchdateien befinden) und das Variablen OS und VER (fr Version) auf die
BatchDirectorY (das Verzeichnis IN DEM gewnschten Werte einstellen, damit das
meine Batchdateien stehen). gewnschte Programm berlistet wird und
So habe ich BDV durch die AUTOEXEC.BAT luft.
mit SET BDV=C: und BDY mit SET Weil das Rad nicht zweimal erfunden
BDY=\BATCH\ definiert. Damit das DOS werden mu, englischsprachige Variablen bei
meine Batchdateien auch jederzeit der internationalen Verbreitung meines
wiederfindet, habe ich dann noch das Wissens hilfreich sind und ich eine straffe

Lars Aschenbach - Batchprogrammierung - 06-03-04


Batch 9

Organisation bevorzuge, verwende also auch Laufwerk nicht, so wird die Meldung
ich die Variable OS! Ungltiges Laufwerk in 1.BAT
Die Variable VER spielt zwar derzeit noch geschrieben. Beim folgenden Aufruf von
keine Rolle, aber ich werde sie dann nutzen, 1.BAT krzt DOS das Wort Ungltiges auf
wenn ich auf dem PC die externen UNG zusammen und ruft die vorhandene
Programme des jeweiligen DOS verwenden Batchdatei UNG.BAT auf. Weil die Feh-
mchte. Auch fr den PoFo ist diese Variable lermeldung Nicht bereit... trotz Umleitung
VER noch unbedeutend und mu nicht nicht in 1.BAT abgelegt wird, hnge ich per
zwingend angelegt werden. Aber wer wei??? -ECHO-Befehl das Wort NO an 1.BAT,
damit
1.BAT spter NO.BAT starten kann und
Laufwerk vorhanden, Diskette mir gemeldet wird, da das Laufwerk zwar
existiert, aber keine, oder eine unformatierte
eingelegt? Diskette enthlt.
Diese Frage kann per Batchdatei beantwortet Genug des Geplnkels, hier ist also
werden! Doch zuerst mu einiges Wissen LW&DISK.BAT:
bekannt sein, damit man die Funktionsweise
von LW&DISK.BAT verstehen kann: @echo off
Ist das Laufwerk A: vorhanden und mit einer rem falls mal etwas schiefluft!
if %1.==. if exist c:\temp\a.dat goto off
formatierten Diskette bestckt, so erhlt man
rem Laufwerksangabe vergessen?
mit -DIR A:\- etwa folgende Informationen: if %1.==. goto err
rem Temporres Verzeichnis anlegen
Datentrger in a: hat keine Bezeichnung md c:\temp> nul
Inhaltsverzeichnis von a: rem Pfad retten und ergnzen
config.sys 1.01.80 0:00 set opath=%path%
... set path=%path%;c:\temp
Befindet sich aber keine Diskette im real rem Hilfs- & Antwortdateien erzeugen
existierenden Laufwerk A:, so sollte man echo a> c:\temp\a.dat
echo @echo off> c:\temp\datentr.bat
nach -DIR A:\- folgende Meldung erhalten: echo echo LW %1 und Diskette vorhanden!>>
Nicht bereit, Fehler beim lesen a: c:\temp\datentr.bat
Abbrechen, Wiederholen, Ignorieren? echo lw&disk>> c:\temp\datentr.bat
echo @echo off> c:\temp\no.bat
Diese Meldung mu dann noch entsprechend echo echo Keine o. unformatierte Diskette im LW %1!>>
mit <A>, <W>, oder <I> beantwortet c:\temp\no.bat
werden. Versucht man ein nicht vorhandenes echo lw&disk>> c:\temp\no.bat
Laufwerk anzusprechen, z.B. mit -DIR Q:\-, echo @echo off> c:\temp\ung.bat
echo echo Laufwerk %1 existiert nicht!>> c:\temp\ung.bat
so meldet sich DOS mit:
echo lw&disk>> c:\temp\ung.bat
Ungltiges Laufwerk echo @echo off> c:\temp\1.bat
zu Wort. Je nach DOS-Version knnen diese rem Beginn der eigentlichen Prfung
Meldungen aber deutlich abweichend sein! dir %1\ <c:\temp\a.dat>> c:\temp\1.bat
Damit LW&DISK.BAT auch unter jedem rem Fehler Nicht bereit... wegblenden
DOS tadellos funktioniert, mu man diese cls
rem falls Nicht bereit dann fr Start
Fehlermeldungen knstlich erzeugen und
rem von NO.BAT vorbereiten
LW&DISK.BAT entsprechend abndern. echo no>> c:\temp\1.bat
Denn die Routine erstellt selbstndig die rem 1.BAT starten, 2.Teil d. Prfung
notwendigen Antwortdateien, die sich meist 1
auf das erste Wort der Meldung beziehen. So rem wenn Prfung beendet oder etwas
wird das Directory in 1.BAT geschrieben, rem nicht klappte, dann temporreres
rem Verzeichnis lschen und Ur-Pfad
wenn Laufwerk und formatierte Diskette
rem rekonstruieren
vorhanden sind. :off
Anschlieend wird 1.BAT aufgerufen und for %%a in (c:\temp\*.*) do del c:\temp\%%a
ruft seinerseits DATENTR.BAT auf, da DOS rd c:\temp> nul
das Wort Datentrger als auszufhrende if not %opath%.==. set path=%opath%
Datei definieren kann. Gibt es das gesuchte set opath=

Lars Aschenbach - Batchprogrammierung - 06-03-04


10 Batch

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

Trotz der diesmal vorhandenen


Dokumentation mu ich noch etwas nher
auf A.DAT eingehen:
Diese Datei wird fr den Fall bereitgestellt,
wenn keine, oder eine unformatierte
Diskette, im zu prfenden Laufwerk ist. Denn
die oben bereits erwhnte Fehlermeldung
Nicht bereit... mu ja noch beantwortet
werden. Mittels der Einleitung -<a.dat- wird
die evtl. auftretende Fehlermeldung dann
auch brav vom DOS aus beantwortet.
Wer diese Batchdatei noch rekursiv
ausfhrbar gestaltet und die Ergebnisse in
Variablen wie LW & DISK festhlt, kann damit
z.B. eine automatische Datensicherung in der
Nacht erreichen!!!

Lars Aschenbach - Batchprogrammierung - 06-03-04


Batch 11

KnowHow: DIP-OS vermeiden die schlieende Klammer ) zu


verwenden: egal ob in Dateinamen, Variablen
Ausgeklammert? oder Parametern. Wir erinnern uns: Variablen
Das sich hinter der schlieenden Klammer ) und Parameter sind meist Platzhalter fr
ein weiteres Geheimnis des PoFo verbirgt, hat Dateinamen!
wohl noch keiner gedacht und entdeckt. Mir Kann oder mchte man aber nicht auf die
ist das auch erst vor kurzem aufgefallen: schlieende Klammer verzichten, als
Erzeugt doch einfach mal die Dateien J. und Bestandteil in Dateinamen, so kann das
J).DAT vom DOS-Prompt aus, mit den Fehlverhalten des DIP-OS mit diesen
Direkteingaben: Batchzeilen rechtzeitig verhindert werden:

rem>j. if exist )*.* echo Klammer ) in Dateinamen verboten!


rem>j).dat if exist )*.* goto :>nul
Und gebt nun diese Befehlszeile direkt am if exist ?)*.* echo Klammer ) in Dateinamen verboten!
Prompt ein: if exist ?)*.* goto :>nul
if exist ??)*.* echo Klammer ) in Dateinamen verboten!
for %a in (*.*) do echo %a if exist ??)*.* goto :>nul
Bei mir fhrte das zu dieser if exist ???)*.* echo Klammer ) in Dateinamen verboten!
if exist ???)*.* goto :>nul
Bildschirmausgabe: if exist ????)*.* echo Klammer ) in Dateinamen verboten!
CONFIG.SYS
TEST.BAT if exist ????)*.* goto :>nul
J if exist ?????)*.* echo Klammer ) in Dateinamen verboten!
J if exist ?????)*.* goto :>nul
Die doppelte Anzeige der Datei J. hat mich if exist ??????)*.* echo Klammer ) in Dateinamen
verboten!
dann sehr berrascht, hatte ich doch if exist ??????)*.* goto :>nul
erwartet, auch die Datei J).DAT zu Gesicht zu if exist ???????).* echo Klammer ) in Dateinamen
bekommen. Denn im Normalfall htte die verboten!
Anzeige so ausfallen mssen: if exist ???????).* goto :>nul
CONFIG.SYS if exist *.)* echo Klammer ) in Dateinamen verboten!
TEST.BAT if exist *.)* goto :>nul
J if exist *.?)* echo Klammer ) in Dateinamen verboten!
J).DAT if exist *.?)* goto :>nul
Aber weil im Dateinamen von J).DAT eine if exist *.??) echo Klammer ) in Dateinamen verboten!
schlieende Klammer ) zu finden ist, macht if exist *.??) goto :>nul
das DIP-OS aus der FOR-Schleife folgendes,
wenn es auf die Datei J).DAT trifft: Diese Zeilen mssen einmal unmittelbar vor
die erste FOR-Schleife eingebaut werden, die
FOR %A in (J).DAT) DO ECHO %A in der Menge einen Parameter, eine Variable
Zwar wird man diese Zeile selbst bei oder Wildcards enthlt, sofern die Menge sich
eingeschaltetem ECHO nie zu Gesicht auf Dateinamen bezieht. Ein Beispiel dafr ist
bekommen, aber so mu das DIP-OS diese meine ADDCOPY.BAT, die Ihr in KH-
Zeile interpretieren, wenn die Datei J).DAT ADDCP.TXT betrachten knnt. Ich empfehle
gegriffen wird. Schuld daran ist die auch diese Zeilen in jede Batchdatei
schlieende Klammer, die die sonst bliche einzubinden, die mittels einer FOR-Schleife
Menge in der FOR-Schleife verfrht schliet Dateinamen benutzt.
und somit aus der erwarteten Menge (J).DAT) Eine krzere Schutzvariante ist mir zwar
die Menge (J) macht, die dann zur Anzeige auch eingefallen, aber die erwies sich nicht
kommt. als sehr sicher.
In der Praxis werden Dateinamen mit Auf der anderen Seite knnte man dieses
Klammern wie (, ), { und } nur dann erzeugt, Wissen vielleicht auch dazu nutzen, um eine
wenn es sich dabei um temporre, also um gewisse Art der Stringverarbeitung zu
kurzweilig existierende Dateien, handeln soll. erreichen. So legt man z.B. die Datei JA).DAT
Meist beschrnkt man sich dabei auf die an, um mit der obigen FOR-Schleife daraus
Klammern { und }. ein JA zu machen.
Wer also den Problemen des DIP-OS aus Allerdings ist mein in CUT.BAT gezeigter
dem Wege gehen will, der sollte es tunlichst Tip, der ebenfalls zur Stringverkrzung fhrt,

Lars Aschenbach - Batchprogrammierung - 06-03-04


12 Batch

besser, weil er nicht auf 11 Zeichen nicht testen, schuf ich dann PHASE.BAT,
(achtstelliger Dateiname + dreistelliger welche die Variablen & und O mit jedem
Extension) beschrnkt ist, wie diese Aufruf umschaltet:
Mglichkeit.
Sofern man aber beide Techniken @echo off
if %1.==?. if not %o%.==. goto off
verbindet, so kann das evtl. zu einer sehr
for %%a in (on off) do if not %o%.==%%a. set o=%%a
gebrauchsfhigen Stringverarbeitung for %%a in (pause rem) do if not %&%.==%%a. set
heranwachsen! &=%%a
Ich habe zwar noch keine vernnftige :off
Verwendung fr die hier beschriebene echo Die Testphase ist %o%!
Technik, noch fr die Kombination dieser
TEST.BAT plus CUT.BAT parat, aber vielleicht Zuknftige Batchdateien mssen also mit
hat ja einer von Euch die zndende @ECHO %O% beginnen und die PAUSE-
Idee???!!! Zeilen, die man zu Testzwecken einbringt,
mssen durch %&% gestaltet werden. Dazu
mal eine Testroutine, die Ihr unter dem
Die Entwicklung Namen TEST.BAT abspeichern knnt:
... von Batchdateien ist nicht immer einfach,
ganz besonders dann nicht, wenn sie sehr @echo %o%
echo Dies ist eine unwichtige Zeile!
trickreich ausfallen sollen. Durch das %&%
berhmte Debuggen, die Fehlersuche, geht echo *Zeile ohne Wert*
gewhnlich die meiste Zeit verloren. Dabei
wird von jedem Lehrbuch empfohlen, das Ruft nun abwechselnd PHASE.BAT und
ECHO nicht auszuschalten und an kritischen TEST.BAT auf, um die Wirkung von
Stellen PAUSE-Befehle einzubauen, damit die PHASE.BAT zu ergrnden.
Fehlersuche vereinfacht wird. Wenn also demnchst meine Batchdateien
Whrend der Testphase ist dagegen auch mit @ECHO %O% beginnen sollten, so sollte
nichts einzuwenden, aber was das an Arbeit die Testphase mglichst OFF-geschaltet sein.
bedeutet, wenn man diese Zeilen nach den Den Zustand der Testphase knnt Ihr auch
erfolgreichen Tests lschen kann, das jederzeit durch den Aufruf PHASE? erfragen.
verschweigen die Lehrmeister geflissentlich! Ansonsten werdet Ihr auch nach jedem
Da meine Routinen immer komplexer zu Aufruf ber den aktuellen Stand informiert!
werden scheinen und ich nicht mehr Zeit, als
bisher, in die Fehlersuche investieren will, Der gute Ton
suchte ich eine variable Lsung, damit ich die
Batchdateien nicht nachtrglich berarbeiten ... macht erst die wohlklingende Musik, die
mu. Nach reiflicher berlegung kam ich auf man immer wieder gerne hrt. Auch bei zu
die Idee, anstelle der Befehle Variablen zu programmierenden Batchdateien gibt es ein
verwenden, weil diese ja beliebig umdefiniert paar Grundstze, die man beachten sollte:
werden knnen! Variablen, die nicht von anderen Routinen
So ersann ich die Variable O die entweder mitbenutzt werden, sollten am Ende der
mit dem Wort ON oder OFF definiert sein soll, jeweiligen Batchdatei wieder gelscht
damit ich zu Beginn des Batchprogramms das werden.
ECHO an- oder abschalte: Hilfsdateien sollten ebenfalls nach ihrer
Ttigkeit entfernt werden.
@ECHO %O% Die Hilfsdateien, die man behalten mu,
und die Variable & die mit dem Befehl PAUSE drfen nicht sofort vom Bediener gestartet
oder REM definiert sein soll, damit ich an werden knnen. D.h. ihre Extension sollte
kritischen Stellen bei Bedarf eine PAUSE nicht BAT lauten.
einlegen kann oder nicht: Batchdateien sollten ihre Aufrufsyntax
dann prsentieren, wenn entweder kein
%&%
Parameter bergeben wurde, oder der
Um beide Variablen gleichzeitig auf den erste Parameter /? lautet.
jeweiligen Stand zu schalten: testen oder

Lars Aschenbach - Batchprogrammierung - 06-03-04


Batch 13

Alle Batchdateien sollten in einem Regeln haben, aber ich habe auch gut zwei
Verzeichnis untergebracht werden, das Jahre gebraucht, um diese zu etwa 90%
auch in der Pfadangabe gesetzt wurde. einzuhalten. Wenn man seine Routinen nicht
Nach Mglichkeit sollte jede Batchdatei weitergeben oder verffentlichen will, kann
nicht mehr als zwei Parameter beim Start man sowieso darauf pfeifen
bentigen, damit der Bediener nicht
ellenlange Eingaben erzeugen mu. KILL.BAT - lschen mit Reserve
Die Batchdateien sollten so markante
Namen haben, das der Bediener sie schnell Der Computerfreak, der noch nie eine Datei
deuten und lernen kann. versehentlich und voreilig gelscht hat, drfte
wohl nicht menschlich sein. Wir Menschen
Keine Batchdatei sollte zu COM- oder EXE-
lernen ja aus Fehlern und entwickeln unsere
Programmen umgewandelt werden, da
Intelligenz gerade dadurch weiter.
diese Compiler entweder mit bestimmten
Manchmal dauert dieser Lernproze aber
Befehlskombinationen nicht fertig werden,
lnger und mu einem gehrig die Finger
oder die Technik nicht ausfhren knnen.
verbrennen, bis man endlich zur Einsicht
Auch die Zusammenlegung von Routinen
gelangt. So sind auch mir schon etliche Daten
zu einer riesigen Batchdatei, ist nicht
verlustig gegangen, die ich dann meist
immer frderlich, da die
mhsam rekonstruierte. Nun bin ich aber des
Ausfhrungsgeschwindigkeit darunter
Befehls DEL leid und habe eine Sicherung
leidet.
eingebaut, durch die Dateien
Fortgeschrittene Programmierer sollten
wiederhergestellt werden knnen:
lange Befehle in Variablen packen und
diese, statt der Befehle, in ihren Routinen @echo off
verwenden. if %1.==. goto err
Routinen die Schalter und externe Befehle md \kill > nul
copy %1 \kill > nul
benutzen, sollten die DOS-Version
del %1
ermitteln knnen, auf der sie gerade goto off
eingesetzt werden. Gegebenenfalls ms- :err
sen sie ihre Ttigkeit einstellen, wenn sie echo Zu lschende Datei fehlt!
nicht unter der laufenden DOS-Version :off
funktionieren knnen. Beim Aufruf von KILL.BAT, inkl. des Namens
REM-Zeilen sollten dann wieder entfernt der zu lschenden Datei, wird ein Verzeichnis
werden, wenn die Routine keine Fehler KILL angelegt, in die die zu lschende Datei
mehr aufweist. sicherheitshalber abgelegt wird. Danach wird
Sprungmarken funktionieren auch ohne die ursprngliche Datei gelscht. Folglich
die abschlieende :END Markierung, wurde die Datei nicht richtig vom Datentrger
weshalb man auf sie verzichten sollte. gelscht, sondern nur ins Verzeichnis KILL
Hinter dem PAUSE-Befehl und den transferiert. Von dort kann sie nun jederzeit
Sprungmarken sollten auch keine wiederhergestellt werden, indem man sie ins
Kommentare angefgt werden, da sie gewnschte Verzeichnis zurckkopiert.
wegen der -@ECHO OFF- Zeile eh nicht Sollte bereits ein Verzeichnis namens KILL
angezeigt werden. bestehen, so wird man dank der Nul-
Sollen Treiber, wie ANSI.SYS, Verwendung Umleitung, von der Fehlermeldung verschont.
finden, so sollte deren Vorhandensein Auch beim kopieren schweigt sich DOS
vorher ermittelt werden. deshalb aus.
Bevor eine Variable gesetzt wird, sollte Wem diese Sicherheitslschung nicht
mglichst geprft werden, ob diese nicht gefllt, bzw. wer ohne Reserve fahren
bereits existiert. Notfalls mu ihr mchte, ist ja nicht an die Benutzung von
ursprnglicher Inhalt in einer anderen KILL.BAT gebunden und kann wie bisher mit
Variable, oder einer Batchdatei, gesichert DEL arbeiten.
werden.
Sicherlich werden gerade die Anfnger groe
Schwierigkeiten mit der Einhaltung dieser

Lars Aschenbach - Batchprogrammierung - 06-03-04


14 Batch

Verzeichnisanlage mit folgendem sein. Beim gegenteiligen Fall kann die


Wartezeit sehr lang werden, sofern die
Verzeichniswechsel CONFIG.SYS sehr gro ist! Die
Oftmals legt man ein Verzeichnis an und will Bildschirmausgabe des Befehles HELP ist
gleich anschlieend in das neue Verzeichnis dagegen immer und auf jedem PoFo gleich
gelangen, um dort Dateien abzulegen. Sonst gro und bentigt also eine feste Zeit, bis sie
htte ja auch ein neues Verzeichnis kaum dargestellt wird. Nur wenn der PoFo mit einer
Sinn, oder??? hheren Taktfrequenz betrieben wird, an
Die dafr notwendigen Eingaben: MD dieser Stelle mal einen Gru an Stefan
<Verzeichnis> und CD <Verzeichnis>, sind Kchele 8-), ist die Wartezeit doch etwas
wohl mittlerweile jedem DOS-User in Fleisch krzer, als auf den normal getakteten PoFos.
und Blut bergegangen. Aber findet Ihr diese Datei verschieben
Vorgehensweise nicht ein wenig lstig oder
gar unlogisch? Zumindest ich fragte mich, Mit der folgenden Routine kann man eine
warum man nicht automatisch in das eben Datei in ein anderes Laufwerk oder
erzeugte Verzeichnis hineinwechselt. Wie Verzeichnis verschieben. Die gewnschte
dem auch sei, wenn ich also nun ein neues Datei wird dabei nicht einfach kopiert,
Verzeichnis erzeugen und anschlieend hin- sondern auch gleich im Ursprungsverzeichnis
einwechseln will, benutze ich nun die gelscht.
Batchdatei MDCD.BAT: Hier kommt MOVEDAT.BAT:

@echo off @echo off


if %1.==. goto err if %2.==. goto err
md %1> nul copy %1 %2 > nul
cd %1> nul del %1
goto off goto off
:err :err
echo Aufruf z.B. mit: MDCD TESTVERZ o. mit echo Ziellangabe fehlt!
echo MDCD \TESTVERZ!!! :off
:off Aufgerufen wird sie z.B. mit MOVEDAT
Gebe ich beim Aufruf einen Verzeichnisnamen C:\SYSTEM\PERMDATA.DAT C:\. Wir
als ersten Parameter an, so wird dieses verschieben in diesem Fall die Datei
zunchst mit MD %1> NUL erzeugt, bevor PERMDATA.DAT ins Hauptverzeichnis des
der Verzeichniswechsel mit CD %1> NUL Laufwerkes C:.
vonstatten geht. Solange man sich dabei auf Und so gehts: Die IF-Zeile prft zunchst ob
das aktuelle Laufwerk beschrnkt, ist der ein Zielpfad oder Laufwerk angegeben
Wechsel sofort sichtbar. Dennoch kann man wurde. Gegebenenfalls wird eine Meldung
diese Routine gerne auch auf die anderen ausgegeben und abgebrochen. Ist ein Ziel
Laufwerke anwenden. Ein Laufwerkswechsel vorgegeben, so wird die im Parameter 1
findet aber nicht statt! bergebene Datei ans, im Parameter 2
festgehaltene, Ziel kopiert. Anschlieend wird
die Datei mit DEL %1 im Ursprungs-
Eine Zeitschleife im DIP-OS verzeichnis gelscht. Fertig ist die Datei-
Schon einmal habe ich darber berichtet, wie wscherei!
man eine Art Zeitschleife programmieren
kann:
Der Agentenaustausch
FOR %%A IN (1 2 3) DO TYPE C:\CONFIG.SYS>NUL
... ist seit jeher ein geheimnisvolles und
Aber weil viele Wege ins ROM fhren, kann gefhrliches Geschft, da das kleinste
man auch diese Zeile verwenden: Fehlverhalten in einem Blutbad enden kann!
Zum Glck stehen beim REN-Befehl unter
FOR %%A IN (1 2 3 4 5) DO HELP /?>NUL
DOS und DIP-OS keine Geheimmchte bei
die fr MS-DOS und DIP-OS gleichermaen Fu, so da kein Blutbad zu befrchten ist,
geeignet ist. Ist nmlich keine CONFIG.SYS in oder etwa doch?
C:\ zu finden, so wird die Wartezeit sehr kurz

Lars Aschenbach - Batchprogrammierung - 06-03-04


Batch 15

Man kann daran zweifeln, wenn man die


Namen zweier existierender Dateien TAUSCH T.DAT *.L
TAUSCH T.?AT ?.*
austauschen will. Ein schlechter Krimi? Ihr TAUSCH L.LLL T.DAT
werdet DOS und DIP-OS mit anderen Augen TAUSCH L.LAL
sehen, wenn Ihr meine Vorschlge nach- TAUSCH
vollzogen habt! TAUSCH.BAT L.LAL J.LOP
Im Grunde genommen ist es nur eine kleine TAUSCH.BAT *.* J.L??
und einfache Aufgabe fr das DOS (und DIP- TAUSCH :.DAT *.TXT
TAUSCH C:.DAT L.L
OS), wenn zwei Dateinamen gegeneinander
ausgetauscht werden sollen. Der Selbst wenn einige der eben gezeigten
unverfrorene Tastaturexperte wrde diese Dateien wirklich existieren sollten, so sollte
Aufgabe mit drei Eingaben erledigen, um die TAUSCH.BAT bei den meisten Startvarianten
Dateinamen T.DAT und L.LAL, zu nicht zum gewnschten Erfolg fhren!
vertauschen: Probiert es doch einfach mal aus, aber
REN T.DAT % wundert Euch nicht, wenn Euch blaue Bohnen
REN L.LAL T.DAT um die Ohren fliegen sollten :)
REN % L.LAL Deswegen habe ich mir eine schusichere
Und schon heit T.DAT L.LAL und L.LAL Weste zu stricken versucht, bin aber auch
T.DAT. Wobei vorausgesetzt ist, das die Datei nicht gegen jede Kugel der allgegenwrtigen
% nicht existiert! Fehlermacht DOS gefeiht!
Hat man dieses Spielchen fter vor, so Immerhin ist meine Weste SWAPNAME.BAT
schreibt sich der engagierte Batcher eine sicherer als so manche andere Strickjacke,
Batchdatei namens TAUSCH.BAT, SWAP.BAT die nach gleichem Muster unter den Namen
oder EXCHANGE.BAT: SWAP.BAT, TAUSCH.BAT oder FILECHG.BAT
angeboten wird. Aber gegen Startvarianten
@echo off wie:
ren %1 %
ren %2 %1 SWAPNAME C:.DAT L.DAT
ren % %2 SWAPNAME L;L.TXT JUHU.DOK
SWAPNAME T.DAT %%%%%%%%
Diese wird nun mit den Dateinamen T.DAT
und L.LAL, als Parameter %1 und %2, ist auch meine Version machtlos:
@echo off
aufgerufen, damit der Namenstausch sauber
if %1%2.==. goto err
ber die Bhne geht. Sauber??? Weit gefehlt, if %2.==. goto err
wie ich es mehr oder weniger leidvoll if not exist %1 goto err
erfahren mute! for %%a in (%1%2%3) do if not %%a==%1%2%3 goto err
Denn rufe ich obige Batchdatei auf, die ich if not exist %2 %0 %1 %1 %2
als TAUSCH.BAT gespeichert habe, so if not %3.==. shift
ren %1 %%%%%%%%>nul
bekomme ich recht unterschiedliche
ren %2 %1>nul
Reaktionen, die sich auf Grund der Anzahl ren %%%%%%%% %2>nul
und der Art der bergebenen Parameter :err
ergeben. Wenn ich mich 1. nicht vertippt if %1%2.==. echo Die beiden Dateinamen fehlten!
habe, 2. nicht eine nicht existierende Datei if not %1%2.==. if %2.==. echo Der zweite Dateiname
angebe, 3. wirklich zwei existierende fehlte!
if not %1%2.==. if exist %0%1 %0 %2 %3
Dateinamen verwende und 4. keine
if not %1%2.==. if not exist %1 if not %3.==. %0 %2 %3
unerlaubten Zeichen in den Dateinamen if not %1%2.==. if not %0==%1 if not exist %1 if exist %2
verwende, so komme ich mit groer echo Die Datei %1 existiert nicht!
Wahrscheinlichkeit zum gewnschten if not %1%2.==. if not exist %1 if not exist 2 echo Die
Ergebnis! Dateien %1 & %2 gibt es nicht!
Anderenfalls und das ist gar nicht so if not %1%2.==. for %%a in (%1%2%3) do if not
%%a==%1%2 echo Keine Wildcards * ? erlaubt!
unwahrscheinlich, erhalte ich die wildesten
Fehlermeldungen und Dateinamen, wenn ich Tja, wer auch immer den Spruch geprgt hat:
die obige TAUSCH.BAT mit folgenden Nobody is perfect!, hat damit eine wirklich
Eingaben starte: perfekte Feststellung getroffen!

Lars Aschenbach - Batchprogrammierung - 06-03-04


16 Batch

Fehlerhafte Eingaben minimieren Fehlertoleranz erreiche, sollte Euch jetzt


aufgegangen sein.
Mal Hand aufs Herz: Wer hat sich von Euch
Allerdings kommt die obige D.BAT in
nicht auch schon einmal vertippt??? Also mir
schwere Konflikte mit einer D.BAT, die ich
passiert das immer wieder, ganz besonders
benutze, um einfach auf das Laufwerk D: zu
dann, wenn ich es eilig habe. Meistens
wechseln:
reagiert das DOS oder das DIP-OS mit der
Fehlermeldung Befehl oder Programm nicht D.BAT:
gefunden anstatt mit dem gewnschten @D:
Resultat. Bei den folgenden Eingaben
vertippe ich mich z.B. desfteren: So habe ich ein wenig weiter gedacht und
letztlich diese D.BAT geschaffen:
CD system
DIR /p @if %1.==. if exist d:\nul.* d:
DIR *.* @if %1.==. if not exist d:\nul.* dir /p
DEL datei.ext @if not %1.==. if not exist %1\nul.* md %1
COPY *.* a: @if not %1.==. if exist %1\nul.* cd %1
TYPE datei.ext /p
Mit Ihr kann man auf das Laufwerk D:
Und das sieht dann so aus: wechseln, sofern es vorhanden ist, oder das
D system Directory des aktuellen Verzeichnisses
IR /p ansehen, wenn es kein Laufwerk D: gibt.
DR *.* Ansonsten kann man auch mit Ihr ein neues
DL datei.ext Verzeichnis erstellen, in das nach der
COP *.* a:
TYP datei.ext Erstellung automatisch hineingewechselt wird
oder einfach nur in ein bestehendes
Natrlich sind dem DOS keine Befehle wie D, Verzeichnis wechseln.
IR, DR, DL, COP und TYP bekannt, weshalb Fr diese nicht unbeachtliche Anzahl von
es mich zu recht mit der o.g. Fehlermeldung Mglichkeiten sind folgende Startvarianten
verrgert. Weil ich aber nicht auf die Ruhe erlaubt:
und Gelassenheit warten will, die das fort- D
schreitende Alter so mit sich bringen soll, Ist ein Laufwerk namens D: vorhanden, so
behelfe ich mir anders! wird es das aktuelle Laufwerk. Gibt es D:
Ihr ahnt sicherlich schon, das ich wieder nicht, so wird das aktuelle Inhaltsverzeichnis
einmal auf Batchdateien zu sprechen komme, seitenweise dargestellt.
weil ich ja meist in der Batchsprache spreche D system
8-)! Langer Rede kurzer Sinn, hier kommen Existiert ein Verzeichnis namens SYSTEM, so
sie auch schon: findet ein Wechsel in dieses statt. Ist das
Verzeichnis SYSTEM nicht vorhanden, so wird
D.BAT:
@CD %1
es zunchst erzeugt und anschlieend
hineingewechselt.
IR.BAT: Damit ist D.BAT nun ein passabler Ersatz
@DIR /p fr die Befehle D:, DIR /P, MD und CD. Gerne
DR.BAT: htte ich auch noch den Befehl RD
@DIR %1 bercksichtigt, habe aber noch keine Idee,
DL.BAT:
wie ich mit Sicherheit feststellen kann, das
@DEL %1 der Anwender auch wirklich das Verzeichnis
lschen will, wenn er D.BAT aufruft.
COP.BAT:
@COPY %1 %2
TYP.BAT:
@TYPE %1 %2

Das Geheimnis im Namen der Batchdateien


zu finden ist, mit denen ich also mehr

Lars Aschenbach - Batchprogrammierung - 06-03-04


Batch 17

KnowHow: DIP-OS sogar klaglos vom PoFo hingenommen,


obwohl ich noch keine Auswirkung gesprt
Label lschen habe. Bei MS-DOS kann es dazu kommen,
Das Label, das man jedem Datentrger unter das die angezeigten Dateien um eine reihe
DOS aufdrcken kann, soll eigentlich nur Bytes gekrzt werden, wenn sie schadhaft
nach Rckfrage gelscht werden. Zumindest sind!
mchte das DOS es so. Um es zu lschen, Aber es reicht nicht aus, eine der beiden
gibt man den Befehl LABEL ein und bekommt Optionen mit CHKDSK zu verwenden, um
etwa diese Reaktion vom DOS: eine interessante und nutzbare Fehlfunktion
Datentrger in c ist ramdisk des PoFos zu erzeugen!
Bezeichnung? Wenn wir uns zunchst auf die Option /F
Aktuelle Bezeichnung lschen (J/N)? j einigen und das Ergebnis von CHKDSK /F in
eine Datei namens ABC.DAT umleiten, mit:
Wenn also ein Label vorhanden ist, hier:
ramdisk und man auf die Frage nach der CHKDSK /F>ABC.DAT
Bezeichnung mit der Return-/Enter-Taste so wird die unmittelbar darauffolgende Zeile,
reagiert, so mu man beantworten, ob die die eine Bildschirmausgabe verursachen soll,
Bezeichnung (das Label) gelscht werden diese Bildschirmausgabe nach ABC.DAT
soll. umleiten und nicht auf den Bildschirm
Weil das gerade in Batchdateien nicht bringen!!!
unproblematisch ist, man mte eine Datei
bereitstellen, die die entsprechenden Ihr knnt das mit der TSTCHK.BAT
Tastendrcke enthlt, wird der Befehl Label ausprobieren:
@echo off
nur ungern in Batchdateien verwendet. chkdsk /F>abc.dat
Vor geraumer Zeit habe ich schon einmal help
eine Batchdatei namens UNLABEL.BAT Wenn ihr das ausprobiert habt und
vorgestellt, die das lschen des Labels anschlieend Euch den Inhalt von ABC.DAT
vollautomatisch vornahm. Doch wie ich vor anseht, mittels TYPE-Befehl oder der
kurzem feststellte, gibt es eine wesentlich Textverarbeitung, bekommt Ihr das Ergebnis
krzere und elegantere Lsung, um das Label des HELP-Befehles zu sehen.
zu lschen: Hnge ich aber noch die Zeile:
LABEL CLOCK$ TYPE ABC.DAT
ist alles was Ihr dazu bentigt! an die obige TSTCHK.BAT an, so ist die
CLOCK$ ist ein nicht dokumentiertes Gert, Umleitung wieder hinfllig! D.h., es landet
welches auch unter MS-DOS vorhanden ist. nur noch das Ergebnis von CHKDSK in
Ob dort LABEL CLOCK$ denselben Effekt hat, ABC.DAT.
wie hier auf dem PoFo unter DIP-OS, habe Mit der Option /V ist man da ein wenig
ich aber noch nicht ausprobiert! besser beraten, da es dann nichts mehr
ausmacht, ob eine weitere Bildschirmausgabe
KnowHow: DIP-OS erfolgt oder nicht! Dafr mu man aber mit
Die geheimen Optionen /F und /V der Fehlermeldung Falscher Parameter
leben, da es mir bislang nicht gelungen ist,
Von MS-DOS kenne ich die Option /V oder /v diese mittels NUL-Gert wegzublenden ohne
fr den CHKDSK-Befehl. Wird sie die Umleitung zu annullieren.
mitangegeben, so werden alle Namen der Fr den Test der Option /V empfehle ich
berprften Verzeichnisse und Dateien diese TSTCHK.BAT:
angezeigt. Leider bekomme ich auf dem PoFo @echo off
keine Verzeichnisse und Dateien angezeigt, cls
wenn ich CHKDSK /V eingebe, sondern chkdsk /v>abc.dat
Falscher Parameter. help
Auch die Option /f oder /F, ber die ich pause
cls
schon einmal berichtete, ist erlaubt und soll if exist abc.dat type abc.dat
Fehler im Dateisystem beheben. Sie wird if exist abc.dat del abc.dat

Lars Aschenbach - Batchprogrammierung - 06-03-04


18 Batch

nicht bekommt, so knnte man den


Auf den ersten Blick mgen diese Anwender mit dieser Zeile:
geheimnisvollen Umleitungen, die CHKDSK /F
oder CHKDSK /V ermglichen, nichts IF NOT %1.==USER. ECHO Falscher Parameter
besonderes sein, schlielich knnte man das informieren.
Ergebnis von HELP auch mit: Etwas krzer ist dagegen:

HELP>ABC.DAT IF NOT %1.==USER. VER //


nach ABC.DAT umleiten, aber es gibt auch fr und gibt auch die Meldung Falscher
diese Art der Umleitung einige sinnvolle Parameter aus.
Anwendungen:
Wenn eine gesuchte Datei nicht aufzufinden
if %1.==. chkdsk /v>abc.dat ist, so kann man dem Anwender mit der
dir %1 Zeile:
wenn man wirklich nur das Verzeichnis
anzeigen lassen will, das als %1 bergeben IF NOT EXIST LOLO.DAT ECHO Datei nicht gefunden
Bescheid geben. Allerdings ist die Variante:
wurde. Sollte nmlich %1 leer sein, so wrde
DIR %1 zur Anzeige des gerade aktuellen IF NOT EXIST LOLO.DAT RUN //
Verzeichnisses fhren! krzer und erfllt den gleichen Zweck.
oder wie ist es mit:
Auch wenn ein Schreibfehler des Anwenders
if not %1.==A. chkdsk /v zu vermuten ist, sollte man darauf hinweisen:
wre z.B. ein guter Ersatz fr
IF NOT %1.==DIR. IF %1.==IR. ECHO Syntaxfehler
if not %1.==A. echo Falscher Parameter
Oder benutzt die Kurzvariante:
Wie bereits erwhnt, mu hinter der Zeile mit IF NOT %1.==DIR. IF %1.==IR. FOR
CHKDSK /F>ABC.DAT oder CHKDSK
/V>ABC.DAT, eine Zeile stehen, die eine Wenn eine Batchdatei unbedingt drei
Bildschirmausgabe zur Folge hat, damit diese Parameter bentigt, damit sie funktioniert, so
Bildschirmausgabe in ABC.DAT landet! ist dieser Check angebracht:
Und das kann eine Zeile sein, die einen der
IF %1%2%3.==. echo Falsche Parameteranzahl
folgenden Befehle enthlt:
ECHO, HELP, DIR, CD, CHKDSK, FORMAT, Die gleichsam wirkende Kurzvariante lautet:
TYPE, COPY, PATH, FDISK, LABEL, VOL, IF %1%2%3.==. TYPE
DATE, TIME, PAUSE oder VER!
Dasselbe Spielchen geht auch mit den Soll der Anwender darber informiert werden,
Befehlen das die gewnschte Datei existiert, so kann
APP, BREAK, CD, CLS, COPY, DIR, FDISK, man das mit:
FORMAT, LABEL, OFF, PAUSE, SHIFT, TYPE,
VER, VOL und VERIFY, aber dort haben die IF EXIST ABC.DAT ECHO Zieldatei existiert
Optionen /F und /V ein- und dieselbe Wirkung erreichen. Aber auch mit:
wie CHKDSK /V>ABC.DAT! IF EXIST ABC.DAT REN NUL L
ist das mglich!
DOS Fehlermeldungen
... kann man sich zu nutze machen und somit Exklusives Datei lschen
einige Bytes sparen, wenn man Batchdateien Ist es Euch nicht auch schon so ergangen,
programmiert! das alle Dateien gelscht werden sollen, mit
Ich bin zwar mehr ein Fan von deutlicherer Ausnahme einer einzigen?
Formulierung, als das DOS bietet, aber es Im Regelfall erfordert das viel Handarbeit,
mu ja nicht jeder nach meiner Pfeife tanzen weil man fast alle anderen Dateien einzelnd,
8-) mit dem DEL-Befehl, vernichten mu! Um
Wenn die laufende Batchdatei das Wort das gesagte etwas plastischer werden zu
USER als Parameter %1 erwartet und es

Lars Aschenbach - Batchprogrammierung - 06-03-04


Batch 19

lassen, prsentiere ich nun ein beispielhaftes @echo off


Verzeichnis: REM EXDEL.BAT - alle Dateien lschen,auer der als
Parameter %1 bergebenen! BSP.: EXDEL
Datentrger in c hat keine Bezeichnung.
autoexec.bat
Inhaltsverzeichnis von c:\TEST
. <DIR> 4.01.80 rem NICHT-ZU-LSCHENDE-Datei angegeben ?
22.53 if %1.==. goto err
.. <DIR> 4.01.80
22.53 rem Existiert die angegebene Datei berhaupt ?
@!@-@!@ fdi
permdata dat
0
730
1.01.80
4.01.80
0.14
23.41
if not exist %1 goto err
undelete dat 1999 4.01.80 23.40 rem Dateinamen in Grobuchstaben umwandeln!
clipbord dat 27 4.01.80 23.26
t txt 3 4.01.80 23.41 set =%1
install txt

2058
0
1.01.80
1.01.80
1.03
23.26
rem Existiert die Variable ?
install bat 102 1.01.80 22.41 if %%.==. goto err
10 Dateien 512 Bytes frei
rem Wildcards im Dateinamen verwendet ?
for %%a in (%1) do if not %1==%%a goto err
Wenn ich, abgesehen von der Datei @!@- rem Alle Dateien lschen, auer der angegebenen!
@!@.FDI, alle anderen Dateien lschen for %%a in (*.*) do if not %%==%%a del %%a
mchte, so mte ich nacheinander diese rem Fehlerbehandlung!
Befehle im DOS eingeben: :err
if %1.==. echo Die NICHT zu lschende Datei fehlte!
DEL *.??T if not %1.==. if not exist %1 echo Die Datei %1 existiert
DEL *. nicht!
Ein weniger erfahrener DOS-User wrde aber if not %1.==. if exist %1 if %%.==. echo
eher diese Befehle verwenden: Umgebungsspeicher voll!
DEL *.DAT if not %1.==. for %%a in (%1) do if not %1==%%a echo
DEL *.TXT Keine Wildcards * ? erlaubt!
DEL *.BAT set =
DEL *.
um alle Dateien, mit Ausnahme der @!@- Die Zeilen, die mit REM beginnen, mssen
@!@.FDI, zu lschen. Egal welche Reihe von nicht abgetippt werden!
Befehlen man bevorzugt, es ist doch immer Wenn ich mich also in dem oben gezeigten
mit einer gewissen Tipparbeit verbunden! Verzeichnis befinde und dort alle Dateien,
Da ich kein Freund von Monotonie und auer der @!@-@!@.FDI, lschen mchte, so
kleinen Tastaturen bin, habe ich nach einer rufe ich nun EXDEL.BAT mit der Eingabe von:
Lsung gesucht, die das vereinfachen knnte.
EXDEL @!@-@!@.fdi
Okay, in der halben Stunde, in der ich die
unten befindliche EXDEL.BAT schuf und auf. Dabei splt es keine Rolle, ob ich den
testete, htte ich die obigen Befehle Namen der nicht zu lschenden Datei in
bestimmt ein Dutzend mal eingeben knnen, Gro- oder Kleinbuchstaben angebe. Nicht
aber wozu ist man schlielich ein erlaubt wren dagegen Aufrufe wie:
HighBatcher 8-)?
EXDEL *.FDI
EXDEL ????????.FDI
EXDEL

Ihr knnt es aber trotzdem einmal


versuchen! EXDEL.BAT wird darauf mit einer
Fehlermeldung antworten und keine einzige
Datei lschen.
Gerne htte ich EXDEL.BAT auch
dahingehend dressiert, das man z.B. durch
die Eingabe von EXDEL *.DAT alle Dateien
lscht, die nicht die Extension .DAT tragen,
aber da mu ich noch weiterforschen!

Lars Aschenbach - Batchprogrammierung - 06-03-04


20 Batch

IF ... ECHO .>Datei mglich wurde. Mit der unten stehenden


Version kann man nun auch in das
Eine Kombination dieser Befehle ist mir Hauptverzeichnis des jeweiligen Laufwerkes
bislang noch in keiner Batchdatei begegnet, wechseln und auch das als D:
obwohl sie durchaus reizvoll und nutzbar ist. anzusprechende DISKFOLIO oder FolioDrive
So habe ich diese Technik selbst schon Diskettenlaufwerk ist nun eingebunden. Die
gebrauchen wollen und knnen, bin aber Variable LW, aus der ersten Version, ist
dabei bse vom DOS berrascht wurden! unntig geworden und die Fehlerrate deutlich
So wird immer die Datei angelegt, die auf gesunken
das Grerzeichen folgt, egal ob die Vorhang auf, hier kommt die neue
vorausgehende Bedingung zutrifft oder nicht! CDD.BAT:
Eine beispielhafte Batchzeile dazu:
@echo off
if %1.==. echo j>test.dat if %1.==. goto err
if not exist %1\nul.* if not exist %1nul.* goto err
War kein Parameter vorhanden, so wird eine cd %1
Datei TEST.DAT kreiert, die drei Bytes gro if not exist %1nul.* goto dy
ist und das j enthlt. War aber der erste rem>%1%1
Parameter vorhanden, so wird eine Null Byte goto chgdrv
:dy
groe Datei namens TEST.DAT erzeugt.
rem>%1\%1
Will man also anschlieend prfen, ob die :chgdrv
Datei TEST.DAT existiert oder nicht, so wird if exist %1\d. D:
man immer vom DOS aufs Glatteis gefhrt, if exist %1d. D:
da die Datei immer existiert, aber nicht if exist %1\c. C:
immer den gewnschten Inhalt hat. if exist %1c. C:
if exist %1\b. B:
Das wiegt sehr schwer, wenn diese Datei
if exist %1b. B:
statt TEST.DAT TEST.BAT heien soll, also if exist %1\a. A:
eine spter aufrufbare Batchdatei sein soll! if exist %1a. A:
Die TEST.BAT wird zwar in jedem Falle if exist d. del d.
funktionieren, aber sie knnte gerade beim if exist c. del c.
PoFo nicht ohne weiteres als rekursive if exist b. del b.
if exist a. del a.
Batchdatei gestaltet werden.
:err
Wie dem auch sei, ich mchte hiermit nur if %1.==. echo Ziellaufwerk und -verzeichnis fehlten!
auf das Problem hinweisen, das die Datei in if not exist %1nul.* if not exist %1\nul.* echo Ziellaufwerk
jedem Falle und unabhngig von der und -verzeichnis gibt es nicht!
vorausgehenden Bedingung erzeugt wird.
Dabei kommt es auch nicht darauf an, ob das Wenn man z.B. vom Hauptverzeichnis des
Vorhandensein oder Nichtvorhandensein Laufwerkes A: ins Verzeichnis SYSTEM des
eines Parameters, einer Variable oder einer Laufwerkes C: wechseln will, so gibt man:
Datei geprft wird!!! CDD C:\SYSTEM
ein. Mchte man dagegen vom Verzeichnis
KnowHow: DIP-OS
\SYSTEM auf C: ins Hauptverzeichnis des
In einem Atemzug Laufwerkes A: wechseln, so erreicht man das
... kann man doch das Laufwerk und das durch die Eingabe von:
Verzeichnis wechseln! CDD A:\
Wahrscheinlich kommen Euch diese Worte
zu recht bekannt vor, weil ich mit diesen Was bei der Benutzung von CDD.BAT zu
schon einmal eine Batchdatei CDD.BAT beachten ist:
vorstellte, die den gleichzeitigen Wechsel von Im gewnschten Laufwerk mu ein
Laufwerk und Verzeichnis ermglichte. Datentrger vorhanden sein, der nicht
Seitdem sind bereits einige Jahre ins Land schreibgeschtzt ist und der noch Platz fr
gegangen, in denen ich mich weiterentwickelt eine temporre Datei hat!
habe und eine berarbeitung der CDD.BAT

Lars Aschenbach - Batchprogrammierung - 06-03-04


Batch 21

KnowHow: DIP-OS ndere nun die Zeile zwei von CUT.BAT wie
folgt:
Stringbearbeitung unter DOS
Unter der Stringbearbeitung versteht man ja if %1.==. c:\cut.ab.Portfolio
gemeinhin das Bearbeiten von Wrtern. So
trennt man z.B. das Wort Eis aus Eismeer Nach dieser nderung und dem erneuten
heraus und arbeitet mit dem so Start von CUT.BAT, wie immer ohne
herausgetrennten Eis weiter. Fr solche Parameter, werden Sie feststellen, das nur
Stringbearbeitung ist das DOS in der Regel noch lio von Portfolio brigbleibt.
nicht geeignet, obwohl diese Mglichkeit Bitte ndere nun die Zeile zwei von
schon Sinn macht, wenn man Datei-, CUT.BAT wie folgt:
Disketten-, Verzeichnisnamen, o.., if %1.==. c:\cut.a.Portfolio
herausfinden will.
Bei den groen PCs unter MS-DOS existiert Nach dem nunmehr dritten Start bleibt nur
aber eine unvorhergesehene Mglichkeit, die noch io vom Portfolio brig. Das ganze
auf dem Backslash basiert und mit der man Geheimnis liegt an der Dateiendung und dem
das Buchstabieren erreichen kann. Diese darauffolgenden Punkt:
funktioniert aber nicht auf dem PoFo! Besteht die Dateiendung aus vier Zeichen,
Durch Zufall bin ich aber auf eine hnliche z.B. .abc, so werden die letzten vier
Methode gekommen, mit der man von einem Buchstaben abgeschnitten. Besteht sie nur
Wort zwischen zwei bis vier Buchstaben aus drei Zeichen, z.B. .ab, so werden die
abschneiden kann. Probieren Sie dazu mal letzten drei Buchstaben abgeschnitten. Bei
CUT.BAT aus, welche Sie im Hauptverzeichnis nur zwei Zeichen, z.B. .a, werden nur die
der Ramdisk C: abspeichern mssen: letzten zwei Buchstaben abgetrennt.
Lassen Sie die Dateiendung, hier .ABC
@echo off
gnzlich weg, so werden generell die letzten
if %1.==. c:\cut.abc.Portfolio
echo %1 vier Buchstaben zum Inhalt des Parameters
%1:
Wer aufmerksam ist und sich bereits ein
if %1.==. c:\cut.Portfolio
wenig mit Batchdateien auskennt, wird
meinen, das CUT.BAT nicht Funktionieren Diese Trennung ist aber in jedem Fall nur
kann, da ein Aufruf der Datei C:\CUT.ABC mglich, wenn der Punkt vor dem
nicht mglich ist. Schlielich existiert erstens gewnschten Wort, hier Portfolio, nicht fehlt!
keine solche Datei und zweitens knnen vom Versuchen Sie eine Trennung bei Wrtern
DOS nur die Programme gestartet werden, durchzufhren, die ASCII-Charaktere
die mit .EXE, .COM oder .BAT enden - nicht oberhalb 128 beinhalten, z.B. , so wird
aber mit .ABC! die Trennung anders ausfallen. Aber das
Und dann lst auch noch der Anhang knnen Sie ja mal selbst ausprobieren!
.Portfolio Verwirrung aus, weil man CUT.BAT ist nur ein Beispiel um die
normalerweise Parameter durch Leerzeichen Stringbearbeitung zu demonstrieren. Wenn
getrennt bergibt! Sie also CUT.BAT durch die Eingabe von
Dennoch hat das so seine Richtigkeit und c:\cut.abc.Portfolio starten, so erhalten Sie
funktioniert, weil der PoFo sich nicht im als Ergebnis auch wieder den Wortfetzen olio
geringsten um die vorgegebene Endung auf dem LCD-Schirm.
kmmert und nur so zur Stringbearbeitung Sie knnten also genauso gut die folgende
gezwungen werden kann. Bisher zumindest. TEST.BAT im Hauptverzeichnis der Ramdisk
Starte bitte CUT.BAT ohne Parameter, also C: speichern...
durch die Eingabe von CUT und Du sollst
folgende Anzeige erhalten: @echo off
echo %1
olio
Wie unschwer zu erkennen ist, hat der PoFo ... und mit der Eingabe \test.123.permdata
also von dem Wort Portfolio nur noch die starten, um das Wort data angezeigt zu
letzten vier Buchstaben behalten. Bitte bekommen.

Lars Aschenbach - Batchprogrammierung - 06-03-04


22 Batch

Ich bin jetzt auf jeden Fall darauf gespannt, Das MS-DOS Kompendium von Chris
wie Du diesen Trick in Batchdateien DeVoney. 1985, ISBN 3-89090-106-9, Markt
verwendest. & Technik Verlag.
Aus der Rolle fallen die folgenden Bcher:
Batchdateien in der Literatur Data Beckers groe MS-DOS Toolbox von
In Zeiten zunehmender Verfensterung ist es Helmut und Manfred Tornsdorf. 1990, ISBN
natrlich nicht leicht, Bcher zum Thema 3-89011-824-0, Data Becker. Dieses Buch
Batchdateien im Handel zu finden. Aber mit bietet eine ausfhrliche Einfhrung in die
etwas Glck und Geduld kann man gesuchte Batchprogrammierung und zustzlich viele
Bcher von Privat erwerben. Hilfsprogramme auf beiliegender Diskette.
Leider gibt es nur recht wenige Bcher in Softwarelexikon MS-DOS von Thomas Tai
deutscher Sprache dazu und diese sind meist und Peter Freese. 1988, ISBN 3-499-18152-
nur fr den wibegierigen Beginner 5, rororo Verlag. Es ist mehr fr den
interessant: engagierten MS-DOS Anwender gedacht, da
DOS Batch Programmierung von Wolfgang es u.a. beschreibt, ab wann welcher Schalter,
Weber. 1992, ISBN 3-8171-1266-1, Verlag welche Option und welcher Befehl in MS-DOS
Harri Deutsch. eingefhrt wurde. Aber auch Begriffe wie
BATCH-Betrieb und Automation unter DOS Akkustikoppler usw. werden dort erklrt.
und Windows 3.x/95 von Alois Kneisle. 1996 An Zeitschriften kann ich empfehlen:
(!), ISBN 3-446-18658-1, Carl Hanser Verlag. 1 Die Sonderhefte des PC-Welt Magazins
Dieses Buch geht sehr in die Tiefe. 2 Die ersten zwei Ausgaben des Magazins
So gehts! Utilities und Batchdateien von 100 Tips & Tools fr Windows & MS-DOS
Rudi Kost, Josef Steiner und Robert Valentin. vom Verlag VTP Frst
1993, ISBN 3-87791-467-5, Markt & Technik 3 Was ist denn DOS? vom KnowWare
Verlag. Verlag
Batch-Dateien - Einsteigerseminar von Dr.
Ekkehard Kaier. 1992, ISBN 3-89360-618-1, Ein bis zwei Seiten mit DOS-Tricks und
bhv Verlag. Batchdateien findet man auch monatlich in
Batchdateien fr MS-DOS 6.0 entwickeln den Zeitschriften PC-Welt, PC Praxis, PC go!,
von Hellermann und Lemme. 1993, ISBN 3- CHIP, DOS und der Highscreen Highlights.
7723-5023-2, Franzis-Verlag. Ansonsten kann ich den Datendienst
Stapeljobs unter MS-DOS von Paulissen & CompuServe wrmstens empfehlen, speziell
Paulissen. 1990, ISBN 3-88963-241-6, das MSDOS-Forum (GO MSDOS), da man
Hofacker Verlag. dort die besten Batchprogrammierer antrifft.
BATCH-PROGRAMMIERUNG unter DOS Selbst wenn eine Frage schon dreiigmal
von Heinz-Peter Gla. 1991, ISBN 3-88322- gestellt wurde, wird sie auch beim 31. mal
332-8, IWT Verlag. beantwortet!
Im Frhjahr 96 soll angeblich noch ein ber den PC-File-Finder von CompuServe
Buch mit dem Titel Batch mal wieder! (GO PCFF) kann man auch eine ganze Reihe
erscheinen. Einer der Autoren soll Werner von Batchdateien finden, wenn man als
Tikki Kstenmacher sein. Dem Titel nach, Schlsselworte (Keywords) BATCH und DOS,
knnte es ein Buch fr fortgeschrittene oder als Extension BAT eintrgt.
Batchprogrammierer werden. Hoffen wir also
das Beste!
Weitere Bcher, die meist ein Kapitel zum
Leerzeilen bei der Bildschirm-
Thema Batchdateien haben, sind: MS-DOS 6 ausgabe durch Batchdateien?
- Tips & Tricks von Helmut und Manfred Normalerweise kann mit dem -ECHO-Befehl
Tornsdorf. 1993, ISBN 3-8158-1014-0, Data keine Leerzeile auf dem Schirm produziert
Becker. werden. Bei den groen PCs behilft man sich
MS-DOS Trainer von Bach und Backer. deshalb mit einem Trick und verlngert den
1995, ISBN 3-8043-3019-3, Augustus Verlag. Befehl um beispielsweise einen Punkt: -
ECHO.- , doch der PoFo spielt da wieder nicht
mit.

Lars Aschenbach - Batchprogrammierung - 06-03-04


Batch 23

Dieser Abbruch mag aber fr manchen von


Glcklicherweise braucht man aber trotzdem Euch unbefriedigend sein, weil dadurch das
nicht auf die Leerzeile zu verzichten! Mit der gewnschte Ziel nicht erreicht wird. So kann
folgenden Tastenkombination, die beim es ja vorkommen, da das Batchprogramm
schreiben von Batchdateien im PoFo eigenem wirklich mehrere Dateien benutzen oder
Texteditor Gltigkeit hat, kann man Leer- bearbeiten soll. Darum gilt es nicht
zeilen fr sptere Bildschirmausgaben abzubrechen, wenn Wildcards verwendet
erzeugen: wurden, sondern der Routine mitzuteilen, das
mehrere Dateien verwendet werden sollen:
Das Wort -ECHO- eintippen
Schlielich haben wir ja gerade dafr die
Taste <FN> drcken und festhalten
Wildcards!!!
Taste <N> drcken Wie man also eine solche intelligente
Beide Tasten loslassen, der Cursor sollte Batchdatei schreibt, die selbstndig erkennt,
nun als Unterstrich dargestellt werden _ ob eine oder mehrere Dateien verarbeitet
Taste <ALT> drcken und festhalten werden sollen, will ich nun einmal beispielhaft
Taste <K> drcken, Taste <I> drcken demonstrieren:
und noch einmal Taste <I> drcken
Taste <ALT> loslassen @echo off
Taste <FN> drcken und festhalten rem wildcards checken und erlauben!
Taste <N> drcken, der Cursor wird for %%a in (%1) do if not %1==%%a goto many
wieder zum Vollcursor rem hier die Zeile fr eine Datei:
Die Taste <+ (Enter o. Return) drcken, copy %1 b:
goto off
fertig! :many
rem hier die Zeile fr mehrere Dateien:
Mit dieser Tastaturakrobatik hat man dann for %%a in (%1) do copy %%a b:
also endlich eine Leerzeile, fr die sptere :off
Bildschirmausgabe, erzeugt. Auch eine
zentrierte Textausgabe kann so auf Wunsch Die oberste und erste FOR-Zeile prft also
kreiert werden! Dazu mu fr jedes wieder die Wildcards ab und springt, wenn
gewnschte Leerzeichen vor dem Text, die ein Wildcard im Parameter %1 steckte, zur
Tastenkombination <Alt> halten, <K> Sprungmarke :many. Dort wird dann mit der
drcken, <I> drcken, <I> drcken, Alt FOR-Zeile der Kopierbefehl fr jede vor-
loslassen, durchgefhrt werden. handene Datei ausgefhrt, auf die die
Optisch ansprechende und deutlich Wildcards passen. War kein Wildcard im
erkennbare Bildschirmmasken sind damit Parameter %1 zu finden, so wird nur die
garantiert und werden jedem Betrachter ein Datei kopiert, die als Parameter %1 berge-
erstauntes Oh! abringen! Das funktioniert ben wurde:
auch auf dem PC, auch wenn man dort das COPY %1 B:
ominse Leerzeichen (ASCII-charachter 255)
durch andere Tastendrcke erzeugen mu! Danach wird zur Sprungmarke :off
gesprungen, damit die Datei nicht noch
einmal kopiert wird.
Wildcards * ? - Teil 2 Leider ist das Beispiel nicht sehr gut, weil
Im ersten Teil zeigte ich Euch, wie man die man auf die Zeile COPY %1 B: verzichten
Wildcards * und? im Parameter %1 erkennen kann: Denn die FOR-Zeile aus :many
und verbieten kann. Dies ist ja immer dann funktioniert auch dann, wenn sich kein
von Interesse, wenn das Batchprogramm nur Wildcard in %1 befindet. D.h., man kann auf
mit einer Datei zur Zeit arbeiten soll. Wer die die Prfung der Wildcards verzichten und die
Technik aus dem ersten Teil verwendet, wird Routine wie folgt verkrzen:
dann einen Abbruch des laufenden Batch-
programmes erzwingen, wenn im Parameter @echo off
%1 zumindest einmal eines der Wildcards for %%a in (%1) do copy %%a b:
vorkommen sollte.
Diese Version geht immer, egal ob man
Wildcards verwendete oder nicht! Da die

Lars Aschenbach - Batchprogrammierung - 06-03-04


24 Batch

Wildcards ? und * nur mit Dateinamen Sprungmarke auch vom DOS gefunden und
funktionieren, sollte man immer eine FOR- ausgefhrt. Sogar ohne die Anzeige der Zeile
Schleife verwenden, wenn eine, oder mehrere auf dem Bildschirm!
Dateien bearbeitet werden sollen! Man Was lernen wir also daraus?
erreicht durch die FOR-Schleife auf jeden Fall 1. Egal ob das ECHO on oder off ist, eine
eine hhere Flexibilitt. Zeile, die mit einem Doppelpunkt beginnt,
wird nie auf dem Bildschirm angezeigt!
2. Mchte man zu Testzwecken die
Sprungmarken - Teil 3 Ausfhrung einer Sprungmarke verbieten und
Es soll ja sehr sparsame Leute geben, deren statt dessen einen Abbruch erzwingen, so
Sparsamkeit sich sogar bei der fgt man den Klammeraffen @ vor dem
Programmierung von Batchdateien Doppelpunkt der Sprungmarke ein! Ein Punkt
bemerkbar macht! . hat brigens dabei dieselbe Wirkung!
So sparen sie sich die blicherweise Letzteres ist nur bei der Erprobung und
einleitende Anfangszeile @ECHO OFF, wenn Fehlersuche zu empfehlen. Oder hat jemand
die gesamte Batchdatei nicht mehr als elf eine Idee, wie man das sonst nutzen knnte?
Zeilen lang wird. Dafr beginnen sie dann die
zu schreibenden Batchzeilen mit dem KnowHow: DIP-OS
Klammeraffen @, der die Bildschirmausgabe
unterdrckt: Bedingtes SHIFTen
Mit dem Befehl SHIFT werden Parameter
@cls verschoben, oder Schleifen konstruiert, die in
@dir /p
Abhngigkeit von Parametern ausgefhrt
Weniger Geizige wrden dieselben Zeilen so werden. Wer also diesen Befehl einsetzt, wei
schreiben: in der Regel genau, was bezweckt werden
soll.
@echo off Durch ein paar Experimente bin ich auf
cls neue Erkenntnisse zu diesem Befehl
dir /p gekommen, auch wenn ich noch keine
Routine prsentieren kann, die davon
Wer beide Versionen abtippt und speichert,
profitiert. Angeblich ist der Befehl SHIFT nicht
wird feststellen, das die erste Version um
durch Parameter, Variablen oder Optionen
neun Bytes krzer ist und doch genau wie die
ergnzbar. So kann man z.B. keinen
zweite Version funktioniert. Warum sollte
Parameter angeben, ab dem geshifted
man also eine Batchdatei mit der Zeile
werden soll. Kurioserweise kann ich aber
@ECHO OFF beginnen, wenn ein Klammeraffe
beim PoFo eine beliebige Variable nach -
@, vor jeder Zeile, dasselbe bewirkt??? Weil
SHIFT- angeben, die damit das Verhalten von
Sprungmarken da wieder einen Strich durch
-SHIFT- ndern kann:
die Rechnung des Programmierers machen,
lautet darauf die Antwort!!! Denn steht vor -SHIFT %!%-
einer Sprungmarke ein Klammeraffe, so kann
diese Sprungmarke nicht vom DOS Wenn keine Variable! existiert, so wird ganz
angesprungen werden. Man erhlt dann normal geshifted. Enthlt aber die Variable!
nmlich die bekannte Fehlermeldung irgendwelchen Inhalt, so bekommt man die
Sprungmarke nicht gefunden! Fehlermeldung Falscher Parameter und -
Mit diesen Zeilen knnt ihr das ja einmal SHIFT- wird nicht ausgefhrt. Auch die
ausprobieren: Variable bleibt unverndert.
Weil ich die Fehlermeldung unterdrcken
@goto jj wollte, leitete ich sie dann nach NUL um:
@rem
@:jj -SHIFT %!%>nul-
@dir /p
Solange die Variable! nicht existiert, wird
Lt man dagegen den Klammeraffen vor der auch ordnungsgem geshifted. Wenn aber!
Sprungmarke :jj wieder weg, so wird die existiert, erscheint nicht nur obige

Lars Aschenbach - Batchprogrammierung - 06-03-04


Batch 25

Fehlermeldung, sondern auch die nchste Das Gert NUL


Zeile kommt nicht zur Ausfhrung! Sie wird
dann einfach bersprungen. Ich kann diese ... ist selten dokumentiert und dennoch
Fehlermeldung also nicht unterdrcken, wohl hufig in Batchdateien zu finden. Was es
aber die Ausfhrung der nchsten Zeile damit auf sich hat und wie es eingesetzt
unterbinden. werden kann, mchte ich hier zu erklren
Wenn Ihr Euch davon selbst berzeugen versuchen.
wollt, so produziert mal die Variable! und Meistens steht diese Gertebezeichnung am
modifiziert die NOSHIFT.BAT: Ende vieler Batchzeilen und prsentiert sich
als Zeichenfolge > NUL. Mit dem Zeichen
@echo off >, soviel drfte bereits bekannt sein, wird
echo %0 %1 eine Aktion, ein Text oder eine Meldung, vom
shift %!%>nul Schirm auf ein anderes Gert oder in eine
echo No SHIFT Test! Datei umgeleitet. So erzeugt der Befehl -
echo %0 %1
pause
ECHO Hallo User! > USER.TXT- eine Datei
namens USER.TXT, in der der Text Hallo
Dank dieser undokumentierten Funktion kann User! abgelegt wird. Schreiben wir aber nach
man also Minisprnge machen, durch die eine dem Umleitungszeichen > z.B. PRN:, so
Passage von Befehlszeilen doppeldeutig wird der Text auf dem hoffentlich
verwendbar ist. Es liegt nur an uns, dieses angeschlossenen Drucker ausgegeben.
nutzbar zu machen! Einige andere Aktionen, wie
Verzeichnisanlegung, Dateikopierung oder
Fehlermeldungen, sollen aber erst gar nicht
auf dem Bildschirm erscheinen, da sie evtl.
Textmasken zerstren oder wichtige
Informationen vom Schirm verdrngen. Weil
die Ablage in Dateien unntige
Platzverschwendung wre, sollten alle
Kommentare des Computers, er sabbelt halt
gerne, im Nirwana (Nichts, EDV-Loch,
Nullspeicher) landen. Und hier tritt das Gert
NUL in Erscheinung, welches alles schluckt,
aber nie wieder ausspuckt! Hungrig wie es
ist, arbeitet es mit jedem DOS-Befehl
zusammen, auch wenn gerade dadurch die
gewnschte Aktion vereitelt wird. So findet
z.B. kein Verzeichniswechsel statt, wenn man
den folgenden Befehl eingibt: -CD \ > NUL-.
Die Meldung X Datei(en) kopiert, die nach
einem erfolgreichen Kopiervorgang
ausgegeben wird, kann man aber sehr wohl
damit unterbinden: -COPY A:*.* C: > NUL-.
Versucht man auf einem Laufwerk ein
Verzeichnis zu erzeugen, welches bereits
existiert, gibt es immer einen gehssigen
Kommentar vom Computer. Hngt man das
NUL-Gert an den Befehl -MD SYSTEM-, der
hier als Beispiel zu verstehen ist, bt sich der
Computer in Toleranz und schluckt seine
Meinung herunter. Die Syntax dazu lautet:

-MD SYSTEM > NUL-.

Lars Aschenbach - Batchprogrammierung - 06-03-04


26 Batch

Besonders bei den Befehlen -MD-, -COPY- Ein DOS vor Version 3.30
und -REN- kommt das Gert NUL zur vollen
Geltung, lt sich aber noch bei vielen ... kennt den Klammeraffen @ nicht, mit dem
anderen Befehlen einsetzen. Den Nutzen man in der Regel die erste Zeile einer
bemerkt man erst beim ausprobieren! Batchdatei einleitet. Unser PoFo ist da eine
Etliche Wochen funktionierte unsere rhmliche Ausnahme!
spezielle Batchdatei, die vollautomatisch alle Mit dem Klammeraffen @ erreicht man, und
Dateien von A: auf C: kopierte, tadellos, aber das sollte bereits bekannt sein, die
nun tritt trotz der NUL-Umleitung ein Fehler Unterdrckung der Bildschirmausgabe, wenn
auf, den der Bediener mit Abbruch, eine Batchzeile abgearbeitet wird. Lt man
Wiederholen oder Ignorieren beantworten z.B. diese Zeilen:
mu. Wozu leiten wir alle REM TEST.BAT
Computerkommentare nach NUL um, wenn er ECHO Hallo User!
doch eine Fehlermeldung ausgibt? Es handelt
sich dabei um einen so elementaren Fehler, als TEST.BAT laufen, so ergeben sich
da der Computer unsere Umleitung folgende Bildschirmausgaben des DOS:
ignorieren mu, damit der Bediener die
c:\test>REM TEST.BAT
Chance hat, diesen Fehler zu beseitigen.
Kurz: Der Computer kann den Fehler nicht c:\test>ECHO Hallo User!
von sich aus beheben, oder gibt es einen der Hallo User!
selbstndig Disketten wechseln kann?
c:\test>
Guten Batchprogrammierern, und die
wollen wir ja alle werden, ist aber selbst Stellt man dagegen beiden Zeilen den
diese Unterbrechung ein Dorn im Auge. Sie Klammeraffen @ vor(an):
geben daher die Antwort selbst durch eine @REM TEST.BAT
bereitgestellte Datei, die die Antwort A, W @ECHO Hallo User!
oder I an den Tastaturpuffer bergibt.
Knnen wir also einen Abbruch verantworten, so sieht die Bildschirmausgabe dann so aus:
oder wollen den Fehler auf unsere Art Hallo User!
c:\test>
behandeln, so erstellen wir uns doch einmal
Um nicht vor jede Zeile den Klammeraffen
diese Datei mit einem Texteditor! Editor
schreiben zu mssen, gibt es den globalen
starten, <A> eintippen, Rettern- bzw.
Befehl:
Entertaste drcken und den Text unter dem
Namen A.DAT abspeichern - fertig. In ECHO OFF
unserem bisherigen Kopierbefehl -COPY A:*.* mit dem das DOS die Anzeige der gerade
C: > NUL- gilt es nun, die Datei A.DAT auszufhrenden Batchzeile unterbindet. Weil
einzubinden. solche Anzeigen nur stren und viel zu
Weil der geplante Tastendruck <A> aus der schnell ber den Bildschirm huschen, beginnt
Datei kommen soll, mu eine Umleitung aus man also eine Batchdatei mit der Zeile:
der Datei erfolgen. Dazu mu das
gegenteilige Umleitungszeichen < ECHO OFF
verwendet werden, inkl. der zu Damit auch diese Zeile nicht angezeigt wird,
entnehmenden Datei, die in unserem Fall stellt man den Klammeraffen voran:
A.DAT heit. Die neue Syntax lautet nun: - @ECHO OFF
COPY A:*.* C: < a.dat > nul-. Und schon wird nur das vom DOS auf dem
Sollte also in Zukunft beim kopieren ein Bildschirm ausgegeben, was aus den
Fehler auftauchen, so wird die Aktion Befehlen ECHO, DIR, COPY, HELP, CHKDSK,
kommentarlos abgebrochen. Diese Technik DATE, TIME, FORMAT usw. resultiert. Auch
mu aber jeder Batchprogrammierer auf die Fehlermeldungen werden ausgegeben.
eigene Gefahr verwenden!!! Aber was tun, wenn das DOS nicht die
Versionsnummer 3.30 trgt und die
Batchdatei unter diesem DOS laufen soll? Das
DOS wrde nmlich die Zeile:

Lars Aschenbach - Batchprogrammierung - 06-03-04


Batch 27

@ECHO OFF echo Hier knnen beliebig viele Zeilen mit ECHO
ausgegeben werden, damit
mit einer Fehlermeldung quittieren: Befehl echo man den Anwender ber alles informieren kann!!!
oder Programm nicht gefunden, da es den :off
Klammeraffen @ nicht kennt. Das ECHO wre
dann auch weiterhin eingeschaltet! Wird eine Batchdatei gestartet, die diese
Aber die Lsung ist ganz einfach: Man lenkt Zeilen enthlt, so informiert sie den
die Fehlermeldung zum Gert NUL um und Anwender, wenn dieser eine der folgende
wiederholt den Befehl ECHO OFF, aber Zeichenfolgen, als Parameter %1, bergeben
diesmal ohne @: hat:
@ECHO OFF>NUL
ECHO OFF ? h H help HELP /? /h /H /help /HELP -? -h -H -help -
Und schon luft auch diese Batchdatei unter HELP
DOS Versionen vor 3.30! Okay, okay, es
Und wenn kein Parameter beim Start
kommt nicht mehr allzu hufig vor, das eine
angegeben wurde, so wird der Anwender
DOS Version vor 3.30 noch in Betrieb ist,
ebenfalls informiert!
aber wenn doch, dann wit Ihr nun jeden-
falls, wie Ihr das Problem ganz galant lsen
knnt.
4DOS fr den PoFo und andere
Schlielich ist diese Lsung dann unter MS-DOS Pockets
jedem DOS, ohne nderung, einsetzbar!
Knnt Ihr Euch noch an diese MS-DOS Erweiterung erinnern?
Bis zur MS-DOS Version 3.30 feierte die Erweiterung 4DOS
groe Erfolge, da sie das MS-DOS um sehr interessante und
Erste Hilfe!!! ntzliche Befehle ergnzte:
So kann man mit dem Alias-Befehl eigene
Der erste Start einer fremden Batchdatei ist Befehle kreieren, mit Gosub und Return in
mit viel Ungewiheit verbunden! So wei Batchdateien herumspringen, mit Input und
man oft nicht, welche Parameter und wie Inkey Tastaturabfragen in Variablen packen
viele Parameter angegeben werden mssen, (kein Errorlevel!), mit Screen Texte an
welche Variablen vorher schon bereitzustellen beliebiger Stelle des LCD-Schirms plazieren,
sind und was die Batchdatei berhaupt mit Call zwischendurch bis zu fnf andere
erledigen soll. Batchdateien aufrufen, mit Text und Endtext
Darum sollte man den Anwender nicht mit ganze Textblcke ausgeben, mit Pushdir und
diesen Fragen im Regen stehen lassen, Popdir sich Verzeichnisse und Laufwerks-
sondern eine Hilfsfunktion implementieren, bezeichnungen merken u.v.m.
beim schreiben des Batchprogrammes, die Neulich fand ich also 4DOS inkl. Handbuch
dem unerfahrenen Anwender etwas unter die auf dem Grabbeltisch eines EDV- Hndlers
Arme greift, bzw. ihn informiert! Ich habe mir und nahm es auch nach kurzem Studium mit.
dafr die folgenden Zeilen ausgedacht: Problemlos konnte ich 4DOS auf meinem
@echo off PoFo mit Bios 1.072 installieren. Eigentlich
for %%a in (. h. H. help. HELP. -h. -H. -help. htte mich das ja schon stutzig machen
-HELP.) do if %1.==%%a goto help mssen, nachdem was man immer wieder
if %1.==?. goto help mit dem PoFo erlebt. Der Reihe nach ging ich
if %1.==-?. goto help also die neuen Befehle durch und probierte
if %1.==/?. goto help
if %1.==/h. goto help
sie aus.
if %1.==/H. goto help berraschenderweise funktionierte das Gros
if %1.==/help. goto help problemlos, aber die die nicht funktionierten,
if %1.==/HELP. goto help waren sinnigerweise die wichtigsten!
rem CLS, LIST, TYPE, HELP, KEYSTACK und DIR
rem Hier wird dann das eigentliche Batchprogramm wollten nicht wie ich es wollte. Aber weil man
eingebunden!!!
rem
sich mit 4DOS eigene Befehle kreieren kann,
goto off habe ich diese mit einigen Tricks und
rem Hier beginnt die erste Hilfe! Batchdateien selber nachempfunden. Leider
:help ist es dazu unerllich 4DOS zu verlassen
und ins DIP-OS zurckzukehren. Nur bei den

Lars Aschenbach - Batchprogrammierung - 06-03-04


28 Batch

reparierten Befehlen CLS und KEYSTACK, mir dann diesen Hilfstext auf dem PoFo unter
verbleibt man im 4DOS, sofern man nicht mit 4DOS anzeigen lie, funktionierte gleich
KEYSTACK explizit den Ausstieg erzwingt! darauf meine CLS- Reparatur nicht mehr! Auf
Einige bisher vertraute Befehle des DIP-OS die Schliche bin ich dem Fehler gekommen,
sind unter 4DOS leider nicht mehr als ich mir diesen Hilfstext mal in der
zugnglich: APP, CHKDSK, FDISK, FORMAT Textverarbeitung des PoFo ansah. Hinter dem
und OFF. Auch diese konnte ich aber mit Textende prangte doch glatt das
FAKE, ALIAS und div. Batchdateien dem Dateienzeichen ^Z. Kaum hatte ich das
4DOS beibringen. Wendet man nun die gelscht und den PoFo von Grund auf neu
Befehle APP, CHKDSK und FORMAT wie gestartet, war dieser Fehler nie mehr
gewohnt an, so ist die Rckkehr ins DIP-OS gesehen!
vorprogrammiert. Bei der Verwendung von
OFF gelangt man aber beim erneuten ALLREAD.BAT - fr Leseratten
Einschalten des PoFo, automatisch ins 4DOS.
Wer eine ganz bestimmte Dateigruppe
Hat man 4DOS autostartend auf der
sichten will, oder mu, ist gezwungen den
Memorycard installiert, so gelangt man auch
TYPE-Befehl entsprechend hufig einzugeben.
nach dem FDISK-Befehl wieder ins 4DOS.
Diese Monotonie macht natrlich krank und
Die Doskey-Funktion gehrt zu den
schreit geradezu nach einer Batchdatei:
interessantesten Erweiterungen, da man nun
alle Eingaben mit den Cursortasten @echo off
oben/unten durchblttern, modifizieren und cls
reaktivieren kann. if %1.==. goto err
Im groen und ganzen ist 4DOS also eine for %%d in (%1) do type %%d /p
goto off
sehr sinnvolle Ergnzung zum DIP-OS und :err
bringt viele Mglichkeiten zur echo Dateigruppenangabe fehlt!
Batchprogrammierung mit sich. Obwohl ich :off
UPDATE und PORTDIV installiert habe,
erschienen zwar so manchmal unsinnige Ruft man diese Datei mit ALLREAD *.BAT auf,
Fehlermeldungen, wie z.B.: Unknown so sollte man alle Batchdateien seitenweise
command lias, aber diese beeintrchtigten angezeigt bekommen. Doch erste Tests
die Arbeitsweise des PoFo bislang nicht. ergaben, das diese Routine nicht unter jeder
Hier in Deutschland wurde dieses DOS-Version funktioniert, da es nicht immer
Sharwareprogramm von der Kirschbaum die Option /p beim TYPE-Befehl gibt.
Software GmbH, Kronau 15, 8901 Emmering Hier die technische Erluterung:
vertrieben. Ob und zu welchem Preis es noch Zunchst wird nach dem Aufruf geprft, ob
erhltlich ist, entzieht sich meiner Kenntnis. berhaupt eine Dateiengruppe als Parameter
Kurios fand ich nur, da ich in einer %1 angegeben wurde. Entweder springt DOS
Programmliste des Atari-Forums aus dem zur Sprungmarke :ERR und gibt eine
CompuServe, Stand: Juni 93, diese tolle Fehlermeldung aus, oder es fhrt mit der
Erweiterung nicht zu finden war. Dabei FOR-Schleife fort. In dieser verweilt das DOS
stammt 4DOS aus den USA und wurde 1989 solange, bis die Menge (%1), also alle
programmiert! Vielleicht liegt es aber auch Dateien die der Maske entsprechen, die als
daran, da man ohne das dazugehrige Parameter bergeben wurde, auf dem Schirm
Handbuch nicht sehr weit kommt, gerade auf ausgedruckt wurde. Danach entfleucht
dem PoFo, da dort die Help-Funktion nicht ALLREAD.BAT kommentarlos zur
ohne weiteres installierbar ist. Die gesamte Sprungmarke :off und stellt die Arbeit ein.
Erweiterung bentigt schon alleine auf einer ANSI.SYS-TIP: Escapesequenz
Diskette etwa 330 KB. Das man mit dem Bildschirm- und
Zum Abschlu wieder eine Ungereimtheit, Tastaturtreiber ANSI.SYS viel erreichen kann,
die mir in diesem Zusammenhang mit dem ist wohl unumstritten. Oftmals gibt man eine
PoFo auffiel: Ich habe die 4DOS-Befehle aus solche Befehlsfolge mit dem PROMPT-Befehl
dem Handbuch in meinen PC eingetippt und ein, da man sonst die Escapesequenz
dann auf die Memorycard bertragen. Als ich

Lars Aschenbach - Batchprogrammierung - 06-03-04


Batch 29

(Charakter 27, Darstellung ^[), nicht unter gewnschte Syntax, bevor ich den Text unter
DOS erzeugen kann. einem neuen Namen abspeichere.
So kann man seinem Computer ein X fr Weil viele Wege nach ROM fhren, kann
ein U vormachen, wenn man ANSI.SYS man sich natrlich die Escapesequenz auch
installiert hat und den Befehl durch andere Programmiersprachen
PROMPT$e[X;Up eingibt. Leider wird aber ergaunern!
durch diese Eingabe auch das Prompt Portfolio-User haben es dagegen etwas
gelscht, welches danach also rekonstruiert einfacher und behelfen sich mit der
werden mu. eingebauten Tabellenkalkulation. Dort wird
Zwar kann man das auch mit der folgenden einfach in die erste Zelle, des ansonsten
Batchdatei realisieren, aber man verschenkt leeren Arbeitsblattes, der Wert 27
doch wertvollen Speicherplatz: eingegeben. Nach dem diese Eintragung
unter dem Namen UNNAMED.WKS
@set op=%prompt% gespeichert wurde, ldt man diese in die
@prompt$e[X,Up Textverarbeitung und lscht alle Zeichen vor
und hinter der Zeichenfolge ^[.
@prompt=%op%
Anschlieend setzt man vor ihr noch den
Befehl ECHO, bevor man den so
Krzer und einfacher ist da der Weg ber den
entstandenen Text als ANSIECHO.BAT
Befehl ECHO, da erstens ECHO mit @ECHO
abspeichert.
OFF ausgeschaltet sein darf und zweitens,
Auch alle anderen Steuerzeichen kann man
keine Leerzeile auf den PromptBefehl folgen
so einfangen und in Variablen festhalten!
mu, die die Einstellung vornimmt:
PS: Probiert doch mal in der PoFo-
@echo off Textverarbeitung die Tastenfolge ALT- ALT-
echo ^[[X;Up aus. Dieser Weg ist einfacher und erzeugt
ebenfalls das ESC-Zeichen.
Problematisch an dieser Version ist aber, wie
eingangs erwhnt, die Erzeugung der Batch bearbeitet das Batchver-
einleitenden Escapesequenz, mit der jede
ANSI betreffende Einstellung beginnen mu. zeichnis
Zwar kann man die Zeichenfolge ^[, die fr Normalerweise zieht man sich dabei, pardon
die Escapesequenz steht, per Tastatur einzeln der Batchdatei, den Boden unter den Bytes
eingeben, aber sie ist dann nicht weg! Hat nmlich diese Batchdatei ihren
gleichbedeutend wie die Escapesequenz ^[, Stammplatz in dem Verzeichnis, in dem alle
da sie dann aus zwei Zeichen besteht, wh- Batchdateien stehen und dieses Verzeichnis
rend die Escapesequenz tatschlich nur ein mu vorbergehend gelscht werden, so
Zeichen beinhaltet, obwohl zwei auf dem kann das DOS die entsprechende Batchdatei
Bildschirm ausgegeben werden. nicht mehr wiederfinden und bricht etwa mit
folgender Meldung ab:
Es bleibt einem also nur der Ausweg ber
eine hhere Programmiersprache, damit der Diskette mit Stapeldatei einlegen!
Charakter 27 in Batchdateien genutzt werden Wenn bereit eine beliebige Taste drcken.
kann. Ich habe mir dieses Zeichen mittels
Da aber die Batchdatei sich selbst ausradiert
GW-BASIC geklaut und in die Batchdatei
hat, kann man so viele Tasten drcken wie
ANSIECHO.BAT geschrieben:
man will. Denn das DOS wird diese
10 open ansiecho.bat for output as #1 Batchdatei nicht mehr finden!
20 print #1,ECHO ;chr$(27);chr$(91); Einzig der Abbruch mit <STG>+<C> hilft
30 close kurzfristig aus dieser Misere
herauszukommen. Die restlichen geplanten
Mchte ich also nun eine Einstellung mit Befehle mssen dann von Hand eingegeben
ANSI.SYS vornehmen, so lade ich werden, damit man die Ordnung
ANSIECHO.BAT in meine Textverarbeitung wiederherstellen kann.
und ergnze den ECHO-Befehl um die

Lars Aschenbach - Batchprogrammierung - 06-03-04


30 Batch

Ich habe dieses schon mehrmals erlebt und [24] ::: EXTERNAL : FIND, MORE
eine Lsung geschaffen, die die Batchdatei [25] ::: PERMVAR : PATH
[26] ::: OPTIONVAR : BDV, BDY
aus dem kritischen Verzeichnis verlagert:
[27] ::: TEMPVAR : FL
[28] ::: USEDFILE : BATHELP.BAT
@echo off
[29] ::: TEMPFILES : unknown - made by FIND & MORE
if %1.==. goto err
[30] ::: MAKEFILE : none
copy c:\batch\%1.bat c:\>nul
[31] ::: SCREEN : 80 columns, 25 rows
c:\%1 %2 %3 %4 %5 %6 %7 %8 %9
[32] ::: VERSION : 09 Feb 1996
:err
[33] ::: TESTED ON : MS-DOS 6.22
echo Aufruf mit:
[34] ::: AUTHOR : Lars Aschenbach, Germany
echo BATCH Batchdatei Parameter
[35] :::
[36] if %PATH%.==. echo.
Mchte ich also das Verzeichnis BATCH mit [37] if %PATH%.==. echo Cant work: Variable PATH is
meiner Batchdatei DEFRAG.BAT missing!
defragmentieren, so starte ich diesen [38] if %PATH%.==. goto err
Vorgang mit: [39] set | find windir>nul
[40] if not errorlevel 1 if errorlevel 0 echo.
-BATCH DEFRAG \BATCH- [41] if not errorlevel 1 if errorlevel 0 echo Cant work:
Windows is running!
[42] if not errorlevel 1 if errorlevel 0 goto err
Die Routine BATCH.BAT kopiert daraufhin [43] if not exist %BDV%%BDY%nul if exist
DEFRAG.BAT in das Hauptverzeichnis von %BDV%%BDY%\nul set bdy=%BDY%\
C: und startet anschlieend DEFRAG.BAT [44] if not %1.==. shift
vom Hauptverzeichnis von C:. Zwar erfolgt [45] if exist %BDV%%BDY%%0.bat set
dieser Start nur mit maximal acht fl=%BDV%%BDY%%0.bat
Parametern, aber das drfte in den meisten [46] if exist %BDV%%BDY%%0.bat if %FL%.==. goto err
[47] if exist %BDV%%BDY%%0 set
Fllen auch gengen. Nachdem die fl=%BDV%%BDY%%0
eigentliche Defragmentierung abgeschlossen [48] if exist %BDV%%BDY%%0 if %FL%.==. goto err
wurde, mt Ihr die DEFRAG.BAT [49] if exist %0.bat set fl=%0.bat
eigenhndig aus dem Hauptverzeichnis von [50] if exist %0.bat if %FL%.==. goto err
C: entfernen, weil DEFRAG.BAT nicht [51] if exist %0 set fl=%0
rekursiv programmiert wurde! [52] if exist %0 if %FL%.==. goto err
[53] if %FL%.==. goto err
[54] find :::<%FL% | find find /v | more
[01] @echo off [55] echo No (more) lines of documentation in %FL%
[02] cls found!
[03] echo i+ [56] :err
[04] echo Lars Aschenbachs Batchfiles [57] if not %PATH%.==. if %FL%.==. echo.
[05] echo [58] if not %PATH%.==. if %FL%.==. if %0.==bathelp.
[06] echo in action: BATHELP .BAT v02-09-96 echo Try: BATHELP filename[.ext]
[07] echo for DOS 3.30 or higher [59] if not %PATH%.==. if not %0.==bathelp. if %FL%.==.
[08] echo + echo File not found!
[09] rem [60] set fl=
[10] ::: User Explanation: [61] echo.
[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 * ? arent allowed in filename
and extension
[19] ::: HINT : lines including ::: get interpreted as
documentation
[20] :::
[21] ::: Technical Explanation:
[22] :::
[23] ::: DOS : 3.30 or higher

Lars Aschenbach - Batchprogrammierung - 06-03-04


Batch 31

%INP%1==%TEST% %E%%1 ist nicht die letzte Datei in


Befehle in Variablen diesem Verzeichnis
Beim PoFo mu um jedes Byte Speicher %G%off
gefeilscht werden, da das Originalteil max. :err
80KB intern fr Userdaten bereitstellt. %E%Erster Parameter fehlte!
:off
Externe Datentrger bis zu 4MB sind zwar
erhltlich, aber unverhltnismig teuer. Weil das ganze ziemlich abstrakt ist, hier
Abhilfe schaffen hier die Packer und noch einmal in Klarschrift:
Komprimierungsprogramme, die aber nichts
mit Batchdateien anfangen knnen. @echo off
Nach dem Motto Selbst ist der if %1.==. goto err
Programmierer, packen wir die Befehle in for %%A in (*.*) do set TEST=%%A
Variablen, deren Namen krzer sind, als die if %1==%TEST% echo %1 ist die letzte Datei in diesem
Verzeichnis
der Befehle. Eventuell wird zwar dadurch die
if not %1==%TEST% echo %1 ist nicht die letzte Datei in
Ausfhrungszeit etwas lnger, weil jede diesem Verzeichnis
Variable wieder in einen Befehl umgewandelt goto off
wird, aber man spart doch einige Bytes. :err
Hier also die Liste der Befehle und der echo Erster Parameter fehlte!
Ersatzvariablen, die ich dafr vorschlage: :off

BEFEHL: VARIABLE: Wer sich diese Schreibweise angewhnen


mchte, ich bleibe aus publizistischen
-BREAK ON- BN Grnden bei der Klarschrift, mu natrlich
-BREAK OFF- BF darauf achten, das er die obigen Variablen
-CHKDSK - CD
nicht fr andere Zwecke definiert. Ebenso
-COPY - C
-DATE - W mssen evtl. die bisherigen Batchdateien
-)DO - D entsprechend gendert werden.
-ECHO - E Auch wenn sich nur wenige die Arbeit
-FOR %%A IN FA machen sollten, werde ich in Zukunft diese
-FORMAT - F Variablen vermeiden, damit es keine Konflikte
-GOTO - G
gibt!
-IF ERRORLEVEL - IR
-IF EXIST - IE brigens: Die Definition der Variablen, mit
-IF NOT EXIST - INE Befehlen, sollte in der AUTOEXEC.BAT
-IF NOT %- INP erfolgen, damit man keinen Schiffbruch
-IF %- IP erleidet. Zu diesem Zwecke spendiere ich
-LABEL - L Euch die BEFEHLE.BAT, die Ihr z.B. mit -
-PATH- A
TYPE \BATCH\BEFEHLE.BAT>>
-PAUSE- P
-PROMPT- R C:\AUTOEXEC.BAT an die AUTOEXEC.BAT
-SET - S hngen knnt:
-SHIFT- H
-TIME - Z @echo off
-TYPE - T set bn=BREAK ON
set bf=BREAK OFF
Folgende Befehle bringen keine Zinsen ein, set cd=CHKDSK
set c=COPY
wenn man diese in Variablen unterbringt:
set w=DATE
CLS, CD, DEL, DIR, MD, RD, REM, REN, VER set d=)DO
und VOL. set e=ECHO
set fa=FOR %%A IN (
Eine Batchdatei knnte dann z.B. so set f=FORMAT
aussehen: set g=GOTO
set ir=IF ERRORLEVEL
@%E%OFF set ie=IF EXIST
%IP%1.==. %G%ERR set ine=IF NOT EXIST
%FA%*.*%D%%S%TEST=%%A set inp=IF NOT %
%IP%1==%TEST% %E%%1 ist die letzte Datei in diesem set ip=IF %
Verzeichnis set l=LABEL

Lars Aschenbach - Batchprogrammierung - 06-03-04


32 Batch

set a=PATH @prompt $e[;oep


set p=PAUSE
set r=PROMPT @prompt $e[;Oep
set s=SET
set h=SHIFT @prompt $e[;aep
set z=TIME
set t=TYPE @prompt $e[;Aep
echo Alle internen Befehle in Variablen echo gepackt. Info
durch SET Befehl! @prompt=%op%
@cls

Printer-Adapter & CE-126P Sofern ANSI.SYS in der CONFIG.SYS


angemeldet wurde, werden die Umlauttasten
So heit zumindest die Druckereinheit, die auch tatschlich umbelegt, wenn man
ich vor kurzem bei Becker & Partner erwarb. PRINTER.BAT aufruft. In allen zuknftigen
Es handelt sich dabei um einen SHARP Texten sind dann auch keine Umlaute mehr
Thermodrucker, der mittels Interface und zu finden.
Software dem PoFo zugnglich gemacht wird. Was ist aber mit den alten Texten, die ja
Dieser wird direkt am Erweiterungsbus des noch Umlaute enthalten? Diese
PoFo angeschlossen und durch die umzuschreiben ist ein langwieriger Aufwand,
CONFIG.SYS aktiviert. Scheinbar gab es aber der sich auch nicht lohnt. Trotzdem wollte ich
auch einmal eine Version, die ber das nicht mit den Grafikzeichen leben und begann
interne Memorycardlaufwerk angeschlossen die Treiberdatei PFP.SYS zu untersuchen. Und
und bedient wurde. Zumindest wird diese in der Tat gelang es mir nach einiger Zeit die
Version im mitgelieferten Faltblatt erwhnt. gesuchten Speicherstellen aufzuspren und
So ist es auch nicht verwunderlich, das die zu ndern. Da ich die PFP.SYS nicht wieder
dortige Installationsanweisung nicht bei auf B: speichern konnte, B: ist das EPROM im
meinem Gert funktionierte. Anstelle von Interface zum Drucker, legte ich die neue
DEVICE=A:PFP.SYS mute ich die Zeile Version auf C: ab. Deswegen nderte ich
DEVICE=B:PFP.SYS an meine CONFIG.SYS auch die CONFIG.SYS erneut ab und ersetzte
hngen, damit der Drucker ansprechbar war. den DEVICE=B:PFP.SYS Befehl durch
Weil der Drucker keine Umlaute beherrscht, DEVICE=C:\PFP.SYS. Nachdem nun
sollten an deren Stelle die normalen notwendig gewordenem Reset, schlielich
Buchstaben erscheinen. Erste Testausdrucke mute der genderte Treiber aktiviert
brachten aber nicht a fr usw., sondern werden, konnte ich auch die alten Texte
unbekannte Grafikzeichen. Mit der Zeile wieder ausdrucken. Klar das Worte wie:
DEVICE=B:PFP/2 in der CONFIG.SYS, sollten durfen, loschen usw., beim Leser ein
die Umlaute durch die normalen Buchstaben Schmunzeln verursachen, aber sie sind
plus angehngtem e ersetzt werden. Flugs immerhin leichter verstndlich, als dieselben
nderte ich also die CONFIG.SYS Worte, die durch Grafikzeichen verunstaltet
entsprechend und fhrte einen Reset aus. werden.
Aber leider brachten die nchsten Tests Andererseits sind mir Behelfslsungen auch
wieder nur diese unbekannten Grafikzeichen. ein Dorn im Auge, weshalb ich gerade
Daher blieb mir nur ANSI.SYS, mit dem ich versuche die Firma Becker & Partner zu
die Umlauttasten neu belegte: Aus wurde einem Update zu bewegen.
ae, aus wurde Ae, usw. Weil ich diese Und hier noch ein paar technische Details
Befehlsfolgen nicht immer wieder eintippen zu diesem transportablen Drucker:
will, wenn ich den Printer anschliee, habe Es handelt sich dabei um einen
ich daraus die Batchdatei PRINTER.BAT Thermodrucker, der etwa fnf Zentimeter
generiert: breites Thermopapier, von der Rolle,
@set op=%prompt% verwendet. Auf dieser Breite bringt er
@prompt $e[;uep immerhin noch 24 Zeichen pro Zeile unter.
Seinen Energiebedarf zieht er unterwegs aus
@prompt $e[;Uep vier Mignonzellen und Zuhause per Netzteil
aus der Steckdose. Inkl. Batterien und dem

Lars Aschenbach - Batchprogrammierung - 06-03-04


Batch 33

etwa 8,- DM teurem Thermopapier (=5 Rollen cls


der Sorte SHARP EA-1250P) wiegt er ca. echo [;Uep
cls
800g. ber die Grafikfhigkeit kann ich noch
echo [;oep
nichts berichten, da in dem Kaufpreis von cls
45,- DM auch kein Handbuch inbegriffen war. echo [;Oep
Alles in allem bin ich trotz der Probleme und cls
des nicht gerade umwerfenden Schriftbildes, echo [;aep
sehr zufrieden mit dem Drucker. Kurznotizen, cls
echo [;Aep
Rechnungen, Einkaufszettel u.v.m. sind bei
cls
entsprechenden Vorarbeiten schnell gemacht. echo Umlaute abgeschaltet!

Umlaute an- oder abschalten! Und hier noch UMLT-J.BAT, die die Umlaute
Mit dem Erwerb des Thermodruckers SHARP etc. wieder herstellt:
CE 126P, der in einer speziellen Version fr
@echo off
den PoFo angeboten wurde, kamen Probleme cls
mit den Umlauten auf mich zu. echo [;p
Dieser kleine Drucker beherrscht sie ja leider cls
nicht und gibt statt dessen japanische echo [;p
Hieroglyphen aus. cls
echo [;p
Weil ich mir dieses Problem auch mit
cls
anderen Druckern vorstellen kann, habe ich echo [;p
mir zwei Batchdateien kreiert, mit denen ich cls
die Umlaute entsprechend durch echo [;p
AeOeUeaeoeue ersetze oder wieder auf cls
zurckstelle. echo [;p
cls
Will ich also einen Text mit o.g. Drucker
echo Umlaute wieder hergestellt!
ausdrucken, so rufe ich UMLT-N.BAT auf,
bevor ich mit dem schreiben des zu Wenn ihr diese Batchdateien abtippen wollt,
druckenden Textes beginne. Habe ich den so mt ihr die Zeichenfolge ^[ durch
Text dann fertig geschrieben und folgende Tastendrcke erzeugen: ALT+
ausgedruckt, so stelle ich die Umlaute wieder und danach ALT+. Erst nachdem ihr dann
mit UMLT-J.BAT her. die ALT-Taste loslat, erscheint die
Allerdings funktionieren diese beiden Zeichenfolge ^[ auf dem Bildschirm,
Batchdateien nur dann, wenn man den vorausgesetzt, Ihr gebt diese Zeilen in der
Bildschirmtreiber ANSI.SYS in der Textverarbeitung des PoFo ein!
CONFIG.SYS installiert hat. Besorgt euch Bereits bestehende Texte, die die Umlaute
dafr die Datei ANSI.SYS und kopiert sie in etc. enthalten, werden allerdings nicht
das Verzeichnis C:\SYSTEM. Anschlieend durch die o.g. Batchdateien verndert. Aber
mt Ihr noch folgende Zeile an eure unter der Zuhilfenahme von FAKE.COM
CONFIG.SYS hngen: knnte man auch eine nachtrgliche
DEVICE=C:\SYSTEM\ANSI.SYS Umstellung erreichen. Momentan sehe ich
dafr noch keine Veranlassung, weshalb ich
Zu guter letzt mu noch ein diese Aufgabe gerne zur Disposition stelle.
Warmstart(Reset) mit den Tasten Resmee: Wer einen Drucker benutzt, der
STRG+ALT+EINF/ENTF erzeugt werden, keine Umlaute darstellen kann, kann mit
damit die o.g. Batchdateien auch wirklich diesen Batchdateien besser lesbare Texte
tadellos funktionieren. ausdrucken!
Hier die Batchdatei UMLT-N.BAT, die die
Umlaute auf Ae etc. umstellt:
@echo off
cls
echo [;uep

Lars Aschenbach - Batchprogrammierung - 06-03-04


34 Batch

Variablen einchecken Befehl zu CHVA2.BAT kopiert wird. Es folgt


die Ergnzung um unseren Parameter BIOS
Bevor man einfach eine Variable mittels - plus nachgestelltem Prozentzeichen. Die
SET- Befehl anlegt, sollte man prfen, ob Passage -ECHO %1%- ist dafr zustndig.
diese Variable nicht bereits existiert. Im Mit der nchsten Zeile wird der
Direktmodus, d.h. wenn man das Prompt vor Rcksprungbefehl -CHKVAR OFF- dem
Augen hat, gengt die Eingabe -SET- zur Hilfsbatch CHVA2.BAT mitgeteilt.
Prfung. Doch wie will der automatisch Nach diesen Zeilen sollte CHVA2.BAT also
ablaufende Batchclan damit fertig werden? so aussehen:
Mit CHKVAR.BAT habe ich darum einen
ausbaufhigen Ansatz fr diese Problematik @echo off
geschaffen: set vt=%BIOS%
chkvar off
@echo off
rem CHKVAR - existiert die Variable ?
if %1.==. goto err
So komplettiert wird sie nun von
if %1==off goto %1 CHKVAR.BAT gestartet. Folglich wird die
set vt1=%1 Variable VT mit dem Inhalt von BIOS
copy c:\batch\chva2.dat c:\batch\*.b*>nul definiert. Weil wir uns auf die Definition 0815
echo %1%>>c:\batch\chva2.bat fr BIOS einigten, enthlt VT nun also 0815.
echo chkvar off>>c:\batch\chva2.bat CHVA2.BAT hat seine Schuldigkeit getan
chva2.bat
:off
und bergibt das Kommando wieder an
if not %vt%.==. echo Die Variable %vt1% existiert und CHKVAR.BAT zurck, indem es eben
ist genannte Batchdatei mit dem Parameter off
if not %vt%.==. echo mit %vt% definiert! startet.
if %vt%.==. echo Die Variable %vt1% existiert noch Weiter geht es also bei der Sprungmarke
nicht! (:OFF), die nun zu prfen hat, ob VT definiert
set vt=
set vt1=
wurde oder nicht. Ist VT nicht leer, so wird
del c:\batch\chva2.bat>nul vermeldet, das die gesuchte Variable existiert
goto exit und womit sie definiert wurde. Aus Grnden
:err der Kompatibilitt habe ich diese Meldung auf
echo Aufruf mit CHKVAR Variablenname! zwei Zeilen verteilt, damit sie auch auf dem
:exit 40-Zeichen Schirm des PoFo lesbar ist.
Beim gegenteiligen Falle, erhaltet Ihr die
Auch CHKVAR bentigt etwas Hilfe und
Rckmeldung, das die Variable nicht existiert.
bekommt dazu die CHVA2.DAT zur Seite
Ordentlich, wie alle meine Routinen sein
gestellt:
sollen, werden dann VT, VT1 und
@echo off CHVA2.BAT gelscht, bevor wir wieder in
set vt=% die Tasten greifen drfen.

Bei der Kreation von CHVA2.DAT wurde


nach dem Prozentzeichen nicht die Return-
Taste gedrckt!
Ausgetestet werden soll nun die Variable
BIOS, die Ihr bitte wie folgt mit -SET
BIOS=0815- im Direktmodus erzeugt. Sobald
Ihr das erledigt habt, rufen wir
CHKVAR.BAT mit -CHKVAR BIOS- auf. Da
wir einen Parameter bergeben haben und
dieser nicht off heit, werden weder die
Sprungmarke (:off) noch (:err) ausgefhrt.
Dagegen kommt die Zeile -SET VT1=%1- voll
zur Geltung und sichert die zu testende
Variable in VT1. Jetzt wird CHVA2.DAT
ausfhrbar gemacht, indem es mittels -COPY-

Lars Aschenbach - Batchprogrammierung - 06-03-04


Batch 35

KnowHow: Batching 20: echo abschlieend die Return-Taste!


21: type con>>antw.bat
Tastatureingaben in 22: echo cls>>antw.bat
23: echo echo Deine Eingabe lautete:
Batchdateien? %%antw%%>>antw.bat
Und es geht doch ohne Zusatzprogramme! 24: antw
Aber man mu erst einmal auf die scheinbar 25: :err
blde Idee kommen, die Befehle -TYPE- und - 26: echo Die Eingabeaufforderung fehlte!
CON- zu kombinieren. Gibt man also im
Direktmodus diese Kombination -TYPE CON- Zeilennummern nebst Doppelpunkt sind nicht
ein, so kann man solange etwas eingeben, abzutippen!
bis man die Return-Taste drckt. Das DOS Nun also die blichen Statements zum
wartet sogar bis zum Nimmerleinstag, wenn Ablauf:
man die Return-Taste nicht drckt. Sobald sie Da ich diese Eingaberoutine fr alle Arten der
aber gedrckt wurde, wird das gerade Fragen und Eingabeaufforderungen flexibel
eingegebene besttigend auf dem Bildschirm halten wollte, ist der entsprechende
angezeigt. Aufforderungstext als Parameter %1 zu
Will man aber die Eingabe in eine Datei bergeben. Weil Leerzeichen vom DOS als
umleiten, der Befehl dazu knnte -TYPE Trennung zwischen Parametern gewertet
CON>TEST.TXT- lauten, so werden die werden, mssen statt Leerzeichen die
gedrckten Tasten nur in "TEST.TXT" Unterstriche oder das ASCII-Zeichen mit der
umgeleitet und erscheinen daher nicht auf Nummer 255, eingesetzt werden.
dem Bildschirm. Sollte beim Aufruf von "INPUT.BAT" kein
Aber mit einem kleinen Trick, bei dem der Parameter bergeben worden sein, so wird
Bediener mitwirken mu, kann man auch die die Meldung "Eingabeaufforderung fehlte!"
Eingabe vorher sichtbar gestalten. ausgegeben und die Routine abgebrochen.
Folgende Batchdateien sind dafr bergibt man dagegen noch das kleine "w"
notwendig: als zweiten Parameter, so sieht man auch
gleich, was man da berhaupt eintippt.
ANTW.DAT - absichtlich DAT: Erfolgt keine bergabe eines zweiten
@echo off Parameters, so ist man gezwungen, die
set antw= Eingabe blind zu erledigen. Gehen wir der
ganzen Batchdatei mal auf den Grund:
Hinter -SET ANTW=- darf nicht die Nach dem abschalten der
Returntaste gedrckt worden sein!!! Die Zwischenkommentare des DOS, mittels -
zweite Batchdatei im Bunde ist "INPUT.BAT": @ECHO OFF-, wird "ANTW.DAT" zu
"ANTW.BAT" kopiert. Als nchstes wird
01: @echo off geprft, ob berhaupt ein Parameter beim
02: copy antw.dat *.b*>nul Aufruf mitangegeben wurde. Trifft dieses zu,
03: if %1.==. goto err
so wird auch der mgliche Zweitparameter
04: if %2==w goto watch
05: echo Bitte die Eingabe blind vornehmen mit dem Zeichen "w" abgeglichen. Auf Grund
06: echo und mit der Return-Taste beenden. dieses zweiten Testes wird dann
07: echo _ gegebenenfalls zur Sprungmarke (:WATCH)
08: echo _%1 verzweigt.
09: type con>>antw.bat Zum besseren Verstndnis gehen wir aber
10: echo cls>>antw.bat
nun davon aus, das kein "w" als zweiter
11: echo echo Deine Eingabe lautete:
%%antw%%>>antw.bat Parameter angegeben wurde:
12: antw Es folgen also die Zeilen, direkt nach der
13: :watch Parameterprfung und geben einige Hinweise
14: echo Bitte die Eingabe mit der Return- zur Eingabe. Man soll also die Eingabe blind
15: echo Taste beenden. vornehmen und anschlieend die Return-
16: echo _
Taste drcken. Nach diesem Hinweis wird
17: echo _%1
18: type con erst die eigentliche
19: echo Drcke nun bitte die Taste F3 und Frage/Eingabeaufforderung angegeben und

Lars Aschenbach - Batchprogrammierung - 06-03-04


36 Batch

zwar durch -ECHO %1-. Die Befehlszeile - letzte Eingabe zugewiesen bekommt, enthlt
TYPE CON>>ANTW.BAT- wartet dann auf die sie auch unsere Eingabe, wenn wir die
Eingabe und hngt diese, nach dem Return-Taste gedrckt haben. Um unsere
einmaligen drcken der Return-Taste, an Eingabe also in "ANTW.BAT" zu kommen,
"ANTW.BAT" an. Leider wird aber die Eingabe mu nun doch auf den Befehl -TYPE
zweimal hintereinander angehngt, weshalb CON>>ANTW.BAT- zurckgegriffen werden.
ich noch mit -ECHO CLS>>ANTW.BAT-, den Weil aber kein Bediener die groe Lust
Befehl zum Bildschirmlschen anhnge. Dies verspren drfte, seine Eingabe noch einmal
hat folgenden Sinn: Meistens wird die blind zu wiederholen und weil das
Eingabe keinem DOS-Befehl oder einem Eingegebene bereits der Taste <F3>
Programmnamen entsprechen, weshalb eine zugewiesen wurde, fordern wir also nun den
Fehlermeldung auftritt, sobald die Zeile von Bediener auf, genau diese Taste <F3> zu
"ANTW.BAT" abgearbeitet wird, die das drcken. Dadurch wird die letzte Eingabe
Duplikat der Eingabe enthlt. Durch das wiederholt und man mu abschlieend die
angehngte -CLS- wird die Fehlermeldung Return-Taste drcken, damit das Getippte
zwar nicht unterdrckt, aber sehr schnell wieder in "ANTW.BAT" landet.
weggeblendet, um keine Verwirrung zu Man mu also diese Unbequemlichkeit mit
stiften. <F3> & <Return> hinnehmen, wenn man
Nachdem das -CLS- also in "ANTW.BAT" seine Eingabe beim tippen beobachten will.
gelandet ist, wird noch die folgende Zeile an Aber ich denke, da man mit diesem kleinen
"ANTW.BAT" angehngt: -ECHO Deine Haken leben kann. Ansonsten gibt es zum
Eingabe lautete: %antw%-. Ihr merkt schon, diesem Thema ja auch gengend
heute werden mal wieder sehr viele gehngt! Zusatzprogramme.
Diese Zeile mu zwar nicht sein, aber ich Eine Bemerkung zum Schlu:
mchte gerne eine Besttigung meiner Ich habe zwar auch versucht die Eingabe
Eingabe bekommen. Wollen wir nicht alle sichtbar zu halten und auf die Tastendrcke
besttigt werden? Genug des Tumors, ber <F3> und <Return> zu verzichten, konnte
den man trotzdem lacht, jetzt folgt der Aufruf aber das Eingegebene nicht in einer Variablen
von "ANTW.BAT", durch die Zeile -antw-. einfangen, oder als Parameter definieren. Es
Konstruieren wir also nun eine beispielhafte ist zwar schade, aber nicht machbar, oder???
"ANTW.BAT", in der die Frage nach dem
Befinden mit "gut" beantwortet wurde:

@echo off
set antw=gut
gut
cls
echo Deine Eingabe lautete: %antw%

Nach ihrem Start definiert sie also den Inhalt


der Variablen mit dem Wort "gut". Das
Duplikat der Eingabe wird daraufhin als
Befehl/Programm auszufhren versucht, was
zu einer Fehlermeldung fhrt. Diese wird aber
schnell wieder per -CLS-Befehl gelscht. Zu
guter letzt bekommen wir dann unsere
Eingabe besttigt.
Um die Eingabe sichtbar zu machen, ich
setze jetzt bei der Sprungmarke (:WATCH)
ein, leiten wir diese vorerst nicht in eine Datei
um. Anstelle -TYPE CON>>ANTW.BAT-
verwenden wir daher den Befehl -TYPE CON-,
der die Eingabe sofort sichtbar darstellt. Weil
die Funktionstaste 3, kurz: <F3>, immer die

Lars Aschenbach - Batchprogrammierung - 06-03-04


Batch 37

Unbekannter Befehl in der machte. Schlielich hatte ich ja nur die Werte
von FILES und BUFFERS gendert, anstatt
CONFIG.SYS einen Befehl zu lschen. Ich startete die
Nur selten schreibe ich eine neue Textverarbeitung erneut und nderte nun den
CONFIG.SYS auf meinen PoFos, oder ndere Wert von FILES wieder auf sechs, speicherte
die bestehende ab. Doch neulich beim erneut ab und startete zum dritten mal den
Experimentieren, kam ich wieder in die PoFo. Jetzt bekam ich wieder die oben
Verlegenheit eine neue CONFIG.SYS zu genannte Fehlermeldung zu Gesicht und war
schreiben. Also schaute ich wieder einmal ins noch mehr verwundert als vorher. Sie, die
Handbuch meines PoFo und schrieb die dort Fehlermeldung, mute folglich durch den
abgedruckten Befehle zur CONFIG.SYS ab. Wert von FILES entstanden sein, obwohl sie
Weil mir die Werte fr die Befehle FILES und eigentlich eine andere Fehlerquelle angibt.
BUFFERS viel zu hoch erschienen, gab ich Schlielich ist ein falscher Wert nicht mit
folglich kleinere Werte an und speicherte die einem unbekannten Befehl einfach
neue CONFIG.SYS auf der Ramdisk C: ab. gleichzusetzen!
Nachdem ich auch alle anderen Aber tatschlich, nachdem ich den Wert von
Vorbereitungen abgeschlossen hatte, startete Files von mal zu mal um eins erhhte, bekam
ich also den PoFo mit dem Affengriff ich diese Fehlermeldung nicht mehr, als der
(STRG+ALT+EINF/ENTF) neu durch. Wert von FILES acht, oder mehr betrug!
Kurz darauf erhielt ich die Fehlermeldung Sollte diese Fehlermeldung einmal bei Euch
Unrecognized command in CONFIG.SYS, die auftauchen, so habt Ihr hoffentlich nun
ich bis dato noch nie gesehen hatte. Die gelernt, das der Wert von FILES nicht unter
deutsche bersetzung dieser Fehlermeldung acht sein darf, damit Ihr Euch nicht bei der
bedeutet Unbekannter Befehl in Fehlersuche im Kreis verlauft!!!
CONFIG.SYS, sofern mich mein Kontrolliert also bei dieser Fehlermeldung
Schulenglisch nicht im Stich lt. die Zeile mit FILES und setzt den Wert
Zwar ergab sich dann spter noch ein nicht mindestens auf acht, bevor Ihr nach anderen
nennenswerter Fehler, aber weil der auf Fehlerquellen sucht. Wie gesagt, die
meiner Vergelichkeit beruhte, konnte ich Fehlermeldung ist irritierend, da sie nicht den
Schussel den leicht beheben. Deshalb lud ich wirklichen Fehler beschreibt! Es kann
die CONFIG.SYS zunchst in die interne Text- natrlich auch einmal vorkommen, das Ihr
verarbeitung und kontrollierte die folgenden ein unerlaubtes Kommando in die
Zeilen, die ich ja vorher selbst geschrieben CONFIG.SYS schreibt, oder ein erlaubtes
hatte: falsch eintippt, aber das passiert in der Regel
viel seltener!
FILES=6
BUFFERS=10
DEVICE=C:\ANSI.SYS Die versteckte Datei des PoFo
So manchmal, wenn ich eine Memorycard
Obwohl der DEVICE-Befehl nicht im PoFo-
(MMC) oder die Ramdisk mit dem Befehl
Handbuch erwhnt ist, so ist er doch ein
CHKDSK prfe, wird auch von einer
erlaubter Befehl und war nicht die Ursache
versteckten Datei berichtet, die aber ohne
fr die Fehlermeldung. An den Befehlen
Inhalt ist. Weder mit dem PoFo, noch mit
FILES und BUFFERS kann es auch nicht
dem PC, konnte ich bislang diese ominse
gelegen haben und andere, unbekannte,
Datei sichtbar machen oder deren Namen
Befehle enthlt diese CONFIG.SYS ja nicht.
erfahren.
Weil ich mir den Fehler partout nicht erklren
Als ich neulich in der Buchhandlung
konnte, setzte ich nun die Werte fr FILES
mehrere neue DOS-Bcher nach Anregungen
und BUFFERS auf die vom PoFo-Handbuch
fr Batchdateien durchbltterte, stie ich auf
empfohlene Werte, bevor ich die genderte
die Herkunft dieser versteckten Datei:
CONFIG.SYS abspeicherte und einen
Wird beim formatieren oder nachtrglich
erneuten Reset ausfhrte.
mit dem Befehl LABEL ein Datentrger auf
Diesmal blieb ich von der Fehlermeldung
einen Namen getauft, so wird dieser als eine
verschont, was mich natrlich stutzig
Art Datei auf dem Datentrger abgelegt.

Lars Aschenbach - Batchprogrammierung - 06-03-04


38 Batch

Diese Datei ist allerdings ohne Inhalt und copy %1\*.* %2 > nul
kann nicht sichtbar gemacht werden. goto off
:err
Flugs zckte ich meinen PoFo und probierte
echo Ziellaufwerk oder -verzeichnis
dieses gleich aus, indem ich mit der bloen echo fehlt!
Eingabe von LABEL und zweimaligem drcken :off
der Return-Taste, gefolgt vom besttigen per
J, die Bezeichnung meiner Ramdisk lschte. Und so funktioniert das ganze:
Und siehe da, beim nchsten Report von Weil der zweite Parameter entweder ein
CHKDSK war keine versteckte Datei gemeldet Laufwerk oder ein Verzeichnis sein kann, mu
worden! Kaum hatte ich die Bezeichnung mit zunchst durch die IF-Zeilen geprft werden,
LABEL RAMDISK wiederhergestellt, tauchte ob ein Laufwerk als Ziel angegeben wurde.
die versteckte Datei wieder im Statusbericht Ist dies zutreffend, so wird die Routine LW
von CHKDSK auf. ausgefhrt. Anderenfalls handelt es sich um
Dieses Spielchen bleibt brigens nicht nur ein Verzeichnis, so da die Routine VZ
auf dem PoFo beschrnkt, sondern ist auch ausgefhrt wird.
unter vielen DOS-Versionen wiederholbar! Da beide fast nach demselben Prinzip
arbeiten, werde ich hier die Routine LW
Verzeichnis kopieren erlutern:
Auf dem Laufwerk, welches als Parameter 2
Auch das kopieren eines Verzeichnisses wird angegeben wurde, wird durch MD %2%1 >
nicht vom DOS vereinfacht, sondern verlangt NUL ein gleichnamiges Verzeichnis erstellt,
viel Handarbeit. Ich habe mir das wieder mit sofern es noch nicht existiert. Mit COPY
einer Batchdatei erleichtert, die ich Euch hier %1\*.* %2%1 > NUL werden dann alle
vorstellen will. Dateien aus dem Quellverzeichnis ins
Mit COPYDIR.BAT kann ich eine Kopie eines gleichnamige Verzeichnis des gewnschten
Verzeichnisses erstellen, die auf Wunsch in Laufwerkes kopiert.
einem anderen Laufwerk oder einem Bei der Routine VZ, und dies ist der
Verzeichnis, angefertigt wird. eigentliche Unterschied, wird der Parameter 2
Will ich z.B. das Verzeichnis C:\SYSTEM auf als Verzeichnis definiert und somit alle
das Laufwerk A: kopieren, so lautet die Dateien des Quellverzeichnisses ins neu
Syntax COPYDIR \SYSTEM A:. Soll das geschaffene Verzeichnis kopiert.
Verzeichnis C:\SYSTEM dagegen nur unter Sollte das zu kopierende Verzeichnis noch
dem Namen C:\DOS dupliziert werden, so weitere Verzeichnisse enthalten, so bleiben
gebe ich COPYDIR \SYSTEM \DOS ein. diese unbercksichtigt. Aber durch
Voraussetzung ist in beiden Fllen, das man entsprechende Eingaben und mehrfach
tatschlich gerade auf dem Laufwerk C: Aufrufe, sind auch diese kopierbar.
arbeitet, dieses also als aktiv angemeldet ist.
Notfalls mu man durch die Eingabe von C:
das Laufwerk aktivieren. Nun mach aber mal einen Punkt!
Hier die besagte Batchdatei COPYDIR.BAT: Ein Fehler im DOS des PoFo erlaubt die
Konstruktion einer Batchdatei namens .
@echo off .BAT. Dazu erstellt man die Batchdatei
if %2==a: goto lw
PUNKT.BAT und benennt sie mit dem Befehl
if %2==b: goto lw
if %2==c: goto lw -REN PUNKT.BAT .BAT- in . .BAT um.
if %2==A: goto lw Diese Batchdatei ist insofern interessant,
if %2==B: goto lw weil sie durch Dutzende von einzelnen ASCII-
if %2==C: goto lw Zeichen aufgerufen werden kann:
if %2.==. goto err
goto vz . , ; + [ ] / =, durch die ASCII-Zeichen 0-2, 4-7, 10-12, 14-
:lw 18, 20-26, 28-31 und alle ab 127 aufwrts
md %2%1 > nul
copy %1\*.* %2%1 > nul
In der Regel gibt man diese einzelnen
goto off Zeichen nicht als Aufruf ein, da meist keine
:vz Programme solchen Namens existieren. Aber
md %2 > nul wenn man diese Batchdatei mit entsprech-

Lars Aschenbach - Batchprogrammierung - 06-03-04


Batch 39

endem Inhalt fllt, kann sie z.B. Fehlermel- set z=


dungen abfangen, ohne das ein Automatik- if %1.==. set z=%oz%
if %z%.==. set z=%1
prozess unterbrochen wird:
if %2.==. goto %z%
@echo off if not %2.==. goto %z%
if exist %1 %1>nul rem Zahl verringern
hauptprg :40
set z=39
Existiert das als Parameter %1 bergebene goto 0
Programm nicht, oder ist nicht auffindbar, so :39
wird das beispielhafte Hauptprogramm set z=38
goto 0
HAUPTPRG.BAT gestartet. Ansonsten wird
das gewnschte Programm gestartet. Ein ......
anderes Einsatzgebiet ist das Ausspionieren
der Unterverzeichnisse innerhalb von :11
Unterverzeichnissen. Dazu schreibt man das set z=10
entsprechende Directory in eine Batchdatei, if %2.==. goto 0
cls
die anschlieend gestartet wird. Wenn die copy 10.txt con > nul
Zeile . <DIR> zur Ausfhrung kommt, ruft :10
sie damit die Batchdatei . .BAT auf, die set z=9
dann die restlichen bergebenen Parameter, if %2.==. goto 0
ebenfalls Directoryeintrge, auswerten cls
knnte. Zwar ist damit noch keine echte copy 9.txt con > nul
:9
Nachbildung des XCOPY-Befehls, als set z=8
Batchdatei erreicht, aber wieder ein Stck if %2.==. goto 0
nher gerckt! cls
copy 8.txt con > nul
Countdown - der Computer lernt :8
set z=7
zhlen if %2.==. goto 0
Zugegeben, ganz ohne Untersttzung ist cls
copy 7.txt con > nul
diese Eigenschaft nicht zu erreichen, aber :7
auch wir Menschen bedienen uns der set z=6
Mentoren. So habe ich eine Batchdatei if %2.==. goto 0
kreiert, mit deren Hilfe der Computer die cls
Zahlen von 40 bis 0 herunterzhlen kann. copy 6.txt con > nul
Was zunchst als bloe Spielerei aussieht, :6
set z=5
lt im nachhinein phantastische if %2.==. goto 0
Mglichkeiten bei der Batchprogrammierung cls
zu. Unter der Zuhilfenahme von copy 5.txt con > nul
COUNTDWN.BAT kann man nun andere :5
Batchprogramme so oft ausfhren lassen, wie set z=4
es COUNTDWN.BAT eben zult. if %2.==. goto 0
cls
Aber auch zur Zeitverzgerung ist diese copy 4.txt con > nul
Datei gut zu gebrauchen. Whrend des :4
optisch ansprechenden Countdowns, der bei set z=3
jeder Zahl zwischen 10 und 1 beginnen kann, if %2.==. goto 0
bleibt dem Betrachter entsprechend Zeit, um cls
copy 3.txt con > nul
seine Entscheidung zu fllen.
:3
Weil COUNTDWN.BAT recht umfangreich ist, set z=2
wollen wir uns hier nur einmal die wichtigsten if %2.==. goto 0
Partien zu Gemte fhren: cls
copy 2.txt con > nul
@echo off :2
rem Zahl definieren set z=1
set oz=%z%

Lars Aschenbach - Batchprogrammierung - 06-03-04


40 Batch

if %2.==. goto 0
cls
Viele Dateien - ein Datum
copy 1.txt con > nul Auch das Datum in den Directoryeintrgen
:1 kann ein Kriterium zur Unterscheidung sein.
set z=0 Deshalb mchte man desfteren das
if %2.==. goto 0
cls
Dateidatum auf einen gewissen Tag
copy 0.txt con > nul festlegen. Weil bisher bekannte Lsungen
:0 nicht auf dem PoFo funktionierten, habe ich
if %2.==. echo %z% eine Lsung mit DDA.BAT herbeigefhrt:

Die Variable z spielt in dieser Routine die @echo off


rem Datei-Datum aktualisieren
tragende Rolle und wird deshalb zu Beginn in if %3.==. goto err
der Variable oz gesichert. Sollte date %2
COUNTDWN.BAT ohne Parameter aufgerufen md c:\dda>nul
worden sein, so geht die Routine davon aus, for %%a in (%1) do type %%a>c:\dda\%%a
das der derzeitige Wert von z um eins for %%a in (%1) do del %%a
verringert werden soll und fhrt dieses auch for %%a in (c:\dda\*.*) do copy c:\dda\%%a>nul
for %%a in (c:\dda\*.*) do del c:\dda\%%a
aus. bergibt man aber beim Aufruf einen rd c:\dda
Wert, zwischen 40 und 1, als ersten date %3
Parameter, so wird der bergebene Wert um echo Das Datei-Datum wurde aktualisiert!
eins verringert und in der Variable z goto off
gespeichert. :err
Den echten Countdown lst man aus, indem echo Aufruf mit:
echo DDA Datei.Ext gew.Datum akt.Datum
man eine Zahl zwischen 11 und 1 als ersten :off
und ein x-beliebiges Zeichen als zweiten
Parameter bergibt. Durch die Eingabe von Nachdem das auserwhlte Datum eingestellt
COUNTDWN 8 m wird also ein Countdown wurde, wird die Datei, oder die Dateigruppe,
gestartet, der bei 7 beginnt und mit 0 endet. per -TYPE- in das temporre Verzeichnis DDA
Die angezeigten Ziffern, die ich als Grafiken kopiert. Weil beim kopieren, mittels -COPY-,
in der Textverarbeitung erzeugt habe, das Dateidatum beibehalten wird, weiche ich
werden dabei mit dem COPY-Befehl auf den auf den Befehl -TYPE- aus, der sich am
Schirm gebracht. aktuellen Datum orientiert. Nun wird die
Wie eingangs erwhnt, ist dieser ursprngliche Datei, oder Dateigruppe,
Countdown nur ein nettes Abfallprodukt, da gelscht. Als nchstes wird die aktualisierte
es hauptschlich darum geht, eigene Version zu ihrem Stammplatz transferiert und
Batchroutinen so oft zu wiederholen, wie man das temporre Verzeichnis DDA wieder
es sich gewnscht hat. Natrlich ist dazu ein entfernt. Kurz vor Schlu wird dann das
gewisses Ma an Programmierfertigkeit aktuelle Datum eingestellt und der Erfolg
vonnten, aber wer diese Routine einmal vermeldet.
begriffen hat, sollte damit keine
Schwierigkeiten haben. Dateinamen in Variablen
Die unten stehende Batchdatei legt alle
Dateinamen des Hauptverzeichnisses in
Variablen ab. Leider mu ich Eure Freude
empfindlich dmpfen, da die Dateinamen
Variable und Variableninhalt zugleich sind.
Alle Versuche, diese in ausgesuchte Variablen
zu packen, schlugen bisher fehl.
Eventuell kann man das aber doch noch mit
FAKE und ANSI in den Griff bekommen. Weil
ich mit beiden noch kaum gearbeitet habe
und mglichst alles mit Batchdateien
erreichen will, stelle ich diese Routine zur
Disposition:

Lars Aschenbach - Batchprogrammierung - 06-03-04


Batch 41

@echo off Verzeichnis lschen


for %%a in (\*.*) do set set %%a=%%a Auch diese Eingaben waren mir zu
Entgegen meiner Gewohnheit erklre ich hier umstndlich, weshalb ich dafr die Batchdatei
nichts dazu und fordere zum experimentieren DELDIR.BAT ersann, die ein Verzeichnis
auf!!! automatisch lscht:
Ich wollte ursprnglich damit den Befehl
XCOPY nachempfinden, doch bisher blieb ich @echo off
if %1.==. goto err
erfolglos. Wer wei weiter? for %%a in (%1\*.*) do del %1\%%a
rd %1
Aufrumarbeiten goto off
:err
Um so fter man seine Meisterwerke
echo Verzeichnis fehlt o. nicht
berarbeitet und ergnzt, ich meine die echo existend!
Dateien die dabei herauskommen, desto :off
mehr verteilen sie sich zerstckelt auf den
Datentrgern. DOS hat damit zwar keine Mal angenommen, das Verzeichnis SYSTEM
Probleme, weil es diese Fragmente im Laufwerk C: soll gelscht werden, dann
zusammensucht, braucht aber mehr Zeit geben wir dafr folgendes ein:
dafr.
Die Zeit ist ein wichtiger Faktor, wenn man DELDIR C:\SYSTEM
wie ich mit einem 4,9152 MHz getakteten
Zum Programmablauf:
PoFo arbeitet. Aus diesem Grunde ist
Ist kein Verzeichnis angegeben, so wird
DEFRAG.BAT entstanden, welches der
wieder darauf hingewiesen und die Routine
Zerstckelung Einhalt gebietet:
@echo off beendet. Beim gegenteiligen Fall werden
rem Verzeichnis defragmentieren zunchst alle Dateien im gewnschten
if %1.==. goto err Verzeichnis gelscht. Als nchstes wird dann
echo Bitte etwas Geduld ... das Verzeichnis selbst gelscht, sofern es
md \defrag>nul keine Unterverzeichnisse enthlt.
copy %1\*.* \defrag>nul
Logischerweise sollte man sich nicht gerade
for %%a in (%1\*.*) do del %1\%%a
rd %1>nul in dem zu lschenden Verzeichnis befinden,
md %1>nul da es sonst nicht gelscht wird.
copy \defrag\*.* %1>nul
for %%a in (\defrag\*.*) do del \defrag\%%a
rd \defrag>nul
Variablen tilgen
echo Defragmentierung abgeschlossen! Im Direktmodus gibt man -SET
goto off Variablenname= - ein, wenn man die
:err gewnschte Variable lschen mchte. Weil
echo Aufruf mit DEFRAG \Verzeichnis!
:off
ich recht tippfaul bin und alles automatisieren
will, habe ich mir die DV.BAT geschrieben,
Diese Routine legt das Verzeichnis DEFRAG mit der ich nun berflssige Variablen
an und kopiert zunchst alle Dateien des entferne:
gewnschten Verzeichnisses dort hinein.
@echo off
Dadurch finden die Dateifetzen wieder rem DV - Del Variable
zueinander und werden alsbald in ihr if %1.==. goto err
ursprngliches Verzeichnis rckverlegt. set =%1
Vorher wurde natrlich das Verzeichnis set %1=
komplett geleert, gelscht und neu kreiert. echo Die Variable %% wurde gelscht!
set =
Sobald das erledigt ist, wird das nun nicht
goto off
mehr bentigte Verzeichnis DEFRAG getilgt :err
und der gesamte Vorgang fr abgeschlossen echo Aufruf mit: DV Variablenname!
erklrt. :off

Lars Aschenbach - Batchprogrammierung - 06-03-04


42 Batch

Wird beim Aufruf von DV.BAT eine Variable erledigt ist, rufen wir DVV2.BAT auf, damit
als Parameter %1 mitbergeben, so wird wir wieder in unser Verzeichnis
diese durch die Zeile -SET %1= - gelscht. \TEXT\PRIVAT\FREUNDE gelangen:
Anschlieend erhlt man noch eine @echo off
Besttigung. Alle anderen Zeilen entsprechen cd \TEXT\PRIVAT\FREUNDE
nur einer gewissen Kosmetik und knnten dvv off
weggelassen werden, sofern man diese
Routine nicht auf dem PoFo einsetzt. Sobald wir also im ursprnglichen Verzeichnis
stehen, sorgt DVV.BAT fr die
Aufrumarbeiten und entlt uns dem
bergeordnetes Verzeichnis Prompt.
lschen
Es soll ja mit dem Befehl -DEL ..-
funktionieren, was ich selbst noch nicht
ausprobiert habe, aber meiner Erfahrung
nach geht es nicht auf dem PoFo!So schuf ich
mir die DVV.BAT, die dieses Manko
beseitigt:
@echo off
rem bergeordnetes Verzeichnis lschen
if %1==off goto %1
copy c:\batch\dvv2.dat c:\batch\*.b*>nul
cd>>c:\batch\dvv2.bat
echo dvv off>>c:\batch\dvv2.bat
cd ..
for %%a in (*.*) do del %%a
c:\batch\dvv2
:off
del c:\batch\dvv2.bat
echo Das bergeordnete Vezeichnis wurde
echo komplett gelscht!
Behilflich ist dabei auch DVV2.DAT:
@echo off
cd

Hinter dem Befehl -CD-, Ihr ahnt es vielleicht


schon, steht noch ein Leerzeichen ohne
krnendes Return.
Stellen wir uns vor, das wir gerade im
Verzeichnis \TEXT\PRIVAT\FREUNDE stehen
und das Verzeichnis \TEXT\PRIVAT komplett
lschen 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 aktuellen
Verzeichnis versehen. Um den Absprung nicht
zu verpassen, hngen wir noch die Zeile -
DVV off- an.
So versichert wechseln wir ins
bergeordnete Verzeichnis \TEXT\PRIVAT\
und lschen dort alle Dateien per -FOR-
Schleife. Nachdem der eigentliche Part

Lars Aschenbach - Batchprogrammierung - 06-03-04


Batch 43

Vermeidung von endlosen Generell ist man sich seiner Sache schon
sicher und gibt das J ein. Wozu dann also
Eingaben diese nervige Rckfrage?
Windows ist nicht nur wegen seiner Gute Programmierer unterbinden deshalb
hbschen, bunten Bildchen beliebt, sondern diese Rckfrage, indem sie das J in die Datei
weil man dort kaum die Tastatur bentigt. Als J.DAT schreiben und den Lschbefehl mit
DOS-Fanatiker und Maushasser braucht man folgender Syntax anwenden: DEL *.* <
aber auch nicht auf Bequemlichkeit J.DAT > NUL
verzichten, sofern man sich Zeit nimmt und Damit werden die Abfrage und die
gewisse berlegungen anstellt. entsprechenden DOS-Kommentare komplett
Ich habe mir bereits einige Gedanken dazu unterbunden. Ziel erreicht, so knnte man
gemacht und mchte Euch diese hier einmal jetzt meinen, bersieht aber die Hilfsdatei,
prsentieren! die ja, je nach Rechner und Datentrger, so
Angeregt wurde ich dazu von Jens Sewitz, zwischen 64 und 2048 Bytes verbraucht,
der mir bei einem Treffen seine Batchdateien auch wenn sie nur drei Bytes gro ist.
DP.BAT und DW.BAT prsentierte. Jens war Dieser Verschwendung kann man
es nmlich leid immer DIR /W oder DIR /P zu entgegenwirken, wenn man jede Datei
schreiben, weshalb er diese Befehle durch die einzelnd lscht: DEL BEISPIEL.PRG. Nebenbei
o.g. Batchdateien ersetzte, damit er in wird auch keine Sicherheitsabfrage
Zukunft z.B. mit DP das Inhaltsverzeichnis stattfinden, weil DOS es nicht fr ntig hlt.
seitenweise angezeigt bekommt. Er, wie ich Auf diese Weise eine ganze Reihe von
nun auch, mssen nun nur noch DP eingeben Dateien zu lschen, ist wahrlich sehr
anstelle des lngeren Befehls DIR /P. Zum umstndlich und kann nicht automatisiert
besseren Verstndnis hier einmal die werden.
Batchdatei DP.BAT: Verwendet man aber eine FOR-Schleife
@echo off dazu, so kann man alle gewnschten Dateien
dir /p in einem Verzeichnis lschen, ohne eine
Hilfsdatei zu benutzen und die Rckfrage von
Erstellt man hnliche Batchdateien fr die DOS vermeiden. Ich nenne die dazu
Befehle COPY, REN, DEL, MD, RD, CD, DATE, notwendige Batchdatei FASTDEL.BAT, die wie
TIME, VER usw., so kann man mit der Zeit folgt geschrieben werden mu:
sehr schreibfaul werden ohne das das DOS
nur noch Bahnhof-Bratkartoffeln versteht. Im @echo off
for %%a in (*.*) del %%a
Endeffekt tippt man letztendlich nur noch
unverstndliche Kurzbefehle ein, zumindest Die Liste (*.*) definiert %%a bei jedem
dem Zuschauer erscheint es so, aber das Durchlauf als eine andere Datei, aus der
DOS spielt da problemlos mit. Menge der vorhandenen Dateien (*.*) und
Oder wie wre es, wenn man alle Befehle in lscht explizit nur die in %%a gespeicherte
Batchdateien packt, die die Namen von Datei. Weil eben bei jedem Durchlauf, der
Verwandten trgen ??? Auch die Eingabe von automatisch vom DOS so oft wiederholt wird,
Theo liebt Gaby, mit der die Datei LIEBT. wie noch Dateien vorhanden sind, nur eine
in GABY. umbenannt wird (REN-Befehl Datei gelscht wird, entfllt die Rckfrage.
steht in THEO.BAT), wrde bei jedem Somit ist auch keine Hilfsdatei J.DAT mehr
zuschauenden DOS-User Verwirrung stiften!!! notwendig, was wiederum Speicherplatz
spart.
FASTDEL.BAT - lschen ohne Aufgerufen wird FASTDEL.BAT nur durch die
Rckfrage Eingabe von FASTDEL, wenn man sich in dem
Verzeichnis befindet, in welchem die Dateien
Will man alle Dateien in einem Verzeichnis gelscht werden sollen.
lschen, mit DEL *.*, so fragt DOS zur
Sicherheit noch einmal nach: Sind Sie sicher
(J/N)?

Lars Aschenbach - Batchprogrammierung - 06-03-04


44 Batch

FASTPRNT.BAT - Das Dateieintrge im Directory aus dem, bis


zu achtstelligen, Dateinamen und der, bis zur
Massendrucksache dreistelligen, Extension bestehen, sollte
Auch das Ausdrucken von Texten ist recht mittlerweile hinlnglich bekannt sein.
lstig, wenn man mehrere Artikel auf Fehler Directoryeintrge bestehen zwar meist nur
kontrollieren mu. Ist der Drucker aber mit aus dem, bis zu achtstelligen,
Endlospapier bestckt, oder verfgt ber Directorynamen, knnen aber ebenso mit
einen automatischen Einzelblatteinzug, so einer, bis zur dreistelligen, Extension
kann man die Arbeit sehr gut automatisieren versehen werden. So wird z.B. mit MD
und die Wartezeit fr andere Aufgaben 12345678.ABC tatschlich ein gltiges
nutzen. Verzeichnis erzeugt.
Bis hierhin war ja noch alles human, aber
@echo off
was haltet Ihr von den Verzeichnissen:
if %1.==. goto err
echo > prn Datentrger in c ist ramdisk
echo Es folgen die Dateien: > prn Inhaltsverzeichnis von c:\
echo > prn
for %%a in (%1) do echo %%a > prn system <DIR>
echo > prn 1-01-80 9:53a
for %%a in (%1) do copy %%a prn > ++ <DIR> 1-01-80 9:55a
nul hallo! <DIR>
echo > prn 1-01-80 9:57a
goto off ++ <DIR> 1-01-80 9:58a
<DIR> 1-01-80 9:59a
:err
<DIR>
echo Zu druckende Dateigruppe fehlt! 1-01-80 10:02a
:off 6 Dateien 44032 Bytes frei

Gestartet wird diese Batchdatei mit z.B. berrascht von diesen einfachen Beispielen?
FASTPRNT *.TXT. Sollte die Dateigruppe Mit mehr Phantasie kann man glatt Portraits
fehlen, sie wird ja wieder als Parameter %1 oder kleine Zeichnungen herstellen!
bergeben, erhlt man eine Rckmeldung. Das ganze Geheimnis beruht auf den
Ansonsten wird zunchst mit ECHO > PRN Grafikzeichen des Zeichensatzes, die man mit
eine Leerzeile auf dem Drucker erzeugt. der <Alt>-Taste erzeugt. So ist der
Hinter dem ECHO stehen aber keine zwei Directoryeintrag Kastenoberteil durch
Leerzeichen, sondern ein Leerzeichen und der folgende Tastaturakrobatik, auf dem
Charakter 255. Portfolio, entstanden:
Wrde ich letzteren weglassen, den ich mit
der ALT-Taste erzeugte, so wrde statt einer <M>, <D>, <Leer>, <Fn>+<N>,
<Alt>+<K>+<M>+<J>, <Alt>+<K>+<M>+<I> (noch
Leerzeile der Text ECHO ist off gedruckt. Die fnf mal wiederholen), <Alt>+<J>+<8>+<7>,
erste FOR-Schleife druckt dann alle <Fn>+<N>, <+
gefundenen Dateinamen aus, bevor die
zweite Schleife die eigentlichen Dateien Zum Verstndnis: Jeder Text in spitzen
ausdruckt. Klammern soll eine Taste sein. Ein plus
Den Dateinamen vor dem Dateiinhalt bedeutet, da die erste Taste festgehalten
auszudrucken wre auch mir lieber gewesen, werden mu und die anderen bei gehaltener
aber ich habe dies bisher noch nicht weiter Taste gedrckt werden sollen. Die Kommatas
versucht. Gewhnt man es sich an, am Ende weisen nur darauf hin, das jetzt eine neue
eines jeden Textes eine Leerzeile zu Sequenz kommt und <+ steht fr die Enter-
erzeugen, so ist auch eine saubere Trennung Taste.
zwischen den gedruckten Texten zu sehen. Gro-PC-Besitzer schalten bitte NumLock
ein und tippen die Zahlenwerte ber
Fiese Verzeichnisse denZehnerblock ein:
... bieten zwar auch keinen absoluten Schutz, <M>, <D>, <Leer>,
verwehren aber unerfahrenen Bedienern die <Alt>+<2>+<0>+<1>,
Einsicht.

Lars Aschenbach - Batchprogrammierung - 06-03-04


Batch 45

<Alt>+<2>+<0>+<5> (noch fnf mal CTRL.BAT - Steuerzeichen in


wiederholen), <Alt>+<1>+<8>+<7>, <+
Variablen
Minimal sind also in diesem Beispiel 36 Als Steuerzeichen werden die Charakter von
Tasten zu drcken, bevor man in dieses Null bis Einunddreiig bezeichnet, die man im
Verzeichnis gelangt. Weil das selbst fr DOS- Zeichensatz wiederfindet. Mit ihnen wird z.B.
Puristen abschreckend wirkt, sind solche der Bildschirm gelscht, ein Signalton
kunstvollen Verzeichnisse ein guter Platz, fr ausgegeben, eine Datei geschlossen,
mglichst wichtige Dateien. Mit dem ATTRIB- Textausgaben kurzfristig angehalten und
Befehl kann man dann die Dateien ja auch noch vieles mehr. Auch Ihr habt sicherlich
noch unsichtbar machen. Damit aber fr uns schon mit ihnen Bekanntschaft geschlossen,
die Verzeichniswechsel nicht zur Tortur sei es nur die STRG+C-Funktion, mit der Ihr
werden, sollten solche Verzeichnisnamen in eine Programmausfhrung vorzeitig beendet
Variablen eingespeichert werden: SET habt.
VZ1=++. Ich habe diese Steuerzeichen, soweit als
Per CD %VZ1% kann man nun mglich, mit einer Programmiersprache
problemlos in solche Verzeichnisse gelangen. eingefangen und zu einer Batchdatei
Allerdings funktioniert der eben genannte verarbeitet:
Befehl nicht im Direktmodus, sondern mu
per Batchdatei ausgefhrt werden! @echo off
rem Steuerzeichen in Variablen
set c1=^A
set c2=^B
....
set c30=^^
set c31=^_

Welchen Sinn das ganze haben kann, will ich


natrlich nicht verschweigen:

1. Batchdateien generierende Batchdateien,


die z.B. Warntne ausgeben:
ECHO %c7%

2. Ausfhrbare Maschinenspacheprogramme
unter DOS schreiben:
ECHO %c4%1%c27%L8% > TEST.COM

Whrend die erste Idee noch fr jeden


Batchprogrammierer verstndlich werden
kann, so ist doch die zweite eher fr die
Assemblerfreaks einleuchtend. So werden mit
dem ECHO-Befehl die gewnschten Opcodes
in ein ausfhrbares MC-Programm namens
TEST.COM geschrieben. Das ich selbst kein
Assmblerfreak bin, drfte auch an den obigen
Opcodes erkennbar sein. Dennoch kann man
damit schnell kleine COM-Programme
schreiben, wenn man z.B. auf den Opcode 26
verzichten kann. Diesen konnte ich beim
besten Willen nicht zufassen bekommen!

Lars Aschenbach - Batchprogrammierung - 06-03-04


46 Batch

Verzeichnis verschieben Multiprocessing mit dem PoFo


Manchmal mchte man ein Verzeichnis auf Nicht schlecht gestaunt habe ich neulich, als
ein anderes Laufwerk auslagern, damit man ich wieder mit GW-BASIC arbeitete und die
wieder etwas Platz fr andere Daten hat. Weil interne Textverarbeitung des PoFos aufrufen
mir die dafr notwendigen fnf Eingaben zu konnte!
umstndlich sind, habe ich sie in der Das laufende Programm wurde zwar
Batchdatei MOVEDIR.BAT zusammengefat: angehalten, solange ich im Texteditor meinen
Text schrieb, ist aber nach dem Rcksprung
@echo off ins GW-BASIC weiter abgearbeitet worden.
if %2.==. goto err
Allerdings funktioniert der Wechsel nur dann,
md %2%1 > nul
copy %1\*.* %2%1 > nul wenn das laufende Basicprogramm einen
for %%a in (%1\*.*) do del %1\%%a Tastendruck erkennt und zult. Weil es sich
rd %1 bei der Atari- Taste um einen Hotkey handelt,
goto off mu das Basicprogramm nicht einmal
:err entsprechend programmiert werden, damit
echo Ziellaufwerk fehlt!
man in eine der fnf integrierten
:off
Applikationen gelangt.
Von meinem Ramspeicher mit 384 KB,
Will ich z.B. das Verzeichnis SYSTEM vom
konnte ich maximal 208 KB fr die Ramdisk
Laufwerk C: auf das Laufwerk A:
reservieren, damit dieses Multiprocessing
verschieben, so mu ich jetzt nur noch
funktioniert. Leider funktionierte es nicht auf
folgendes eingeben:
einem 128 KB PoFo, was aber sicherlich an
MOVEDIR C:\SYSTEM A: der Gre vom GW-BASIC liegt (80 KB). Da
bleibt eben nicht gengend Speicher frei, um
Zum Programmablauf: die Textverarbeitung aufzurufen.
Ist der zweite Parameter, der beim Aufruf Bei geschickter Programmierung kann man
das Ziellaufwerk enthalten sollte, leer, so also, dank des Multiprocessings, Texte unter
wird man entsprechend darauf hingewiesen. GW-BASIC modifizieren, bevor man diese
Ansonsten wird auf dem Ziellaufwerk das dann andersweitig einsetzt. Es mu aber
Verzeichnis erzeugt, welches mit dem Para- nicht nur bei GW-BASIC bleiben, sondern
meter 1 angegeben wurde. Die nchste Zeile kann eventuell auch mit anderen
kopiert dann alle Dateien aus dem Programmen funktionieren.
Verzeichnis in das gleichnamige Verzeichnis
des Ziellaufwerkes. Anschlieend werden die
Daten im Quellverzeichnis gelscht, bevor es
Kurzfristige Pfadnderung
dann selbst gelscht wird. Damit ist die Die mit PATH gesetzte Pfadangabe ist der
Verschiebung komplett und erledigt. Wegweiser fr den Computer, damit er die
Sollten sich aber noch Unterverzeichnisse gewnschten Programme findet und startet.
im zu verschiebenden Verzeichnis befinden, Sobald ein neues Programm installiert werden
so werden diese nicht mit verschoben und soll, kann es notwendig sein, die Pfadangabe
das Verzeichnis wird nicht gelscht. Diese kurzfristig zu verlngern. Die folgende
Routine funktioniert nur dann fehlerfrei, wenn Batchdatei soll uns dabei behilflich sein:
man sich nicht im zu verschiebenden
@echo off
Verzeichnis befindet! path
set opath=%path%
set path=%path%;C:\NEU
rem Hier fgen Sie Ihre Routinen
rem ein!
path
set path=%opath%
set opath=
path

Lars Aschenbach - Batchprogrammierung - 06-03-04


Batch 47

Die drei path-Zeilen dienen uns dabei nur als Ein zweiter Test, diesmal mit
Kontrolle und sollten spter gelscht werden. RAMDRIVE.SYS aus MS-DOS 6.22, ergab eine
Schauen wir uns aber die anderen Zeilen an, maximale Gre der ersten Ramdisk mit
die das ganze Geheimnis bargen: 24KB. Haben Eure PoFos aber mehr Speicher
Weil die Pfadangabe spter wieder in den als 128KB, so knnt Ihr den Wert 64, in
Ursprungszustand zurckversetzt werden obiger Zeile, auch gerne Schritt fr Schritt
soll, mu sie mit SET OPATH=%PATH% in um 64 erhhen: 128,192,256,...
die Variable OPATH gerettet werden. Nun Die Verwendung der zweiten Ramdisk ist
wird die Pfadangabe mit SET aber nicht ganz risikolos: Sobald der PoFo
PATH=%path%;C:\NEU um das Verzeichnis neugestartet wird, egal ob Warm- oder
C:\NEU verlngert. Anstelle der REM-Zeilen Kaltstart, geht die zweite Ramdisk und mit
fgen Sie also Ihre gewnschten Routinen Ihr alle Daten, verloren. Die Ramdisk C:
ein. Sind diese abgearbeitet, wird die alte verliert Ihre Daten zumindest bei einem
Pfadangabe durch SET PATH=%OPATH% Warmstart (STRG+ALT+EINF/ENTF) nicht!
wiederhergestellt. Ist auch dies erledigt, so Die Gre der Ramdisk C: verndert man ja
kann die Variable OPATH gelscht werden, bekanntlich mit dem Befehl FDISK: FDISK 32
was durch SET OPATH= geschieht. und FDISK 24 sind fr diese Tests die
Soll die Pfadangabe dauerhaft verlngert richtigen und vollstndigen Befehle. Dringend
werden, so mu die Zeile SET dabei zu beachten ist aber, da man alle
PATH=%PATH%;C:\ durch die folgende Daten und Programme auf C: verliert, wenn
Batchdatei an die AUTOEXEC.BAT gehngt man den FDISK Befehl startet!
werden:
Wozu soll eine zweite Ramdisk gut sein?
@echo off
echo set path=%path%;c:\neu >> autoexec.bat Man kann z.B. die Dateiprobleme des PoFo
auch dann in den Griff bekommen, wenn man
Damit htten wir also auch wieder ein keine Speicherkarte besitzt. Oder man legt
Problem weniger, obwohl dieses noch von die Daten auf D: ab, die nur sehr kurzfristig
sehr leichter Natur war - zumindest fr mich. bentigt werden und deren Verlust man leicht
verkraften kann. Auch eine bessere und
Eine zweite Ramdisk namens D: geordneter Dateiablage kann man mit der
Voller berraschung stellte ich neulich fest, Verwendung der zweiten Ramdisk erreichen.
das der Blockgertetreiber RAMDRIVE.SYS Diese Erfahrungen beruhen auf PoFos mit
aus diversen MS-DOS Versionen, auch auf den Bios Versionen 1.072 und 1.130.
dem PoFo funktioniert.
Mit diesem Treiber kann man nun also eine
zweite Ramdisk auf dem PoFo einrichten, die
dann den Namen D: erhlt. Dazu mu die
folgende Zeile in die Datei CONFIG.SYS
aufgenommen werden:
DEVICE=RAMDRIVE.SYS 64

Nach dem ich dann den PoFo mit


STRG+ALT+EINF/ENTF neustartete, wurde
eine zweite Ramdisk mit 64KB Gre
eingerichtet. Auf diese konnte ich genauso
zurckgreifen, wie auf die erste Ramdisk C:.
Dabei habe ich auch festgestellt, das diese
zweite Ramdisk nur dann auf einem PoFo mit
128KB Speicher funktioniert, wenn die erste
Ramdisk nicht grer als 32KB ist und man
RAMDRIVE.SYS aus der MS-DOS Version 3.30
verwendet.

Lars Aschenbach - Batchprogrammierung - 06-03-04


48 Batch

Rekursive Batchdateien Batchdatei enthlt, welche gerade


abgearbeitet wird (hier: MB). Am Ende
... sind besonders interessant, weil man definiert sie REK=1 und bergibt die Kontrolle
durch sie groe Aktionen mit kleinem wieder an die MB.BAT, indem sie die MB.BAT
Aufwand erreichen kann. Gerade fr durch den Parameter %1 aufruft, welcher ja
tagtglich wiederkehrende Aufgaben, haben hier den Inhalt MB aufweist. MB.BAT prft
wir entsprechend groe Routinen parat, wieder die REK-Variable und stellt fest, das
deren Inhalte sich oftmals gleichen. Diese sie mit 1 definiert ist. Daher berspringt
Speicherplatzverschwendung kann leicht MB.BAT die nchsten Zeilen und fhrt bei der
verhindert werden, wenn man die Kernrou- Routine :zwei fort. Kurz darauf wechselt nun
tinen isoliert, in eigenen Batchdateien, und die Kontrolle zu SB2.BAT, welches im
fr Rcksprnge sorgt. spteren Verlauf REK auf den Wert 2 setzt,
Dafr werden in den Batchdateien, die bevor es die Kontrolle wieder an MB.BAT
jeweils eine Kenroutine enthalten, ich nenne zurckgibt. MB.BAT prft REK erneut ab und
sie mal Slave-Batchdateien, Variablen springt zur Routine :drei, in deren Verlauf es
gesetzt, die von der groen Batchdatei, die REK wieder lscht und seine Ttigkeit
ich Master-Batchdatei nennen mchte, beendet.
berprft werden. Durch die Parameter %0 Wrde REK nicht gelscht, so wrde bei
und %1 werden die rekursiven Aufrufe spteren Aufrufen eine falsche Reihenfolge
gettigt. eingehalten werden, durch die evtl. Dateien
Hier die beispielhaften Batchdateien: irreparabel beschdigt oder vernichtet
werden. Durch die Parameterbergabe, beim
MB.BAT: Aufruf der Slave-Batchdateien, werden diese
@echo off
if %rek%==1 goto zwei so dressiert, das sie sich jeder Master-
if %rek%==2 goto drei Batchdatei unterordnen und immer zur
echo Masterbatch zum ersten . richtigen zurckfinden.
sb1 %0 Mit dieser Technik kann man z.B. gezielte
:zwei Datensicherungen, Dateimanipulationen oder
echo Masterbatch zum zweiten ..
Datenauswertung betreiben!
sb2 %0
:drei
echo Masterbatch zum letzten mal!
set rek=

SB1.BAT:
@echo off
echo Slavebatch eins
set rek=1
%1

SB2.BAT:
@echo off
echo Slavebatch zwei
set rek=2
%1

Und so funktioniert das ganze:


Die Master-Batchdatei, im folgenden nur
noch MB.BAT genannt, prft bei jedem Aufruf
zunchst den Inhalt von REK. Weil REK beim
ersten mal nicht definiert ist, werden einige
Befehlszeilen abgearbeitet. Irgendwann
kommt dann der Aufruf der Slave-Batchdatei
Nr.1, kurz: SB1.BAT, die nun die Kontrolle
bernimmt. Sie wird mit dem Parameter %0
aufgerufen, der immer den Namen der

Lars Aschenbach - Batchprogrammierung - 06-03-04


Batch 49

Verzeichnis umbenennen Variablen umbenennen & kopieren


Fr die Umbenennung von Dateien existiert Ob man diese Routinen tatschlich bentigt,
ja der RENAME-Befehl, aber fr die sei einmal dahingestellt. Immerhin kann man
Verzeichnisse? Ja, da versagt das DOS ganz damit seine Variablen vor berschreiben
klglich. Trotzdem braucht man aber nicht schtzen, wenn einem bewut ist, das eine
darauf verzichten, sondern mu einen kleinen andere Routine dieselbe Variable bentigt.
Umweg gehen. Schauen wir uns RV.BAT doch einmal an:
Man kreiert einfach ein Verzeichnis mit dem
gewnschten Namen, kopiert alle Dateien ins @echo off
rem RV - Rename Variable
neue Verzeichnis und lscht zuletzt das alte if %1==off goto %1
Verzeichnis inkl. der Dateien. Kurzweilig if %2.==. goto err
existiert also eine Doublette des copy c:\batch\rv2.dat c:\batch\*.b*>nul
Verzeichnisses, die auch dementsprechend echo %1%%>>c:\batch\rv2.bat
Platz bentigt. Daran mu natrlich gedacht echo set %1=>>c:\batch\rv2.bat
werden, bevor man also diese echo echo Variable %1 in %2
umbenannt!>>c:\batch\rv2.bat
automatisierende Routine, namens echo rv off>>c:\batch\rv2.bat
RENDIR.BAT, einsetzt: rv2 %2
:err
@echo off echo Aufruf mit:
if %2.==. goto err echo RV alter Variablenname neuer Variablenname
md %2 > nul :off
copy %1\*.* %2\ > nul del c:\batch\rv2.bat>nul
for %%a in (%1\*.*) do del %1\%%a
rd %1 Bentigt wird auerdem noch RV2.DAT:
goto off @echo off
:err set %1=%
echo Neuer Verzeichnisname fehlt!
:off Und so soll das ganze funktionieren:
Weil RV.BAT spter von RV2.BAT
Aufgerufen wird sie z.B. mit: RENDIR rekursiv aufgerufen wird, mit dem Wort off
C:\SYSTEM C:\DOS, wenn das Verzeichnis als ersten Parameter, darf zum einen keine
SYSTEM in DOS umbenannt werden soll. Aber Variable off umbenannt werden, und zum
auch hier darf man sich nicht in dem anderen sollte diese Zeile beim ersten Aufruf
Verzeichnis befinden, welches umbenannt bergangen werden. Ist die korrekte Syntax
werden soll. Befinden sich noch weitere beim Aufruf eingehalten worden, so wird
Unterverzeichnisse in dem umzubenennenden RV2.DAT zu RV2.BAT kopiert. Nun wird
Verzeichnis, so wird es nicht gelscht! der Name der alten Variable an RV2.BAT
gehngt, wodurch die Zeile -SET %1=%- um
diesen Variablenamen und das Prozentzei-
chen vervollstndigt wird. Weil die alte
Variable ja auch gelscht werden soll,
gelangt als nchstes die Zeile -SET %1=- per
-ECHO-Befehl in RV2.BAT. %1 wird aber
dabei schon durch den alten Variablennamen
ersetzt! Jetzt wird die Rckmeldung fr den
Betrachter in RV2.BAT transferiert, wie
auch der Rekursivaufruf von RV.BAT, der da
lautet -RV off-.
Erfolgte also der Start durch RV test new,
so sieht die RV2.BAT wie folgt aus:

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

Lars Aschenbach - Batchprogrammierung - 06-03-04


50 Batch

Die Vorkehrungen sind damit abgeschlossen, @echo off


so da der Aufruf mit -RV2 new- erfolgt. Mit if %1.==. goto prf
set sw=%1
dem ersten -SET- Befehl wird die neue
:prf
Variable new mit dem Inhalt von test if %sw%==off goto off
definiert. Der zweite -SET- Befehl lscht nun if %sw%==OFF goto off
die Variable test, damit diese fr andere cls
Zwecke verwendet werden kann. Im echo + (T)exteditor (S)ystem (.)....... +
nchsten Moment erhaltet Ihr die Besttigung echo (A)dressverw. (P)basic (.).......
echo (Z)eitplaner (D)f (C)hdir
fr den korrekten Verlauf, bevor RV.BAT
echo (K)alkulation (F)ilem. (H)ilfe
erneut durch -RV off- aufgerufen wird. echo (R)echner (U)tils (O)ff
Weil jetzt der erste Parameter off lautet, echo + Anfangsbuchstabe + RETURN +
trifft die erste -IF- Zeile zu und bedingt den :off
sprung zu (:off). Diese Sprungmarke lscht
RV2.BAT und beendet die ganze Routine. Zuerst wird geprft, ob eventuell ein
Die CV.BAT, die dieselbe Technik Parameter beim Aufruf der Batchdatei
verwendet, um eine Variable zu kopieren, mitgegeben wurde. Ist dies nicht der Fall,
unterscheidet sich nur in zwei Zeilen von wird durch die Routine :prf abgecheckt, ob
RV.BAT. Ich gehe daher nicht weiter auf die Variable SW als OFF oder off definiert ist.
CV.BAT und CV2.DAT ein. Wenn auch dieser Check negativ ausfllt, so
soll das Menbild sichtbar sein und wird
Schalt-Technik deswegen auch aufgebaut. Enthlt der o.g.
Parameter die Definition OFF oder off, so wird
Einige Batchdateien werfen geradezu mit kein Menbild gezeigt. Jede andere
Bildschirmtexten um sich, die keinen Parameterbergabe wird als ON interpretiert
Benutzer mehr interessieren, weil er sie und blendet die Maske wieder ein. Der
bereits auswendig kennt. Gerade die als die jeweilige Schaltzustand bleibt solange
Nonplusultra gepriesenen Mensysteme, bestehen, bis durch ein neuer Aufruf, inkl.
kennen keinen Pardon! Parameter, eine Umschaltung erfolgt.
Wie schn wre es doch, wenn man solche
Schirmmasken einfach abschalten knnte.,
hre ich Euch seufzen. Die Rettung naht Ur-Startlaufwerk ermitteln!
bereits, zumindest wenn diese Menschirme Neulich bekam ich ein PD-Programm, welches
durch Batchdateien kreiert werden. sich nur halb installierte und dann startete.
Handelt es sich bei dem Menschirm nur Das Programm suchte dann auch bald seine
um eine Textdatei, die per Batchdatei auf den Dateien im Laufwerk C:, weil es ja von dort
Schirm kopiert wird, so kann die Befehlszeile gestartet wurde. Leider schlummerten aber
COPY MEN.TXT CON einfach aus der die fehlenden Dateien noch im Laufwerk A:,
Batchdatei gelscht werden. Wird die Maske von dem ich bestimmungsgem die
durch mehrere ECHO-Befehle generiert, so Installationsroutine gestartet hatte.
knnen auch diese gelscht werden. Irgendwann sah auch das Programm es ein,
Was werden aber Eure Bekannten sagen, das hier etwas nicht stimmen konnte und
wenn Ihr ihnen das Mensystem kopiert? Ich berliess mich dem Prompt! Gottlob konnte
komm damit nicht klar, weil nirgendwo zu ich die Installationsroutine, die aus einer
sehen ist, was ich einzugeben habe! Hilf mir AUTOEXEC.BAT inkl. CONFIG.SYS-Erwei-
doch mal weiter. terung bestand, reparieren. Diese Routine
Die goldene Lsung ist also eine fand einfach nicht mehr zu dem Laufwerk
Bildschirmmaske, die bei Bedarf an- oder zurck, von dem sie gestartet wurde!!!
abgeschaltet werden kann. Aber berlassen wir den Programmierer
Und wer ist flexibler als unsere Helfer, die seiner Schande und versuchen selbst das Ur-
Parameter? Natrlich die Variablen! Aber Startlaufwerk festzustellen und hnlich
diesmal teilen sich beide die Arbeit und doofen Routinen an die Hand zu geben.
schalten mit der folgenden Batchdatei, die Beim Start der AUTOEXEC.BAT meines
integrierte Bildschirmmaske ON oder OFF: Portfolios, wird automatisch der Parameter

Lars Aschenbach - Batchprogrammierung - 06-03-04


Batch 51

%0 mit dem folgenden Inhalt gefttert: Nun ist der PoFo auch sonst ein sehr
A:\AUTOEXEC. Vorausgesetzt, die eigenwilliger Compi, weshalb der Inhalt des
AUTOEXEC.BAT befindet sich im A:-Laufwerk Parameters %0, nmlich A:\AUTOEXEC,
- und das setze ich hier einmal voraus! nicht dem Inhalt desgleichen Parameters, auf
Festhalten wollen wir also nur die groen PCs, gleichen mu!!!
Zeichenfolge A: und das mglichst zur Mit der folgenden AUTOEXEC.BAT kann man
weiteren Nutzung in einer Variablen. Alle aber den Inhalt von %0 berprfen:
Versuche, das berflssige Wort AUTOEXEC
abzuschneiden, waren zum Scheitern @echo off
echo %0 %1 %2 %3
verurteilt. Weil aber der Inhalt des
Parameters %0 bekannt ist, konnte ich Sollte also das Ergebnis anders ausfallen, so
diesen mit allen Variationsmglichkeiten ist die obige Batchdatei entsprechend
vergleichen und bei passendem Vergleich, die abzundern.
Variable LW, die ich zur Aufnahme
auserkoren hatte, dementsprechend selbst
mit dem Laufwerksnamen definieren! Die Eine unlschbare Variable simu-
folgende AUTOEXEC.BAT erledigt das nun fr
mich:
lieren!
Das geht nur direkt am DOS-Prompt indem
@echo off man eingibt:
set lw=%0
if %lw%==A:\AUTOEXEC goto a SET VAR=^Z
if %lw%==B:\AUTOEXEC goto b Wobei ^Z fr die Tastenkombination STRG+Z
if %lw%==C:\AUTOEXEC goto c
goto fehler
steht!
:a Im Gegensatz zu den echt unlschbaren
set lw=A: Variablen, die auftreten wenn das
goto message Environment voll ist, kann diese Variable
:b wieder durch die Eingabe von:
set lw=B:
goto message SET VAR=
:c gelscht werden. Sie kann aber auch durch
set lw=C:
eine Batchdatei gelscht werden! Eine
:message
echo Das Startlaufwerk ist %lw%! vermeintliche Leerzeile im Environment
goto ende erreicht man durch diese Direkteingabe:
:fehler
echo Das Startlaufwerk ist zumindest nicht SET ^Z=^Z
echo A:, B: oder C:! Nheres konnte leider Auch diese Leerzeile ist eine vermeintlich
echo nicht ermittelt werden, sorry!!! unlschbare Variable! Diese kann nur durch
:ende die Direkteingabe von:
Diese Routine funktioniert wirklich nur SET ^Z=
unmittelbar nach dem Einschalten des gelscht werden. Eine Batchdatei kann diese
Rechners, oder nach einem Reset. Wird sie Variable nicht lschen!
nach lngerer Computerbenutzung nochmals
aufgerufen, so geht damit der Inhalt der
Variablen LW unwiederbringlich verloren!
Mit der folgenden Befehlszeile kopiere ich
alle Dateien vom Ur-Startlaufwerk nach C:,
wenn ich sie in einer Batchdatei einsetze:
copy %lw%*.* c:\

Im Direktmodus, so ist es zumindest beim


Portfolio (=PoFo), kann ich diesen Befehl
nicht verwerten.

Lars Aschenbach - Batchprogrammierung - 06-03-04


52 Batch

KnowHow: DIP-OS letzten drei Zeichen zu lschen, bevor man


den Text neu abspeichert.
SYSTEMFEHLER -Verzeihung! Theoretisch kann man dieses Lschen auch
... bittet meist die Textverarbeitung, wenn sie mit FAKE.COM automatisieren, aber ich mu
einen Text nicht mehr laden kann. Dies liegt ja nicht alle Lsungen prsentieren.
meistens an einer Leerzeichen/Return- Schlielich sollt Ihr ja auch Nachdenken und
Kombination, die am Ende des zuletzt Erfolgserlebnisse haben!!!
gespeicherten Textes zu finden ist. Sie zwingt
damit zunchst den PoFo zu einem Neustart,
setzt aber auch auf Dauer die
Vergaloppiert & -kopiert?
Textverarbeitung schachmatt. Leider wird ja Stellt Euch einmal folgende Situation vor:
immer der letzte Text automatisch geladen, Larry L. benutzt gerade sein DOS und
der in diesem Fall fehlerhaft ist und somit steckt im Verzeichnis SEX auf dem Laufwerk
eine Kettenreaktion auslst. Erfahrene und A:. Die dort befindlichen Dateien will er nun
langjhrige User benutzen deshalb das ins Verzeichnis BILDER auf Laufwerk C:
Programm PORTDIV.COM, welches diesen kopieren. Unaufmerksam, wie er nun einmal
Systemfehler verhindert. Aber was tun wenn ist, gibt er den Kopierbefehl wie folgt ein:
man dieses Programm nicht hat? COPY *.* C:. Flugs werden alle Dateien von
Damit man die Textverarbeitung berhaupt A:\SEX nach C:\TEXTE kopiert, da unser
wieder nutzen kann, kann man die Datei Larry vergessen hat, zuvor auf Laufwerk C:
PERMDATA.DAT im Verzeichnis C:\SYSTEM ins Verzeichnis \BILDER zu wechseln! Da
lschen. Mit DEL C:\SYSTEM\ stecken nun also Texte und Bilder doch unter
PERMDATA.DAT wird das erledigt. Weil einer Decke, Pardon: in einem Verzeichnis,
damit der Text nach wie vor nicht repariert obwohl sie fein suberlich getrennt sein
wird, ist die folgende Lsung besser und sollten.
erfolgreicher: Gebt einfach am Prompt den Larry macht sich also nun mhsam daran
Befehl ECHO M>>BEISPIEL.TXT ein! alle fehlplazierten Dateien von Hand zu
Damit wird der Text, hier BEISPIEL.TXT, um lschen, damit auch ja kein wertvoller
den Buchstaben M verlngert und berlistet Liebesbrief verloren geht.
somit die Textverarbeitung. Problemlos kann Armer Larry! Httest du diese Batchdatei
man nun den Text wieder editieren und UNCOPY.BAT, so wre dir viel Handarbeit
korrigieren! erspart geblieben:
Als ich diese Lsung dem Jens Sewitz vom
@echo off
Atari Computer Team e.V. Bremen mitteilte, if %1.==. goto err
wir lernten uns auf der 10. Bremer for %%a in (*.*) do if exist %1\%%a del %1\%%a
Computer- & Videobrse kennen, brachte er goto off
mich auf die Idee, diese Lsung in eine :err
Batchdatei zu packen. echo Laufwerk und Verzeichnis fehlen!
:off
Und hier ist also die NOERROR.BAT:

@echo off Du mut sie mit dem Laufwerks- und


if %1.==. goto err Verzeichnisnamen aufrufen, in denen die
echo m>>%1.txt fehlplazierten Dateien liegen. In deinem Fall
app/e also mit UNCOPY C:\BILDER . Denn die FOR-
goto off IN-DO-Schleife prft zunchst nach, welche
:err
Dateien (*.*) des aktuellen Verzeichnisses,
echo Textdatei ohne .TXT angeben!
:off sich ebenfalls im, als Parameter %1
bergebenen, Zielverzeichnis befinden. Sind
Wenn ich also unseren Text BEISPIEL.TXT dort gleichnamige Dateien zu finden, so
korrigieren mu, lautet die werden sie dank DEL %1\%%A auch gleich
Eingabe:NOERROR BEISPIEL. NOERROR gelscht. Somit verlierst Du mit Sicherheit
hngt dann automatisch ein kleines m an keinen deiner Liebesbriefe und vergit auch
BEISPIEL.TXT und ruft anschlieend die keine Datei zu lschen!
Textverarbeitung auf. In dieser sind nun die

Lars Aschenbach - Batchprogrammierung - 06-03-04


Batch 53

Larrylob sind wir, verehrte Leser, nicht so 2.3 Erscheint die Fehlermeldung Datei nicht
larry drauf, weshalb UNCOPY.BAT nur sehr gefunden, so drcken Sie zweimal die ESC-
selten bei uns zum Einsatz kommt, oder??? Taste (ganz links oben) und drcken dann die
N-Taste.
UPDATE.COM & PORTDIV.COM 2.4 Gehen Sie mit dem Cursor zum Anfang
der Datei und fgen Sie dort die folgenden
Weil mich mindestens einmal pro Monat ein drei Zeilen vor:
Hilferuf zu diesen Dateien erreicht, mchte
ich mit diesem Text, der frei kopiert und @echo off
weitergegeben werden darf, die Verwendung update
portdiv
und die Installation dieser Programme
erklren. Allerdings sind gewisse 2.5 Ist die AUTOEXEC.BAT nicht vorhanden,
Vorkenntnisse bers DOS und die so geben Sie bitte die folgenden Zeilen ein:
Textverarbeitung des PoFos vonnten, denn
@echo off
alle mglichen Varianten sind mir nicht update
bekannt und von Fall zu Fall verschieden. portdiv
Diese Anleitung beschreibt den generellen prompt$p$g
Fall. path=c:\;c:\system
Wer also nicht wei, was Hauptverzeichnis,
Unterverzeichnis, AUTOEXEC.BAT und 2.6 Speichern Sie die AUTOEXEC.BAT wie
CONFIG.SYS sind, der sollte sich schleunigst folgt ab: Atari-Taste, D-Taste, S-Taste,
ein Buch zu MS-DOS kaufen, indem auch die folgenden Text eingeben: C:\AUTOEXEC.BAT
im PoFo vorhandenen Befehle stehen und und die Winkelpfeil-Taste drcken
erklren, wie man Dateien ablegt, ordnet und 2.7 Verlassen Sie die Textverarbeitung mit
verndert. einmaligem Druck auf die ESC-Taste.
3. Start der Programme:
1. bertragen dieser Programme auf die 3.1 Fhren Sie einen Warmstart aus, indem
Ramdisk C: Sie die Tasten STRG, ALT und EINF/ENTF
1.1 von der Memorycard im Kartenschacht A: zugleich drcken.
des PoFo mit:
COPY A:UPDATE.COM C:\ - Alle Angaben ohne Gewhr -
COPY A:PORTDIV.COM C:\
1.2 vom PC via Serialinterface: Wo bin Ich?
1.2.1 Eingabe am PoFo:
COPY AUX C:\UPADATE.COM Ob sich das DOS an diesem beliebten
1.2.2 Eingabe am PC : deutschen Ratespiel beteiligt, ist leider nicht
COPY UPDATE.COM AUX berliefert. Anscheinend hat es die
1.2.3 Eingabe am PoFo: Laufwerksverwaltung so gut im Griff, das
COPY AUX C:\PORTDIV.COM diese Frage nicht aufkommen kann. Fr
1.2.4 Eingabe am PC : automatische Ablufe kann es aber sehr
COPY PORTDIV.COM AUX hilfreich sein zu wissen, welches Laufwerk
Andere bertragungsarten sind auch mglich, gerade aktuell ist. Dem soll meine Batchdatei
habe ich aber noch nicht ausprobiert. WOBINICH.BAT Rechnung tragen:

2. Einbinden der Programme: @echo off


2.1 Starten Sie die interne Textverarbeitung rem Wo bin ich momentan ? - aktuelles Laufwerk
rem ermitteln!
des PoFo: if %1==. goto .
APP /E
copy c:\batch\wbi*.dat c:\batch\*.b*>nul
2.2 Laden Sie die AUTOEXEC.BAT ein, in dem cd>>c:\batch\wbi2.bat
Sie nach einander die folgenden Tasten cd\
drcken: ATARI-Taste (ganz links unten, cd>>c:\batch\wbi3.bat
rotes Atari-Logo), D-Taste, L-Taste folgenden echo echo Das Laufwerk %%alw%% ist
Text eingeben: C:\AUTOEXEC.BAT und die aktuell!>>c:\batch\wbi3.bat
type c:\batch\wbi2.bat>>c:\batch\wbi3.bat
Winkelpfeil-Taste drcken
echo wobinich .>>c:\batch\wbi3.bat
wbi3

Lars Aschenbach - Batchprogrammierung - 06-03-04


54 Batch

:.
del c:\batch\wbi*.bat>nul Sie setzt die Variable ALW und definiert sie
mit dem Laufwerksnamen und dem
WBI2.DAT: Backslash, der die Kennzeichnung fr das
cd
Hauptverzeichnis ist. Eigentlich mte dieser
WBI3.DAT: Backslash noch weg, da wir nur die
@echo off Laufwerkskennnung C: suchten, aber die
set alw= Routine wre dadurch noch
unverhltnismig lnger geworden. Nun
Besprechen wir zunchst die Gedanken, die bekommt Ihr die Rckmeldung auf den
dieser Routine vorausgegangen sind: Schirm und es folgt der Rckwechsel ins
Weder Laufwerk, noch Verzeichnis, sind Verzeichnis SYSTEM, von wo die ganze
beim Start bekannt. Helfen kann da nur der Routine gestartet wurde. Mit dem erneuten
Befehl -CD-, dessen Reaktion in Dateien Start von WOBINICH.BAT, sorgt
umgeleitet wird. Unter alten DOS-Versionen WBI3.BAT fr die Wiederherstellung der
ist ja keine Trennung zwischen der vorherigen Ordnung. Die Variable ALW wird
Laufwerkskennung und dem allerdings nicht gelscht, damit andere
Verzeichnisnamen mglich, weshalb ein Routinen auf sie zurckgreifen knnen!
wechsel in ein bekanntes Verzeichnis
stattfinden mu. Bestens geeignet ist dafr
KnowHow: DIP-OS
das Hauptverzeichnis, da es erstens auf
jedem Datentrger vorhanden ist und Auch Kleines wird einmal Gro
zweitens, einen markanten Namen besitzt, Mit der folgenden Routine kann man
der leicht verglichen werden kann. Bevor Parameter in Groschrift umwandeln. Somit
aber dieser Wechsel ausgefhrt wird, sollte kann man viele berprfungszeilen
noch das aktuelle Verzeichnis gerettet vermeiden, oder Worte besonders
werden, damit es spter wieder aktualisiert hervorheben. Doch leider funktioniert die
wird. Technik nur auf dem PoFo:
Soweit die Vorgeschichte, jetzt geht es an
des Routinens Kern: set =hallo
Beim ersten Start d.h., wenn Ihr echo %%
WOBINICH.BAT durch die Eingabe
Werden diese Zeilen in eine Batchdatei
WOBINICH aufruft, werden als erstes die
gepackt, so wird nach dem Aufruf
Hilfsdateien kopiert. Es folgt die Sicherung
derselbigen, das Wort hallo in
des aktuellen Verzeichnisnamens in die Datei
Grobuchstaben auf dem LCD-Schirm
WBI2.BAT, der Wechsel ins
erscheinen. Definiert man nmlich eine
Hauptverzeichnis und die Sicherung des
Variable, in deren Name ein ASCII-Charakter
Hauptverzeichnisnamens in WBI3.BAT.
oberhalb von 126 steckt, so wird der Inhalt
Jetzt wird die Rckmeldung in WBI3.BAT
automatisch vom PoFo in Groschrift
plaziert, bevor sie durch WBI2.BAT, mittels
umgewandelt. Weil lange Variablennamen nur
-TYPE- Befehl, verlngert wird. Die
Speicherplatz verschwenden und das
WBI2.BAT enthlt ja den Verzeichnisnamen,
direkt neben dem = auf der Tastatur
der beim Start von WOBINICH.BAT aktuell
liegt, habe ich mir diesen Variablennamen
war. Per -ECHO- wird nun der Befehl zum
ausgesucht. rger, Mll, l, bel oder alle
Rcksprung -WOBINICH .-, der WBI3.BAT
Konstruktionen aus Grafikzeichen vermgen
mitgeteilt, bevor sie dann gestartet wird.
dasselbe zu leisten.
Angenommen, mein PoFo steckt gerade in
Diese Erfahrung brachte mich auf die Idee,
dem Verzeichnis SYSTEM des Laufwerkes C:,
eine Batchdatei zu schreiben, mit der
dann she die WBI3.BAT schlielich so aus:
bestehende Variablen in Groschrift
@echo off umgewandelt werden knnen. Und weil mir
set alw=c:\ das ganze so gut von der Hand ging, kann
echo Das Laufwerk %alw% ist aktuell! man damit auch noch nicht existierende
cd c:\system Variablen gleich in Groschrift definieren.
wobinich .

Lars Aschenbach - Batchprogrammierung - 06-03-04


Batch 55

GV.BAT: wurde. Somit erfolgt ein Sprung zu (:old).


Dort wird aus optischen Grnden zunchst
@echo off der erste Parameter, der ja einem
rem GV - Grogeschriebene Variableninhalte
Variablennamen gleicht selbst in Groschrift
if not %%.==. if %%.==. goto err2
if exist c:\batch\gv2.bat goto msg umgewandelt: -set =%1-.
if %1.==. goto err Nun tritt aber das Problem auf, das man
if %2.==. goto old nicht an den Inhalt der Variablen kommt, die
:new als Parameter bergeben wurde. -SET
set =%1 =%%1%- wre zwar die richtige Lsung fr
set =%2
dieses Problem, funktioniert aber leider nicht.
set %1=%%
:msg Deswegen nehmen wir GV2.DAT zu Hilfe,
echo Die Variable %% enthlt nun %% welche zu GV2.BAT kopiert wird. Im
set = nchsten Moment wird die unvollstndige
set = Zeile -set =%- von GV2.BAT mit test%
goto off komplettiert, weil %1 in unserem Falle ja
:old
dem Wort test entspricht. Somit kommen
set =%1
copy c:\batch\gv2.dat c:\batch\*.b*>nul wir doch an den Inhalt der Variablen heran,
echo %1%%>>c:\batch\gv2.bat die als Parameter bergeben wurde.
echo set %%1=%%%%>>c:\batch\gv2.bat Gleichzeitig wird dadurch der dem Wort ja
echo gv>>c:\batch\gv2.bat entsprechende Inhalt in Groschrift
gv2 %% verwandelt, sofern GV2.BAT zur Ausfhrung
:err
kommt. Damit wir aber spter ber die
cls
echo Aufruf bei noch nicht existierender geglckte Umwandlung informiert werden,
echo Variable: mu GV2.BAT noch angewiesen werden,
echo GV Variablenname Variableninhalt zur GV.BAT zurckzukehren. Dies
echo geschieht mittels des Befehles -echo
echo Aufruf bei existierender Variable: gv>>c:\batch\gv2.bat-. Endlich sind alle
echo GV Variablenname
Vorkehrungen getroffen und GV2.BAT wird
goto off
:err2 durch die Zeile -gv2-gestartet.
echo Die Variable %% existiert nicht! Kaum das Ruder in die Hand genommen,
set = wird nun die Variable mit JA definiert,
:off bevor die Kontrolle wieder an GV.BAT
del c:\batch\gv2.bat>nul zurckgeht.
GV.BAT stellt nun die Existenz von
GV2.DAT:
GV2.BAT fest, geht daher von der korrekten
@echo off Umwandlung aus und springt zu (:msg). Es
set =% folgt die Ausgabe der Besttigung, bei der
Variablenname und der Variableninhalt in
Gehen wir nun einmal in der Annahme, da Groschrift erfolgt. Der guten Ordnung halber
die Variable TEST existiert und mit ja werden dann noch die Hilfsvariablen und ,
definiert ist. Wollen wir dieses ja in sowie die GV2.BAT gelscht.
Groschrift verwandeln, so rufen wir Wer schreibfaul ist oder nicht die SHIFT-
GV.BAT mit -GV Test- auf. Da die Variablen Taste findet, kann die Variable AUTO mit
und sowie GV2.BAT noch undefiniert, NEIN definieren, wenn er GV.BAT durch die
bzw. nicht existieren, werden weder die Eingabe von GV auto nein startet. In
Sprungmarke err2 noch msg ausgefhrt. diesem, unserem Falle mu die Sprungmarke
Als nchstes wird das Vorhandensein des (:new) ausgefhrt werden.
Parameters %1 geprft. Wurde kein Durch die drei dort befindlichen -SET-Zeilen
Parameter angegeben, so wird man auf den wird die Umwandlung vollzogen, was Ihr
fehlerhaften Start hingewiesen und bekommt ebenfalls leicht nachvollziehen solltet.
die mgliche Syntax angezeigt. Weil bei Nahtlos geht es mit (:msg) weiter, die den
unserem Testlauf eine bereits vorhandene korrekten Verlauf besttigen soll und fr die
Variable umgewandelt werden soll, trifft es Beseitigung der Hilfsvariablen zustndig ist.
zu, das kein zweiter Parameter angegeben

Lars Aschenbach - Batchprogrammierung - 06-03-04


56 Batch

Obwohl wir bei diesem zweiten Testlauf Diese Version formatiert die Ramdisk nicht
GV2.BAT nicht angelegt hatten, war ja nicht mehr automatisch, weil man den PoFo ja auf
notwendig, wird diese Datei versucht zu drei verschiedene Sprachen
lschen. Dank der Umleitung nach NUL (Englisch/Francais/Deutsch) einstellen kann
bekommen wir aber keine Fehlermeldung und dieses zu Problemen fhrt:
mitgeteilt. Bei der alten Version bin ich von auf
Natrlich kann man die Variable AUTO auch Deutsch eingestellten PoFos ausgegangen
im Direktmodus mit NEIN definieren wenn und habe die automatische Formatierung
man -SET AUTO=NEIN- eingibt. Dieser Weg durch:
ist zwar einfacher, aber bei automatisch FDISK 8 < j.dat > nul
ablaufenden Batchdateien ist meist keine
userbedingte Eingabe mglich oder gar uner- erreicht. Bei auf Deutsch eingestellten
wnscht. Deshalb hat die zweite Mglichkeit Gerten gibt es damit auch keine Probleme,
der Umwandlung auch Sinn! aber bei denen, die auf Englisch oder
Franzsisch eingestellt sind!
GW-Basic auf dem PoFo - Teil 3 Denn dort mu man die Rckfrage vom
DIP-OS mit der Taste Y fr YES oder O fr
Ich habe mich noch einmal hingesetzt und die
OUI beantworten!!! Und somit kann die nicht-
Startroutine zum GW-Basic berarbeitet, weil
deutsche-Rckfrage nichts mit der Taste J
meine alte Version, aus dem Jahre 12 nach
anfangen, die ich in die Datei J.DAT, zwecks
DOS (1993), nicht mehr zeitgem und viel
Umleitung an FDISK, gestellt habe!
zu umstndlich ist!
Meine Versuche alle mglichen und
Herausgekommen ist eine neue
erlaubten Tasten (YOJ) in YOJ.DAT zu stellen,
AUTOEXEC.BAT, die ins Hauptverzeichnis
quittierte der PoFo durch totale
einer 128KB Memorycard gehrt:
Arbeitsverweigerung!
@echo off Wer es probieren mchte, sollte so
if not exist a:\gwbasic.exe goto err
if not exist c:\system\*.* goto next YOJ.DAT mit der Textverarbeitung schreiben:
if exist c:\system\@!@-@!@.gwi goto next Y
O
cls
J
echo ++
echo !ATTENTION! ATTENZIONE! ACHTUNG!
echo ++ und dann den Befehl: FDISK 8 < YOJ.DAT im
echo DIP-OS (DOS) eingeben.
echo Try formatting C: with 200K! Zu gerne htte ich dieses Problem aus der
fdisk 200 Welt geschafft und EINE Lsung fr alle
echo Try formatting C: with 8K! Sprachen geschaffen, aber der PoFo spielt da
fdisk 8
:next
(noch) nicht mit!
md c:\system>nul Und was lernen wir daraus:
rem>c:\system\@!@-@!@.gwi Wenn wir Batchdateien schreiben, die
prompt $p$g Tastendrcke aus Dateien bentigen, so
path=a:\;c:\ mssen wir daran denken, das es nicht nur
a:\portdiv>nul die deutsche Sprache gibt!!!
cls
echo ++
Aber allem Anschein nach sind die
echo GW-BASIC 3.22 - Startroutine CompuServe-User echte Freaks und haben
echo developed 1996 by Lasse Assebasse meine alte Lsung, ohne zu murren!, Ihren
echo ++ Sprachen gem verndert. Ich hoffe nur,
a:\gwbasic das Ihr nicht so tolerant seit, weil solche
:err Fehler nicht gerade jahrelang unentdeckt
if not exist a:\gwbasic.exe echo File GWBASIC.EXE is
missing!
bleiben sollten!!!
Noch ein paar Worte zur Programmtechnik:
Ersatzlos gelscht werden knnen die Dateien Wie allseits bekannt sein drfte, formatiert
AUTO2.BAT, AUTO3.BAT, AUTO4.BAT, man mit dem Befehl FDISK die Ramdisk C:
AUTOEXEC.ORI und J.DAT. des PoFo. Weil dadurch ALLE Dateien auf C:
verloren gehen, auch CONFIG.SYS und

Lars Aschenbach - Batchprogrammierung - 06-03-04


Batch 57

AUTOEXEC.BAT, mu der PoFo danach neu


gestartet werden. Denn ein evtl. vorher Spielereien mit dem PROMPT
vorhandener Gertetreiber ist nun nicht mehr Als Prompt bezeichnet man die
da und kann auch nicht mehr genutzt Eingabeaufforderung, die uns das DOS zeigt,
werden! Deshalb nimmt der frisch formatierte wenn es fr weitere Aktionen bereit ist.
PoFo den Neustart automatisch vor. Oftmals hat es die folgenden, beispielsweisen
Nun bedeutet ein Neustart auch die Erscheinungsformen: a> oder a:\>.
wiederholte Suche nach einer ausfhrbaren Im Handbuch stehen auch einige Beispiele,
CONFIG.SYS und AUTOEXEC.BAT. wie man diese Formen ndern kann. Doch
Da auf C:\ keine AUTOEXEC.BAT mehr leider werden dort zumeist nur die
existieren kann und eine auf A:\ zu finden ist, Standardvariationen wiedergegeben. Dabei
nmlich die obige, wird die von A:\ gestartet. kann man das Prompt ganz nach seinen
Selbst wenn eine AUTOEXEC.BAT auf B:\ zu Wnschen gestalten!
finden ist, so kommt diese nicht zur So wird das Prompt auf das blinkende
Ausfhrung, weil die auf A:\ Vorrang hat! Quadrat reduziert, wenn man den Befehl
Rein theoretisch mte die obige PROMPT$h$h eingibt. Wer auf die sonst
AUTOEXEC.BAT also wieder die Ramdisk C: bliche Laufwerks- und Pfadangabe A:\
formatieren und damit wieder einen Neustart verzichten kann, hat auch die Mglichkeit,
auslsen. Und wieder, und wieder und da Prompt mit einem individuellen Text zu
wieder, ....: Eine Schlange die sich selbst in belegen. Die Eingabe von PROMPT PoFo
den Schwanz beit!!! erzeugt so immer die Meldung PoFo als
Wenn Ihr aber diese AUTOEXEC.BAT Prompt. Grafische Prompts kann man mittels
ausprobiert, und das hoffe ich doch sehr, so der Alt- oder der Strg- Taste erreichen.
werdet Ihr feststellen, da dies aber nicht der ndert man das Prompt durch PROMPT Wie
Fall ist! lautet die richtige Antwort?, so kann man
Schuld daran ist die Zeile: damit dem Bediener eine Tastatureingabe
if not exist c:\system\*.* goto next vorgaukeln.
Weil in Batchdateien keine echten
... die prft, ob sich keine Datei im Tastatureingaben mglich sind, mu eine
Verzeichnis C:\SYSTEM befindet, was nur Batchdatei existieren, die als Dateinamen die
unmittelbar nach einer Formatierung der Antwort enthlt und die die Auswertung
Ramdisk C: so sein sollte. Wenn diese vornimmt. Fr jede mgliche Antwort mu
Prfung positiv ausfllt, so wurde also die also eine eigene Batchdatei produziert
Ramdisk erfolgreich formatiert und das GW- werden.
Basic kann gestartet werden, was die Sobald die Frage beantwortet und
Sprungmarke :next erledigt. ausgewertet wurde, sollte das Prompt
Und damit nicht bei jedem Warmstart des natrlich seine vorherige Form wieder
PoFos die Ramdisk C: formatiert wird, lasse annehmen. Deshalb wird es zuerst in einer
ich von :next eine leere Datei @!@-@!@.gwi Variablen gerettet, dann wie gewnscht
im Verzeichnis C:\SYSTEM anlegen: gendert und abschlieend von der
Antwortdatei wiederhergestellt. In der Batch-
rem>@!@-@!@.gwi datei, in der also die Frage gestellt wird,
mssen die folgenden Zeilen zu Beginn
und diese mit der Zeile: plaziert werden:
if exist c:\system\@!@-@!@.gwi goto next SET PRZ=%PROMPT%
PROMPT=Wie lautet die korrekte Antwort ?
prfen. Nur wenn jemand von Euch so
perfide Gedanken hegt, die Datei Jede Batchdatei, die jeweils eine mgliche
C:\SYSTEM\@!@-@!@.GWI mutwillig zu Antwort auswertet, ist um die folgende Zeile
lschen und eine x-beliebige Datei nach zu ergnzen:
C:\SYSTEM zu kopieren, wird mit dem
nchsten Warmstart eine Formatierung der PROMPT=%PRZ%
Ramdisk C: fllig!!!

Lars Aschenbach - Batchprogrammierung - 06-03-04


58 Batch

Weil viele Antwortmglichkeiten auch prompt=Bist Du mit mir, dem Computer, zufrieden (J/N) ?
dementsprechend viele Batchdateien zur
Auswertung verlangen, sollte man die Fragen Und so sieht dann beispielsweise die Antwort-
mglichst so gestalten, das mit J fr JA oder Batchdatei J.BAT aus:
N fr NEIN geantwortet werden kann. Es @echo off
werden dann also nur die Batchdateien J.BAT if %frg%==1 goto eins
und N.BAT bentigt. if %frg%==2 goto zwei
Gesetzt der Fall, es sollen mehrere Fragen goto end
vom Bediener per J/N beantwortet werden, :eins
echo Du solltest besser im Garten arbeiten!
so knnen J.BAT und N.BAT die Antworten
goto end
fehlinterpretieren, da sie ursprnglich nur fr :zwei
eine Frage konzipiert wurden. Man stelle sich echo Vielen Dank, das ehrt mich sehr!
einmal vor, da der Computer fragt, ob wir :end
heute schnes Wetter htten. Durch die prompt=%prz%
Antwort mit J erhielten wir dann den
Kommentar vom Computer, da man doch Durch die IF-Zeilen wird die Variable FRG
besser im Garten arbeiten solle, als auf ihm, berprft und zu der Routine weitergeleitet,
den Computer, rumzuhacken. Im nchsten die dann den richtigen Kommentar ausgibt.
Moment soll dann die Frage, ob wir mit dem Bei entsprechender Weiterprogrammierung
Computer zufrieden sind, beantwortet kann man damit aus seinem Computer glatt
werden. Die meisten von uns werden auch den privaten Psychiater oder Lebensberater
diese Frage mit J beantworten und machen!!!
bekommen erneut den Kommentar geliefert, Echten Sinn macht diese Frage-Antwort-
da man doch besser im Garten arbeiten Technik aber erst in Installationsroutinen
solle. Eine Reaktion wie Vielen Dank, das oder Mensystemen. Die hier vorgestellte
ehrt mich sehr! wre hier nicht nur passen- Technik ist ausfhrlich auf dem Atari Portfolio
der, sondern auch logischer. getestet worden und kann sich natrlich
Aber auch diese Unlogik ist mit ein paar durch neuere DOS-Versionen erbrigen.
Zeilen behebbar! So definiert man in jeder
Frage-Batchdatei eine Variable und baut in Die automatische Sicherung des
J.BAT und N.BAT entsprechende Prfroutinen Environments
ein, mit denen dann die richtigen
Kommentare geliefert werden. Die definierte Ein volles Environment, zu altdeutsch:
Variable sollte immer denselben Namen Umgebungsspeicher, macht sich ja immer
haben und nur von jeder Frage- Batchdatei durch die Meldung Umgebungsspeicher voll!
mit neuem Inhalt definiert werden. Nennen bemerkbar und ist sehr rgerlich, weil keine
wir diese Variable FRG fr Frage und geben Variablen mehr gesetzt werden knnen.
wir ihr den Inhalt 1, wenn die Frage nach Startet man nach dieser Meldung noch
dem Wetter beantwortet werden soll. Die weitere Batchdateien, die Variablen anlegen
Frage-Batchdatei, die ich WETTER.BAT wollen, so werden diese Batchdateien nicht
nennen mchte, she dann so aus: mehr korrekt funktionieren und womglich
wichtige Dateien lschen. Also heit es
@echo off entweder Variablen von Hand lschen oder
set frg=1 DELENV.BAT einsetzen, damit der Ablauf von
set prz=%prompt% Batchdateien nicht gefhrdet ist. Doch was
prompt=Ist heute schnes Wetter (J/N) ?
ist, wenn man Variablen lscht, die spter
Die Frage-Batchdatei nach der Zufriedenheit, wieder bentigt werden? Um spter nicht wie
ich nenne sie hier COMPUTER.BAT, definiert der Ochs vorm Berg zu stehen, sollte man
die Variable FRG mit 2 und sieht dann etwa vor dem lschen der Variablen diese lieber
wie folgt aus: sichern, damit sie spter wiederhergestellt
werden knnen. Einen automatisierten
@echo off Lsungsansatz dafr stellt SAVENV.BAT dar:
set frg=2
set prz=%prompt%

Lars Aschenbach - Batchprogrammierung - 06-03-04


Batch 59

Grnden ist SAVENV.BAT nur bedingt


@echo off einsetzbar:
if %1.==. c:\batch\savenv.bat
if not %%.==. set = 1. Es kann das Environment nur dann
if not %1.==. goto nx
echo @c:\batch\savenv.bat>c:\ batch\savenv2.bat gesichert werden, wenn die
echo @echo off>c:\batch\rstenv.bat Variablennamen aus einem Wort bestehen.
echo PATH=%path%>>c:\batch\rstenv.bat Variablen wie TEST;VAR1=X oder
path=- TEST,VAR1=H fhren zu Endloslufen, weil
goto sv Semikolon, Kommata, Gleichheits- und
:nx Leerzeichen im DOS als Trennungszeichen
if not %1.==. shift
if not %1.==. path=%1 fungieren. Diese Trennungszeichen drfen
if not %2.==. path=%path% %2 also nicht in Variablennamen vorkommen,
if not %3.==. path=%path% %3 wenn SAVENV.BAT korrekt sichern soll.
if not %4.==. path=%path% %4 2. In den Variableninhalten drfen maximal
if not %5.==. path=%path% %5 neun Worte durch Trennungszeichen
if not %6.==. path=%path% %6 getrennt, enthalten sein. Bei der Variable
if not %7.==. path=%path% %7
if not %8.==. path=%path% %8 TEST=1 2 3 4 5 6 7 8 9 0 wrde die Null
if not %9.==. path=%path% %9 nicht mehr mitgesichert.
if %0==PATH goto ex 3. Ist eine Variable ohne Definition im
if %1.==. goto ex Environment, d.h. ohne das bliche
echo set %0=%path%>>c:\batch\rstenv.bat Gleichheitszeichen und erkennbaren
set %0= Inhalt, so wird nur bis zu dieser Variable
:sv
if exist c:\batch\savenv2.dat copy c:\batch\savenv2.dat gesichert. Sie und die nachfolgenden
c:\batch\*.b*>nul Variablen mssen aus technischen
if exist c:\batch\savenv2.bat set>>c:\batch\savenv2.bat Grnden unbercksichtigt bleiben.
if not %0.==. if exist
c:\batch\savenv2.batc:\batch\savenv2.bat Ansonsten sollte SAVENV.BAT korrekt
:ex funktionieren und das Environment in
echo Ist RSTENV.BAT so okay? RSTENV.BAT startfhig ablegen. Weil die
echo.
if exist c:\batch\rstenv.bat type c:\batch\rstenv.bat
Sicherung ber die Variable PATH erfolgt,
if exist c:\batch\savenv2.bat del c:\batch\savenv2.bat werden die Variableninhalte automatisch in
if exist c:\batch\rstenv.bat c:\batch\rstenv.bat Grobuchstaben umgesetzt, sofern es sich
dabei um Buchstaben handelt und die Inhalte
Diese Batchdatei sichert nach Mglichkeit das nicht bereits in Grobuchstaben geschrieben
gesamte Environment in einer ausfhrbaren wurden. Dies gilt allerdings auch nur bis zum
Batchdatei namens RSTENV.BAT. Dazu Auftritt einer unlschbaren Variable, wie im
notwendig ist allerdings auch die Datei dritten Ausnahmegrund beschrieben.
SAVENV2.DAT die durch folgende Eingaben Weil whrend der Sicherung die
zu erstellen ist: bestehenden Variablen nach Mglichkeit
gelscht werden mssen, damit die
copy con c:\batch\savenv2.dat<ENTER> automatische Sicherung funktioniert, wird
@echo off<ENTER>
RSTENV.BAT abschlieend gestartet, um das
c:\batch\savenv.bat<SPACE><STRG>+<Z><ENTER>
Environment wiederherzustellen. Folglich
Dabei steht <ENTER> fr die Enter- bzw. werden dann alle, bzw. die meisten,
Return-Taste, <SPACE> fr ein Leerzeichen Variableninhalte bereits in Grobuchstaben
und <STRG>+<Z> soll das Dateiendezeichen umgewandelt sein. Sollten sich in den
sein welches man erhlt, wenn man die Taste Variableninhalten andere Trennungszeichen
STRG drckt, festhlt und dann die Taste Z als das Leerzeichen befinden, so werden sie
drckt. Anstelle von <STRG>+<Z> reicht durch das Leerzeichen ersetzt. Die
aber auch ein Druck auf <F6> aus! Die Beibehaltung der anderen Trennungszeichen
Laufwerks- und Verzeichnisangaben mssen ist aus DOS-internen Grnden leider nicht
Sie gegebenenfalls Ihrem System mglich.
entsprechend anpassen. Aus folgenden Zum Schlu wird dann der Inhalt von
RSTENV.BAT zur Sicherheit angezeigt, damit

Lars Aschenbach - Batchprogrammierung - 06-03-04


60 Batch

man diesen Inhalt mit dem noch aktuellen 15: if not %1.==PATH. if not %2.==.:..
Environment vergleichen kann. Der SET c:\batch\delenv2.bat
16: if not %1.==.:.. if %2.==.:.. echo Ich konnte die
Befehl wirkt da ja bekanntlich Wunder.
Variable %1 und die ihr folgenden Variablen nicht
Eine halbautomatische Lsung, bei der die lschen!
aus einem Wort bestehenden 17: if not exist c:\batch\delenv2.bat echo Ich konnte den
Variablennamen als Parameter an die Umgebungsspeicher nicht lschen, weil
Batchdatei bergeben werden, ist zwar DELENV2.BAT fehlt!
sicherer, aber leider auch nicht gerade sehr 18: if %1.==.:.. if %2.==.:.. echo Kein lschen mglich, da
DELENV2.DAT nicht oder fehlerhaft erstellt wurde!
komfortabel.
19: if %PATH%==--- echo Die Pfadangabe mu neu
Aber wie gesagt: Dies ist nur ein eingegeben werden!
Lsungsansatz, der in Zukunft weiterverfolgt 20: if %PATH%==--- set path=
und verbessert werden soll! 21: if exist c:\batch\delenv2.bat del c:\batch\delenv2.bat

Umgebungsspeicher lschen Die Laufwerks- und Verzeichnisnamen


Als Umgebungsspeicher, zu neudeutsch: mssen sowohl in DELENV.BAT, als auch in
Environment, bezeichnet man den der selbst zu erstellenden DELENV2.DAT den
Speicherbereich vom DOS, der die Variablen eigenen Verhltnissen entsprechend
enthlt. Diesen Speicherbereich kann man ja angepat werden. Und mit diesen Eingaben
bekanntlich mit dem Befehl SET verndern erstellt man DELENV2.DAT:
oder anzeigen lassen:
copy con c:\batch\delenv2.dat<ENTER>
@echo off<ENTER>
COMSPEC=C:\COMMAND.COM c:\batch\delenv.bat<SPACE><STRG>+<Z><ENTER>
PROMPT=$p$g
PATH=C:\DOS;C:\BATCH;C:\WINDOWS
TEMP=C:\temp Dabei steht <ENTER> fr die Enter- bzw.
OS=MS-DOS Return-Taste, <SPACE> fr ein Leerzeichen
VER=6.22 und <STRG>+<Z> soll das Dateiendezeichen
BDV=C: sein welches man erhlt, wenn man die Taste
BDY=\BATCH\ STRG drckt, festhlt und dann die Taste Z
EV1=123456789012345678901
EV2=1234567890123456789012
drckt. Anstelle von <STRG>+<Z> reicht
EV3 aber auch ein Druck auf <F6> aus!
Das Leerzeichen hinter c:\batch\delenv.bat
Bei vollautomatisch ablaufenden Batchdateien ist ungemein wichtig und darf auf gar keinen
kann das Lschen des Umgebungsspeichers Fall vergessen werden!!! Wird dieses
sehr ntzlich sein, damit wieder Platz fr Leerzeichen nmlich vergessen,
neue Variablen geschaffen wird. Und genau so mu DELENV.BAT vorzeitig abbrechen,
dieses Lschen bewerkstelligt DELENV.BAT ohne eine Variable gelscht zu haben!
bis zu einem gewissen Grad, sogar ohne die Hier die Funktionsweise von DELENV.BAT in
Variablennamen zu kennen: groben Zgen:
Weil DELENV.BAT die einzelnen Variablen
01: @echo off aus dem Environment nicht kennt und auch
02: if %0==delenv if %1.==.:.. %0 nicht kennen soll, mssen die einzelnen
03: if %2.==. if exist c:\batch\delenv2.bat Variablen als Parameter, beim Start von
c:\batch\delenv.bat %1 .:. DELENV.BAT angegeben werden. Aus diesem
04: if %1.==. c:\batch\delenv.bat . .
05: set path=%PATH%
Grunde wird beim Start von DELENV.BAT die
06: if %PATH%.==. set path=--- Datei DELENV2.BAT gefertigt, die durch
07: set prompt=%PROMPT% Umleitung des Befehles SET, ein Abbild des
08: set comspec=%COMSPEC% Environments aufnehmen mu:
09: set temp=%TEMP%
10: if %.:.%.==.:.. set .:.= @echo off
11: if not %1.==PATH. set %1= c:\batch\delenv.bat OS=MS-DOS
12: echo @c:\batch\delenv.bat .:. .:.>c:\batch\delenv2.bat VER=6.22
13: if exist c:\batch\delenv2.dat copy c:\batch\delenv2.dat ...usw.
c:\batch\*.b*>nul
14: if exist c:\batch\delenv2.bat set>>c:\batch\delenv2.bat

Lars Aschenbach - Batchprogrammierung - 06-03-04


Batch 61

Sie startet nach dieser Aufnahme bricht sie das Lschen ab. Somit bleiben bei
DELENV.BAT mit den Angaben OS und MS- diesem Beispiel die Variablen PATH, PROMPT,
DOS als ersten und zweiten Parameter neu. COMSPEC und TEMP erhalten.
Zeile elf von DELENV.BAT kommt nun zum Fr mich, bzw. meine Batchdateien, sind die
Zuge und lscht die als Parameter %1 Variablen BDV und BDY ebenfalls sehr
bergebene Variable OS. Zwischenzeitlich wichtig, weshalb ich die folgenden Zeilen
wurde vom nun mehr verkleinerten noch zwischen die Zeilen neun und zehn
Environment ein neues Abbild einfge, um auch BDV und BDY zu behalten:
in die erneut gefertigte DELENV2.BAT
gepackt: set bdv=%BDV%
set bdy=%BDY%
@echo off
c:\batch\delenv.bat VER=6.22 Nach diesem Schema knnen Sie also alle
BDV=C: wichtigen Variablen bewahren, wenn Sie
...usw. diese nach Zeile neun von DELENV.BAT
einfgen! Auf jeden Fall sollte keine Variable
Diese neue DELENV2.BAT startet also wieder vor der Zeile fnf eingefgt werden, weil alle
DELENV.BAT und sorgt damit fr die Variablen, die vor PATH stehen, gelscht
Lschung der Variable VER. Theoretisch werden!
wrde sich dieses rotierende System so lange In bislang nur einem bekannten Fall mu das
fortsetzen, bis keine Variable mehr existiert! Lschen vorzeitig abgebrochen werden, da
Aber dem aufmerksamen Beobachter wird DELENV.BAT die Variable nicht lschen kann.
nicht entgangen sein, das die erste zu Die Rede ist von EV3, die man im oben
lschende Variable eigentlich COMSPEC htte dargestellten Environment entdecken kann.
sein mssen, wenn man das Abbild des Sie ist wie alle Variablen durch den SET
Environments betrachtet, welches eingangs Befehl entstanden, konnte aber nicht korrekt
gezeigt wurde. angelegt werden, weil der
Weil es natrlich nicht sehr klug ist das Umgebungsspeicher whrend der Anlegung
gesamte Environment zu lschen, schlielich voll wurde. Trotz intensivster Bemhungen ist
sind Variablen wie PATH, PROMPT, COMSPEC es mir bislang nicht gelungen, diese Variable
und TEMP fr DOS und uns ntzlich oder gar wieder per SET Befehl zu lschen. Und genau
notwendig, werden diese Variablen vorher deswegen kann sie anscheinend auch nicht
"gesichert". Sie werden durch die Zeilen fnf per Batchdatei gelscht werden: Sie bleibt
bis neun mit Ihrem eigenen Inhalt definiert solange im Environment, bis der Rechner neu
und rutschen dadurch ans Ende des gestartet wird!!!
Umgebungsspeichers: Es spielt keine Rolle wie die Variable bei
Ihnen heit oder wie lang ihr Name ist,
OS=MS-DOS sobald sich eine Variable ohne
VER=6.22
Gleichheitszeichen im Environment befindet,
BDV=C:
BDY=\BATCH\ kann diese nach derzeitigem Kenntnisstand
EV1=123456789012345678901 nicht vom DOS gelscht werden.
EV2=1234567890123456789012 Somit mu das rotierende System von
EV3 DELENV.BAT fehlschlagen, wenn die
PATH=C:\DOS;C:\BATCH;C:\WINDOWS fehlerhafte Variable an die erste Stelle des
PROMPT=$p$g
Environments hochgerckt ist. In Mitleiden-
COMSPEC=C:\COMMAND.COM
TEMP=C:\temp schaft sind all die Variablen gezogen, die sich
dann zwischen der fehlerhaften und der PATH
Weil sie aber selbst dort nicht sicher sind, das Variable befinden. Diese knnen dann auch
rotierende System lscht fast alles, fungiert nicht mehr gelscht werden, weil das
die Variable PATH als Grenze zwischen den zu Environment immer wieder mit der strenden
lschenden und den zu erhaltenen Variablen. Variable beginnt.
Sobald also DELENV.BAT die Variable PATH Immerhin habe ich DELENV.BAT so
als ersten Parameter geliefert bekommt, dressiert, da es dieses Problem erkennt und
die Arbeit dann einstellt. Auch wenn die

Lars Aschenbach - Batchprogrammierung - 06-03-04


62 Batch

Variable PATH, die Datei DELENV2.DAT, die GW-Basic auf dem PoFo!!!
Datei DELENV2.BAT nicht existiert, wird das
bemerkt und entsprechend reagiert. Selbst Nach dem also das GW-BASIC 3.22 auf
einen unsinnigen Start von DELENV.BAT meinem PoFo lief, strte ich mich noch an
durch die Eingabe DELENV .:. .:. verzeiht sie dem Bildschirmformat von 80 Zeichen und 25
grozgig! Zeilen. Der PoFo hat ja nur ein
Selbst wenn eine brandgefhrliche Variable Bildschirmformat von 40 Zeichen und 8
im Environment vorkommen sollte, ich denke Zeilen, weshalb etliche Basicprogramme
da z.B. an FDISK, so wird dieser unbersichtlich wirken.
Variablenname nicht zum Start des Versuchsweise begann ich also das
gleichnamigen Programmes fhren, welches Programm GWBASIC.EXE zu patchen, hrte
ansonsten die gesamte Festplatte formatieren aber alsbald wieder damit auf, weil die Werte
knnte!!!! 80 und 25, die es ja in 40 und 8 abzundern
Weil Kontrolle seit jeher besser als galt, etwa 3000 mal vorkamen. Das war mir
Vertrauen ist, kann man ja dieses Risiko dann doch zuviel Arbeit, so da ich mich
herausfordern und eine Variable namens eines einfacheren Lsungsweges besann und
FORMAT definieren, die als Inhalt mit den der Firma Microsoft mein Problem schilderte.
Werten gesetzt wird, die ansonsten zur Kurz darauf erhielt ich von Microsoft, es war
Formatierung einer 1.44MB Diskette im nicht Bill Gates persnlich, den gewnschten
Laufwerk A: ntig sind: Rckruf: Weil die Entwicklung schon solange
zurck liegt, ist es leider nicht mglich, die
set format=a: /f:1440 gewnschte Arbeit vorzunehmen.
Also blieb es doch wieder an mir haften und
Nun sollte man eine Diskette ins Laufwerk A: ich machte mich an diese langwierige
einlegen, DELENV.BAT starten und abwarten. Prozedur. Mit mehreren Basicprogrammen
Sollte sich aber in Ihrem Environment eine und Batchdateien, die sich gegenseitig
Variable befinden, in deren Name sich ein aufriefen und die Ergebnisse festhielten, ist
Leerzeichen, oder ein hnliches es mir dann doch schon nach einer Stunde
Trennungszeichen, befindet, so wird gelungen, auf einem 386er PC mit 25 MHz
DELENV.BAT diese Variable nicht lschen wohlgemerkt, die Zeilenzahl von 25 auf 8
knnen und das fhrt zu einer Endlosschleife. abzundern. Die Zeichenzahl von 80 mute
D.h. DELENV.BAT wird nicht mehr beendet! ich kurioserweise nicht mehr ndern, da das
Wer DELENV.BAT auch tatschlich in einen GWBASIC 3.22 dann problemlos auf dem
vollautomatisch ablaufenden PoFo funktionierte. Dazu mu der
Batchdateienverbund nutzen mchte, kann Bildschirmmodus MODUS im Systemmen,
dies erreichen, wenn er DELENV.BAT um die auf Normal eingestellt werden. Die
22. Zeile ergnzt. Weil auch ich noch keine Funktionstasten werden dann allerdings nicht
Patentlsung dafr habe, mu sich jeder mehr komplett angezeigt, sondern nur die
Leser selbst so seine Gedanken dazu ersten fnf. Um die restlichen fnf sichtbar zu
machen. machen, mu man den Befehl KEY LIST
verwenden.
Zwar ist die unterste, also die achte Zeile,
nicht im Eingabemodus zu erreichen, aber sie
kann von den Programmen problemlos
mitbenutzt werden. Bevor Ihr nun beginnt
Euer GWBASIC 3.22 mit dem unten stehen-
den Basicprogramm zu patchen, solltet Ihr
sicherheitshalber eine Kopie der Datei
GWBASIC.EXE anfertigen.
Sollte nmlich die gepatchte Version nicht
korrekt auf dem PoFo funktionieren, so habt
Ihr immer noch die Originalversion fr den
PC!!!

Lars Aschenbach - Batchprogrammierung - 06-03-04


Batch 63

10 OPENgwbasic.exe AS #1 LEN=1 mit der angepaten Version aushelfen, da sie


20 FIELD #1,1 AS B$ dem Copyright von Microsoft unterliegt.
30 RESTORE 260
Weitere Erkenntnisse zum GWBASIC 3.22:
40 FOR A=1 TO 5
50 READ B,C Es ist nicht alles Gold was glnzt und daher
60 LSET B$=CHR$(C) gibt es einige Befehle des GWBASIC, die nicht
70 PUT #1,B auf dem PoFo funktionieren:
80 NEXT Circle, Draw, Line, Get (x1,y1)-(x2,y2), Put
90 FOR A=73923 TO 73985 (x1,y1)-(x2,y2), Color, Pset, Preset, Paint -
100 READ A$
und alle weiteren Grafikbefehle Enter, On
110 LSET B$=CHR$(VAL(&H+A$))
120 PUT #1,A Timer Gosub, On Key Gosub, On String(x)
130 NEXT Gosub - und hnliche Interruptgesteuerte
140 FOR A=22652 TO 22655 Befehle
150 READ A$ Die Notbremse STRG+PAUSE, mit denen
160 LSET B$=CHR$(VAL(&H+A$)) man gewaltsam Basicprogramme auf dem PC
170 PUT #1,A
abbrechen kann, ist auf dem PoFo dank der
180 NEXT
190 RESTORE 320 fehlenden Pause-Taste, nicht mglich.
200 FOR A=77473 TO 77632 Darum ist es notwendig, in jedem
210 READ A$ Basicprogramm fr den PoFo, eine
220 LSET B$=CHR$(VAL(&H+A$)) Abbruchfunktion selbst zu programmieren.
230 PUT #1,A Ich erledige das ber die folgende
240 NEXT
Befehlszeile:
250 CLOSE
260 DATA 21942,0,21943,30,39445,0,39446,7,39471,8
xxx IF INKEY$=CHR$(27) THEN CLOSE:CLS:END
270 DATA 47,57,2D,42,41,53,49,43,20,33,2E,32,32,
20,2D,20
Diese Befehlszeile mu immer in dem
280 DATA 50,6F,46,6F,20,56,65,
72,73,69,6F,6E,0D,0A,28,43 Hauptteil des Programmes landen, damit man
290 DATA 29,20,43,6F,70,79,72,69, das Programm dann auch mit der ESC-Taste
67,68,74,20,4D,69,63,72 abbrechen kann. Setzt man diese Zeile in ein
300 DATA 6F,73,6F,66,74,20,31,39 Unterprogramm, die drei xxx stehen fr die
,38,33,2D,31,39,39,33,0D Zeilennummer, so kann das Programm nicht
310 DATA 0A,7F,7F,7F,7F,80,00,00,C9,00,28,00,
00,C9,00,77
jederzeit abgebrochen werden, was ja nicht
320 DATA 43,4C,53,27,0D,00,00,00,00,00,00, gerade wnschenswert ist. Ich habe bewut
00,00,00,00,00 die ESC-Taste ausgewhlt, weil ja damit auch
330 DATA 41,55,54,4F,20,00,00,00,00,00, jede der eingebauten Applikationen,
00,00,00,00,00,00 verlassen wird. Auerdem wird sie so gut wie
340 DATA 47,4F,54,4F,20,00,00,00,00,00,00,00 ,00,00 nie von anderen Basicprogrammen bentigt!
,00,00
350 DATA 4C,49,53,54,20,00,00,00,00,00,
Relative Dateien stellen auch ein Problem
00,00,00,00,00,00 dar: Sie drfen eine Maximalgre nicht
360 DATA 52,55,4E,0D,00,00,00,00,00, berschreiten, die sich auf die augenblickliche
00,00,00,00,00,00,00 Sektorengre bezieht. Entweder ist also
370 DATA 46,49,4C,45,53,00,00,00,00,00 nach 128, nach 256 oder nach 512 Bytes
,00,00,00,00,00,00 Schlu. Sequentielle Dateien sind davon nicht
380 DATA 4C,4F,41,44,22,00,00,00,00
,00,00,00,00,00,00,00
betroffen. Allerdings gilt diese Einschrnkung
390 DATA 53,41,56,45,22,00,00,00, nur fr die PoFos mit den BIOS-Versionen
00,00,00,00,00,00,00,00 1.030, 1.052 und 1.072!
400 DATA 4F,50,45,4E,22,00,00,00,00,00, Wer weitere Probleme mit GWBASIC
00,00,00,00,00,00 entdeckt oder mit dieser Ausfhrung nicht
410 DATA 53,59,53,54,45,4D,0D,00, zurecht kommt, sollte darber berichten,
00,00,00,00,00,00,00,00
damit ich darauf eingehen kann.
Dieses Programm habe ich mehrfach auf
meinem PC angewandt und immer eine "GRO und artig"
funktionsfhige Basicversion fr den PoFo Flexible Batchdateien sind oftmals auf
bekommen. Sollte es also nicht bei Euch Parameter (%1 usw.) angewiesen, die der
funktionieren, so kann ich Euch leider nicht

Lars Aschenbach - Batchprogrammierung - 06-03-04


64 Batch

User beim Start der Batchdatei mitangeben Damit der PC auch spter noch die
mu. Durch diese Parameter, das knnen Programme wiederfindet, wird der
Zahlen, Zeichen, Wrter oder gar ganze ursprngliche Pfad vorher gesichert und
Stze sein, wird dann der Ablauf der nachher wieder restauriert. Zum Schlu
gestarteten Batchdatei beeinflut. Diese findet man den Parameter %1 komplett in
Parameter auf Richtigkeit zu berprfen, ist Grobuchstaben geschrieben in der Variable
eine nicht leichte Aufgabe fr jede Batch- XYZ und braucht zum prfen nur noch eine
datei, ganz besonders wenn es sich um Abfrage.
Wrter handelt. Bis ich zum ersten Mal die Fehlermeldung
Denn es ist schon ein groer Unterschied, "Umgebungsspeicher voll" vom DOS zu
ob ich das Wort TEST in Grobuchstaben, als Gesicht bekam, konnte ich mich auch auf
test in Kleinbuchstaben oder gemischt als diese Technik verlassen. Weil diese
Test schreibe. Fehlermeldung besagt, da man keine
weiteren Variablen anlegen kann, bevor man
Um dieses Problem der Gro-, nicht einige andere Variablen gelscht hat,
Kleinschreibung und auch der gemischten kann es passieren das die Variablen OLDPATH
Schreibweise zu beheben, behalf ich mir und XYZ nicht oder fehlerhaft angelegt
zuerst mit z.B. folgenden Batchzeilen: werden.
Und wenn das passiert, dann kann die
if %1==test echo Parameter korrekt Pfadangabe auch nicht mehr korrekt
if %1==Test echo Parameter korrekt restauriert werden, was zu einer ganzen
if %1==TEST echo Parameter korrekt
Menge rger fhrt: Schlielich wird der PC
einen Groteil der gespeicherten Programme
um die hufigsten Schreibweisen des
nicht mehr starten knnen!
bentigten Wortes TEST zu prfen. Als ich
Als Alheilmittel wird dagegen der Aufruf
dann mit der FOR-IN-DO Schleife vertraut
eines zweiten Kommandointerpreters
war, konnte ich diese Prfung wie folgt
empfohlen, mit gleichzeitigem Neustart der
verkrzen:
o.g. Technik in Form einer Batchdatei. Sobald
aber der zweite Kommandointerpreter
for %%a in (test Test TEST) do if %%a==%1 echo
Parameter korrekt beendet wird, ist auch die Variable XYZ und
ihre Definition wieder verschwunden. Ein
Doch leider werden die beiden Verfahren nachfolgender Batch wird, der auf XYZ
nicht mit den Schreibweisen TeST, TEst, angewiesen ist, die Variable vergebens
teST, TesT usw. fertig, die durch suchen und sehr wahrscheinlich fehlerhaft
berhastetes Eintippen entstehen knnen. enden. Das kann vom Abbruch mit
Bei kurzen Worten wie TEST kann man zwar Fehlermeldung ber den endlosen Ablauf der
alle Mglichkeiten im voraus Routine bis zum Verlust von Dateien reichen!
einprogrammieren, aber bei Worten wie So kam ich nach umfangreichem
DISKETTE oder FESTPLATTE wre diese Brainstorming und etlicher Tests auf eine
intelligente Programmierung zu umfangreich sicherere Technik der Umwandlung, die
und ineffektiv. hauptschlich durch Parameter getragen
So kam ich nach eingehenden wird. Nur die Variable PATH wird auch
Beobachtungen und Versuchen zu dieser weiterhin verndert, da ohne sie bisher keine
Technik: Umwandlung von Klein- in Grobuchstaben
mglich zu sein scheint.
set oldpath=%PATH%
path=%1
set xyz=%PATH%
path=%OLDPATH%
if %XYZ%==TEST echo Parameter korrekt

Ihr ganzes Geheimnis liegt in der Zeile


PATH=%1, die fr die Umsetzung des
Parameters in Grobuchstaben zustndig ist.

Lars Aschenbach - Batchprogrammierung - 06-03-04


Batch 65

UPCASE.BAT: UPTEST1 BATCHing


@echo off UPTEST1 BATchING
if not %0==%BDV%%BDY%upcase.bat goto off UPTEST1 BaTcHiNg
if %1.==. goto off
if not %1.==.. if %2.==. goto off
if not exist %2.bat if not exist %BDV%%BDY%nul goto off Ein Beispiel fr die Parameter beim Start von
echo @echo off>%BDV%%BDY%pfad.bat UPCASE.BAT, durch Zeile zwei der
if not exist %BDV%%BDY%pfad.bat goto off UPTEST1.BAT veranlat, knnte sein:
echo path=%PATH%>>%BDV%%BDY%pfad.bat
path=%1 BaTcHiNg . c:\batch\uptest1 : C:\DOS
shift C:\BATCH C:\WINDOWS
if %1.==.. shift
if exist %1.bat call %1 %PATH% %2 %3 %4 %5 %6 %7 Und das macht UPCASE.BAT mit diesen
%8 %9 Parametern:
set path=
:loop1 BaTcHiNg - umwandeln in BATCHING
shift - lschen durch SHIFT-Befehl
if %1.==. goto off c:\batch\uptest1 - Batchdatei starten, da sie das Wort
if %1.==:. goto loop2 BATCHING haben will:
if not %1.==:. goto loop1 - lschen durch SHIFT-Befehl
:loop2 C:\DOS - Pfadangabe wiederherstellen: PATH=C:\DOS;
shift C:\BATCH - Pfadangabe wiederherstellen:
if not %1.==. if not exist %1\nul goto loop2 PATH=C:\DOS;C:\BATCH;
if not %1.==. if %PATH%.==. set path=%1 C:\WINDOWS - Pfadangabe wiederherstellen:
if not %1.==. if not %PATH%.==. if not %PATH%.==%1. PATH=C:\DOS;C:\BATCH;C:\WINDOWS
set path=%PATH%;%1
if not %1.==. goto loop2 Bevor UPCASE.BAT aber die Pfadangabe
:off restauriert, ruft es die ursprngliche
if not exist %BDV%%BDY%pfad.bat if not exist %3.bat Batchdatei, hier: UPTEST1.BAT, inklusive
echo Die Umwandlung ist unmglich, weil der PFAD neun Parameter auf. UPTEST1.BAT kann nun
nicht rekonstruiert werden kann! den Parameter %1, das Wort BATCHING,
if %PATH%.==. if exist %BDV%%BDY%pfad.bat call
prfen und entsprechend reagieren. Am Ende
%BDV%%BDY%pfad.bat
if %PATH%.==. echo ACHTUNG: Der PFAD wurde kommt wieder UPCASE.BAT zum Zuge, damit
gelscht! Bitte neu eingeben. die Pfadangabe restauriert wird.
Zwar werden beim besagten Restart von
Sie wird von der Batchdatei gestartet, die den
UPTEST1.BAT, in Zeile zwlf der
Parameter %1 in Groschrift umgewandelt
UPCASE.BAT, noch die Parameter %2 bis %9
haben will. Ein erstes Beispiel dafr ist
mitbergeben, aber da UPTEST1.BAT sie
UPTEST1.BAT:
nicht bentigt, bleiben sie unbeachtet.
UPTEST1.BAT: Um die bergabe und Verwendung dieser
@echo off acht Parameter zu demonstrieren, habe ich
if not %0==%BDV%%BDY%uptest1 die Batchdatei ZU.BAT aus der Ausgabe
%BDV%%BDY%upcase.bat %1 . %BDV%%BDY%%0 : 12/95, Seite 212-214, umgeschrieben und
%PATH%
fr UPCASE.BAT aufbereitet:
echo.
if %1.==BATCHING. echo %1 macht Spa!!! ZU.BAT:
if not %1.==BATCHING. goto err 1: @echo off
goto off 2: if not %0==%BDV%%BDY%zu
:err %BDV%%BDY%upcase.bat %1 . %BDV%%BDY%%0
echo Probieren Sie doch einmal das Wort BaTcHiNg %2 : %PATH%
aus... 3: if not %2.==. if exist %2\nul echo if not %%1.==. if
:off %%1.==%1. cd %2>>%BDV%%BDY%zu.bat
echo. 4: rem Hier landen die gewnschten und geprften
Verzeichnisse:
Um dem Beispiel gerecht zu werden, mu
UPTEST1.BAT mit dem Wort Batching als Die Syntax von ZU.BAT lautet auch
ersten Parameter gestartet werden. Und das weiterhin: ZU Kurzname
knnen z.B. folgende Eingaben sein: Laufwerk+Verzeichnis. So wird durch den
einmaligen Start mit der Eingabe "ZU ute

Lars Aschenbach - Batchprogrammierung - 06-03-04


66 Batch

C:\TEXTE\PRIVAT\UTE" ein schneller Ver- UPCASE.BAT prft auch das, so landen diese
zeichniswechsel in C:\TEXTE\PRIVAT\UTE Parameter wieder in der Variable PATH.
ermglicht, wenn man bei spteren Starts Wird beim Aufruf der Batchdatei, die die
nur "ZU ute" oder auch "ZU UTE" eingibt. Umwandlung eines Parameters in
Beim ersten Start sind also zwei Parameter, Grobuchstaben wnscht, vergessen ein
%1 und %2, ntig, damit man spter ZU.BAT Parameter anzugeben, so schtzt der Punkt
nur noch mit einem Parameter, %1, vor %BDV%%BDY%%0 vor Fehlfunktion von
aufzurufen braucht und in den Vorteil des UPCASE.BAT. Vorausgesetzt, man hat diesen
einfachen Verzeichniswechsels kommt. Punkt selber nicht beim schreiben der Zeile
Um die Funktionsweise dieser zwei vergessen!
Parameterbergabe zu verstehen, stellen wir Wer UPCASE.BAT nutzen mchte, mu mit
einmal die Zeilen mit der Nummer zwei aus diesen Zeilen seine Batchdatei beginnen,
UPTEST1.BAT und ZU.BAT gegenber: damit UPCASE.BAT benutzt werden kann:

if not %0==%BDV%%BDY%uptest1 @echo off


%BDV%%BDY%upcase.bat %1 . %BDV%%BDY%%0 if not %0==%BDV%%BDY%batchdateiname
: %PATH% %BDV%%BDY%upcase.bat %1 . %BDV%%BDY%%0
if not %0==%BDV%%BDY%zu %2 %3 %4 %5 %6 %7 %8 %9 : %PATH%
%BDV%%BDY%upcase.bat %1 . %BDV%%BDY%%0
%2 : %PATH% Anstelle von Batchdateiname mu man den
Ins Auge springen sollte die bis zu achtstelligen Namen dieser Batchdatei
Parameterangabe %2 in der Zeile aus eintragen. Wichtig dabei ist, das alle
ZU.BAT, da sie in der Zeile von UPTEST1.BAT Dateinamen in Kleinbuchstaben geschrieben
nicht zu finden ist. Demnach wird also werden! Diese Zeile zwei ist in Sachen
C:\TEXTE\PRIVAT\UTE aus unserem Beispiel Parameterreihenfolge und -anzahl als Stan-
zu ZU.BAT, als weiterer Parameter an dardbeispiel zu verstehen und den eigenen
UPCASE.BAT gegeben, wenn dieser als %2 Wnschen gem anzupassen. Wer aber
hinter %BDV%%BDY%%0 eingefgt wird. meine Erklrungen dazu nicht verstanden
Fr UPCASE.BAT ist dieser Parameter zwar haben sollte, sollte dieses Beispiel in allen
nicht wichtig, aber sie gibt ihn doch beim Batchdateien verwenden, die UPCASE.BAT
Restart von ZU.BAT zurck, weil dieser benutzen sollen!
Parameter ansonsten verloren wre. Wer es mag, kann noch zwischen den
Und so kann man alle neun Parameter aus beiden Zeilen eine Zeile einfgen, die das
der eigenen Batchdatei zur Sicherung an Vorhandensein des ersten Parameters prft
UPCASE.BAT geben: und im negativen Falle, z.B. zu einer
Sprungmarke fhrt, die den Bediener auf den
if not %0==%BDV%%BDY%batchdateiname fehlenden Parameter hinweist und die
%BDV%%BDY%upcase.bat %1 . %BDV%%BDY%%0 Batchdatei anschlieend beendet.
%2 %3 %4 %5 %6 %7 %8 %9 : %PATH%
Ausgefuchste Freaks, d.h. sehr gute Batch-
Welche Parameter man dabei verwendet oder programmierer, knnen UPCASE.BAT auch
in welcher Reihenfolge man diese schreibt, durch Ergnzung um eine 29. Zeile, so
das bleibt einem selbst berlassen. gestalten, da UPCASE.BAT vollautomatisch,
Hauptsache ist, da der Parameter, der in in einem Verbund von Batchdateien, des
Grobuchstaben umgewandelt werden soll, Nachts arbeitet!
hinter %BDV%%BDY%upcase.bat Es ist nicht notwendig UPCASE.BAT zu
eingetragen wird! verstehen, aber man mu wissen das
Der Doppelpunkt vor %PATH% soll durch UPCASE.BAT immer nur einen Parameter und
seine Anwesenheit der UPCASE.BAT klar auch nur den ersten bergebenen Parameter,
machen, das die auf ihn folgenden Parameter pro Durchlauf, in Grobuchstaben umwan-
den ursprnglichen Inhalt der Pfadangabe delt!
darstellen. Wenn die also auf den Fr den Fall der Flle, Verlust der Variable
Doppelpunkt folgenden Parameter auch PATH, hat UPCASE.BAT auch einige
tatschlich Verzeichnisse darstellen, Sicherheitsmanahmen eingebaut und bricht
die Umwandlung mglichst vor dem Verlust

Lars Aschenbach - Batchprogrammierung - 06-03-04


Batch 67

ab. Sollte dennoch einmal eine so unglck- RECHNE 5 * 2


liche Konstellation zum Verlust der Variable RECHNE 1 : 4
RECHNE + 3
PATH fhren, so wird UPCASE.BAT dieses
RECHNE 6 -
wenigstens melden und seine Ttigkeit
einstellen.
Anhand des Rechenzeichens wird dann die
Ungefhrliche Testlufe kann man auch mit
Batchdatei PLUS.BAT, MINUS.BAT, MAL.BAT
UPTEST2.BAT fahren und lernt durch
oder GETEILT.BAT gestartet. Weil das
aufmerksame Beobachtung, wie UPCASE.BAT
allgemeinbliche Zeichen "/", um Zahlen zu
arbeitet:
teilen, unter DOS eine bestimmte Funktion
UPTEST2.BAT: inne hat, mute ich auf das Zeichen ":"
@echo off ausweichen. Kommen wir aber nun zu den
if not %0==%BDV%%BDY%uptest2 ntigen Batchdateien, hier RECHNE.BAT:
%BDV%%BDY%upcase.bat %1 . %BDV%%BDY%%0
%2 %3 %4 %5 %6 %7 %8 %9 : %PATH% @echo off
cls cls
echo. set z1=%1
echo Die Parameternamen stehen nicht immer genau set op=%2
ber dem Parameterinhalt! set z2=%3
echo. set g=goto
echo %%1 %%2 %%3 %%4 %%5 %%6 %%7 %%8 %%9 rem Volle Syntax angegeben?
echo %1 %2 %3 %4 %5 %6 %7 %8 %9 if not %3.==. %g% run
echo. rem Syntax unvollstndig, mit E soll
rem also weitergerechnet werden!
Den ersten Test sollte man durch die Eingabe rem Ist E leer, so wird E zur 0:
von: if %e%.==. set e=0
UPTEST2 Hallo! a b c d e f g h rem Entspricht E einem Wert von 0 bis
starten und bei jedem weiteren Test einen rem 10 ? Wenn ja, so kann mit E
Buchstaben weglassen. rem gerechnet werden.
if %e%==0 %g% w
if %e%==1 %g% w
KnowHow: Batching if %e%==2 %g% w
Das kleine Einmaleins fr DOS if %e%==3 %g% w
if %e%==4 %g% w
Ein Computer der nicht rechnen kann, drfte if %e%==5 %g% w
erst gar nicht Computer genannt werden. if %e%==6 %g% w
Dennoch schimpft man die PC's so, obwohl if %e%==7 %g% w
ihr Betriebssystem nicht in der Lage ist, if %e%==8 %g% w
if %e%==9 %g% w
Berechnungen durchzufhren. Dummesdos,
if %e%==10 %g% w
oder wie hie der Haushaltsreiniger noch rem E war kein Wert zwischen 0 und 10!
einmal? echo Mit dem Ergebnis %e% kann nicht
Aber DOS ist ja auch sehr flexibel und lernt echo weitergerechnet werden!!!
immer wieder dazu. So konnte ich es per rem Abbruch durch Sprung zu :off
Batchdateien testweise zu kleinen %g% off
rem E liegt zwischen 0 und 10
Berechnungen berreden. Weil ich die
:w
Ergebnisse spter in anderen Batchdateien rem Ist %1 ein Rechenzeichen, so soll
verwenden will und DOS auch nur ganze und rem E als erste Zahl gelten.
positive Zahlen verarbeiten kann, werden if %1==+ %g% 1
Negativergebnisse zu 0 und krumme Werte if %1==- %g% 1
einfach abgerundet. if %1==* %g% 1
if %1==: %g% 1
Den Beginn macht die Batchdatei
rem %1 war kein Rechenzeichen, folg-
RECHNE.BAT, mit der die Berechnung rem lich soll E als z2 gelten.
gestartet wird. Folgende Aufrufe sind z.B. set z2=%e%
denkbar: %g% run
:1
RECHNE 0 + 8 rem %1 war ein Rechenzeichen, deshalb
RECHNE 7 - 9 rem mssen die Werte neu definiert
rem werden.

Lars Aschenbach - Batchprogrammierung - 06-03-04


68 Batch

set z2=%2 Wenn E zur Berechnung herangezogen


set op=%1 werden soll, so mu DOS jetzt prfen, ob E
set z1=%e%
berhaupt einem der erlaubten Werte 0 bis
:run
rem Volle Syntax vorhanden, bzw. 10 entspricht. Im positiven Falle, geht DOS
rem hergestellt, die Berechnung kann zur Sprungmarke :w. Im negativen Falle wird
rem beginnen. eine entsprechende Meldung auf den Schirm
if %op%==+ plus %z1% %z2% gebracht und anschlieend komplett
if %op%==- minus %z1% %z2% abgebrochen.
if %op%==* mal %z1% %z2%
Gelangt DOS zur Sprungmarke :w, so mu
if %op%==: geteilt %z1% %z2%
:err es nun abklren, ob das letzte Ergebnis als
rem Syntax unbekannt oder fehlend: erste oder zweite Zahl in die Berechnung
echo Aufruf z.B. mit: einflieen soll. Dafr prft es den Parameter
echo RECHNE 5 + 7, o. RECHNE 1 - 8, o. %1 ab, ob dieser als Rechenzeichen definiert
echo RECHNE 2 * 0, o. RECHNE 9 : 3, o. wurde. Tritt dieser Fall ein, so verzweigt DOS
echo RECHNE 4 + , o. RECHNE 6 - usw.
nun zu der Sprungmarke :1, wo es die
echo Zahlen von 0 bis 10 sind erlaubt!
:off Variablen umdefiniert, das Ergebnis aus E
einbindet und damit wieder die volle und
Weil die eigentlichen Batchdateien, die die korrekte Syntax erreicht. Soll aber das
Berechnungen durchfhren zu umfangreich Ergebnis als zweite Zahl gelten, so mu nur
sind, hier ein Ausschnitt aus PLUS.BAT: die Variable Z2 mit dem Inhalt von E definiert
werden, damit die gestellte Aufgabe der
@echo off korrekten Syntax entspricht.
%g% %1%2 Letztendlich landet man aber bei der
:00 Sprungmarke :RUN, die die Variable OP prft
set e=0 und die entsprechende Batchdatei aufruft, die
%g% o
die Berechnung durchfhren soll. Ist OP z.B.
:01
:10 als + gesetzt, so wird PLUS.BAT inkl. beider
set e=1 Zahlen aufgerufen.
%g% o Besprechen wir also nun die Datei
.... PLUS.BAT, die beispielsweise die Zahlen 1
und 0 addieren soll:
:o Durch die Zeile %g% %1%2 wird aus den
echo %e%
beiden Zahlen 1 und 0 eine Sprungmarke
gebildet, nmlich :10, die durch den Befehl
Beschftigen wir uns nun zunchst mit
GOTO, der in der Variable %g% gespeichert
RECHNE.BAT:
ist, angesprungen wird. Die Variable E wird
Die bergebenen Parameter werden in
daraufhin mit dem Ergebnis 1 definiert.
Variablen gespeichert, wie auch der Befehl
Anschlieend wird mit %g% o zur Marke :o
GOTO, der somit in allen Batchdateien durch
gesprungen. Sie gibt nun das Ergebnis
%g% ausgefhrt wird.
mittels ECHO %E% auf dem Schirm raus.
Wird die volle Syntax eingehalten, also
Theoretisch ist damit die Berechnung
beide Zahlen und die Rechenart als
beendet, aber praktisch gesehen mu ich
Parameter bergeben, so ist %3 als Zahl
noch ein paar Erklrungen abgeben:
definiert. DOS springt deshalb zur Marke RUN
Bei etlichen Berechnungen entsteht oftmals
und fhrt dort fort. Ist aber %3 nicht
dasselbe Ergebnis. Daher wird zwar jede
definiert, so geht DOS davon aus, das das in
Sprungmarke angesprungen, die sich aus den
E gespeicherte Ergebnis, zur Neuberechnung
bergebenen Zahlen konstruiert, aber erst
herangezogen werden soll und arbeitet die
etliche Zeilen spter, wird das Ergebnis durch
nchste Zeile ab, in der die Variable E mit 0
SET E "errechnet". In Wirklichkeit wird ja nur
definiert wird, sofern E nicht definiert war.
das logische Ergebnis, welches ich
Dieser Fall kann theoretisch nur dann
vorprogrammiert habe, ermittelt und
auftreten, wenn man zum ersten mal etwas
ausgegeben.
berechnen lt und beim Aufruf eine Zahl
vergit, oder absichtlich weglt.

Lars Aschenbach - Batchprogrammierung - 06-03-04


Batch 69

Htte ich jeder Sprungmarke gleich die KnowHow: MS-DOS


entsprechende SET E-Anweisung
nachgestellt, so wre der Speicherbedarf um
Fehlverhalten des Befehles SET
ein vielfaches angestiegen! Zu dieser unter MS-DOS!
Erkenntnis, mit den oftmals gleichen Unter MS-DOS gibt es manchmal ein
Ergebnissen, kam ich aber auch erst relativ Problem, wenn man eine Variable mit SET
spt. Es bedurfte erst drei vorhergehenden setzen mochte. So erhlt man desofteren die
Versionen, die von anfangs 30KB Fehlermeldung das der "Umgebungsspeicher
Programmlnge auf nun 5KB voll!" ist. Da eine Batchdatei, die eine
zusammenschrumpften! Variable setzt, meist auf diese Variable
Wie und wofr man die Ergebnisse angewiesen ist, kann das katastrophale
weiterverarbeitet, berlasse ich nun Euch. Auswirkungen haben, wenn diese Variable
Auf jeden Fall kann man damit viele Routinen eben nicht existiert (Datenverlust o.a. je
gestalten, wenn man diese Dateien rekursiv nach Batchdatei)!!!
nutzbar macht. Normalerweise kann man dieses Problem
wie folgt beheben, mu aber mit der o.g.
Fehlermeldung leben, wenn das Environment
(der Umgebungsspeicher) voll ist:

SET O=P
IF %O%.==. GOTO OFF
rem
rem Rest der Routine
rem
:off

Eine Batchdatei mit diesen Zeilen bewahrt


den Anwender vor dem Datenverlust, weil sie
bei nicht vorhandener Variable O rechtzeitig
aussteigt!
Jede Batchdatei, die Variablen erzeugt,
sollte also immer prfen, ob die gerade
gesetzte Variable auch existiert und
gegebenenfalls rechtzeitig aussteigen.
Aber leider kann sich dieses Problem gerade
unter MS-DOS noch schlimmer auswirken:
Bei mir ist es schon desofteren
vorgekommen, das der Platz im Environment
nicht mehr fur die ganze Variable ausreichte.
So wollte ich z.B. eine Variable EV3 setzen,
die mit einer Zahlenkolonne wie:
0123456789012345678901234567 definiert
werden sollte. Wenn ich Gluck hatte, dann
wurde diese Variable wenigstens noch so
gesetzt:
EV3=0123456788901234

Dann kann ich wenigstens noch die EV3


wieder lschen, da sie nicht vollstandig
gesetzt wurde:

SET EV3=0123456789012345678901234567
IF NOT %EV3%.==0123456789012345678901234567.
SET EV3=
IF %EV3%.==. GOTO OFF

Lars Aschenbach - Batchprogrammierung - 06-03-04


70 Batch

@echo off
Aber im krassesten Fall hatte ich dann das rem
rem How to solve the problem with environmententries
folgende Abbild vom Environment:
without equal-sign or
rem with a full environment! (knowned at MS-DOS)
COMSPEC=C:\COMMAND.COM rem
PATH=C:\DOS;C:\BATCH rem C:\BATCH\TRYTOSET.BAT - this file
PROMPT=$P$G rem C:\BATCH\TTS2.BAT - made by
TEMP=F:\ C:\BATCH\TRYTOSET.BAT
OS=MS-DOS rem
VER=6.22 rem SYNTAX: TRYTOSET VARIABLE=DEFINITION
BDV=C: rem SYNTAX: CALL C:\BATCH\TRYTOSET.BAT
BDY=\BATCH\ VARIABLE=DEFINITION
LG=049 rem
MSG=2 rem written by: Lars Aschenbach, Germany
EV3 rem
if %1%2.==. goto err
Im Environment ist zwar die Zeichenfolge if %2.==. goto err
EV3 zu sehen, aber kein Gleichheitszeichen if %3.==@. goto next
und keine Definition mehr! Was ich auch if %COMSPEC%.==. goto err
echo @set %1=%2>c:\batch\tts2.bat
versuchte, ich konnte diese Zeichenfolge EV3
if not exist c:\batch\tts2.bat goto err
nicht mehr mit dem SET-Befehl lschen!!! echo @if %%%1%%.==. c:\batch\trytoset.bat %1 %2
Nur ber DEBUG gelang mir das lschen per @>>c:\batch\tts2.bat
Hand! if exist c:\batch\tts2.bat %COMSPEC% /c
Die meisten Batchprogrammierer wurden c:\batch\tts2.bat>nul
nun mit den Achseln zucken und sagen:"Na :next
if %0.==trytoset. if %3.==@. echo Can't set the variable
und? Mit dieser Variablen-Leiche kann ich
%1!
leben!". if %0.==TRYTOSET. if %3.==@. echo Can't set the
Aber ich kann es nicht, da ich auch variable %1!
Batchdateien habe, die das Environment if %3.==. set %1=%2
manipulieren (z.B. vollautomatisch die :err
Reihenfolge der Variablen umstellen if %1%2.==. echo The name and the definition of the
variable is missing!
knnen)!!!!
if %2.==. echo Definition of the variable is missing!
Sobald also so eine Variablen-Leiche im if %COMSPEC%.==. echo The variable COMSPEC is
Environment steckt, mssen meine Routinen missing!
die Waffen strecken und vorzeitig abbrechen if not %COMSPEC%.==. if not exist c:\batch\tts2.bat echo
- ich habe sie auch darauf getrimmt. Disk is full!
Ich habe wegen dieses, fur mich sehr if exist c:\batch\tts2.bat del c:\batch\tts2.bat
relevanten Problems, bereits mit Microsoft
und anderen Batchexperten kommuniziert - Weil das Problem international bekannt und
ohne Erfolg! MS denkt z.B. auch nicht daran, reproduzierbar ist, habe ich die Meldungen in
die fehlerhafte COMMAND.COM zu Englisch gehalten und will diese Losung auch
berarbeiten weil DOS fur sie (MS) tot ist!!! noch an einige bekannte Batchexperten
Ob dieses Problem unter PC-DOS, schicken!
NovellDOS oder auch PTS-DOS existiert, ist Will man nun z.B. im Direktmodus die
mir nicht bekannt! Auf jeden Fall gibt es Variable O anlegen und mit P definieren, so
unter 4DOS und auf meinem PoFo keine ruft man diese Batchdatei mit der Eingabe:
Variablenleichen, wie ich durch intensive TRYTOSET O=P auf.
Tests feststellte. In einer Batchdatei konnte TRYTOSET.BAT
Ich habe dennoch nicht die Flinte ins Korn so eingebunden werden, wenn nicht ein
geworfen und versucht dieses Problem in den Parameter als Variable oder Definition in
Griff zu bekommen - und tatschlich gibt es Frage kme (CLTST1.BAT):
eine Losung, die sogar die Fehlermeldung
@echo off
"Umgebungsspeicher voll!" nicht erscheinen
call c:\batch\trytoset.bat o=p
lat: if not %o%.==p. echo The environment must be full!
if %o%.==p. echo Well done!

Lars Aschenbach - Batchprogrammierung - 06-03-04


Batch 71

Und so lautet die Einbindung von


TRYTOSET.BAT, wenn der Parameter %1 als
Variablenname und der Parameter %2 als
Definition genutzt werden soll (CLTST2.BAT):

@echo off
call c:\batch\trytoset.bat %1 %2
set | find /i "%1=%2">nul
if errorlevel 1 echo The Environment must be full!
if not errorlevel 1 if errorlevel 0 echo Well done!

Aber selbst bei diesen Losungen tauchen


neue Probleme auf: Wird die Hilfsdatei
TTS2.BAT ein Null-Langen-File, also die
Diskette mu voll sein, so kann nicht
versucht werden die gewnschte Variable zu
setzen!
Ist das Programm FIND unauffindbar, weil
PATH leer oder inkorrekt, so wird
CLTST2.BAT fehlschlagen!
Dennoch ist TRYTOSET.BAT weitaus
sicherer als der SET-Befehl und wird daher
demnchst verstrkt in meinen Batchdateien
auftauchen. Die Verzeichnisse werden dann
auch durch die Variablen BDV und BDY
ersetzt worden sein.

Lars Aschenbach - Batchprogrammierung - 06-03-04


72 Stichwort

LW&DISK.BAT, 7 print, 24
(*.*), 8 prn, 36
@, 47 PROMPT$h$h, 47
@cls, 20 Ramdisk, 38
@DEL %1, 13 set, 33
@DIR %1, 13 SET OPATH, 39
@echo, 45 SET VAR, 42
ANSI.SYS, 28; 31 SHIFT, 20
ATTRIB-Befehl, 37 Steuerzeichen, 38
AUTOEXEC, 42 STRG+ALT+EINF, 31
AUTOEXEC.BAT, 44 Syntax, 8
batch, 49 SYSTEM, 38
BIOS, 29 Temporres Verzeichnis, 8
BUFFERS, 31 TIME, 22
CHKDSK, 22; 31 TYPE, 34
CHKDSK /F, 14 Umgebungsspeicher voll, 16
CHKDSK /V, 14 Unrecognized command, 31
CHKVAR, 28 Variable, 35; 41; 45
CHKVAR.BAT, 28 Wildcards, 12; 19
CLOCK$, 13
con, 33
CONFIG.SYS, 27; 31; 44
copy, 19; 21; 22; 42; 43
DATE, 22
defrag, 34
DEFRAG.BAT, 34
del, 11
DIR, 22
DISKFOLIO, 16
DVV.BAT, 35
DVV2.DAT, 35
ECHO, 9; 19
ECHO,, 22
errorlevel, 25
FILES, 31
FolioDrive, 16
FORMAT, 22
GW-BASIC, 38; 52
gwbasic.exe, 46
HELP, 22
HELP., 22
if exist, 32
INKEY$, 53
KEY LIST, 52
Klammeraffen, 22
LABEL, 31
message, 42
MS-DOS, 44
Multiprocessing, 39
nul, 13; 17; 21; 34; 36; 38; 40; 46
OPTIONVAR, 25
path, 39
PoFo, 8; 27

Lars Aschenbach - Batchprogrammierung - 06-03-04

Das könnte Ihnen auch gefallen