
  ---------------------------------------------------------------------------

   BATTIPS.TXT    -    Tips & Tricks zur Programmierung von Batchjobs

   Copyright (C) 10/1993-05/1997 bei Matthias Paul
                                     Ubierstr. 28
                                     D-50321 BRHL
                                     DEUTSCHLAND

   EMail          : <Matthias.Paul@post.rwth-aachen.de>

   Letzte nderung: 1997-05-01 -mp


  ---------------------------------------------------------------------------

   Ich bernehme keine Gewhr fr die Richtigkeit der Informationen.
   Jegliche Haftung fr Schden etc. ist ausgeschlossen. Hinweise auf
   Fehler sowie auf weitere Tips und Tricks sind immer willkommen.

   Bitte beachten Sie README.1ST fr weitere Bestimmungen.

   Fr weitere Hinweise siehe auch meine Dokumente NWDOS7UN.TXT,
   NWDOSTIP.TXT, DRDOS6UN.TXT, DRDOSTIP.TXT, MSDOSTIP.TXT u.a.

   Bezglich Updates meiner Tips & Tricks Dokumente sei auf die
   beiliegende Datei MPDOSTIP.TXT verwiesen, z.B.:

    URL: http://www.rhrz.uni-bonn.de/~uzs180/mpdokger.html
    URL: ftp://ftp.uni-stuttgart.de/...
                              ...pub/systems/msdos/utils/system/mpdostip.zip
              
   Eine andere umfangreiche Sammlung von Tips & Tricks zu Batchjobs
   (in englischer Sprache) hat Timo Salmi <ts@uwasa.fi> zusammengestellt:
   TSBATxx.ZIP und TSPOSTxx.ZIP. Obwohl vllig unabhngig voneinander
   entstanden, spiegeln sich in seiner Sammlung viele Problemlsungen
   wieder, die hier sehr hnlich beschrieben sind. Daher passen beide
   Editionen sehr gut zueinander, wobei ich meine Batchtricks als Ver-
   allgemeinerung seiner Tricks ansehen wrde, da *hier* auch auf andere
   Kommandoprozessoren als (nur) MS-DOS COMMAND.COM sowie auf Versions-
   unterschiede und Probleme bei der Internationalisierung ausfhrlich
   eingegangen wird. Abgesehen von dieser Schwche ist seine Sammlung
   sehr zu empfehlen!
   Viele Beispiele aus Timo Salmis Sammlung lassen sich mit den hier
   dargebotenen Informationen noch weiter verbessern und generalisieren.
   Timo Salmis Sammlung ist weltweit an vielen unterschiedlichen Stellen
   zu finden, u.a. auf:

    URL: http://garbo.uwasa.fi/pc/ts.html
    URL: ftp://garbo.uwase.fi/pc/pd2/

                                                                             
  ---------------------------------------------------------------------------

   berblick:

    1. Allgemeine Tips fr Batchjobs
    2. Unerwnschter Zeilenvorschub nach Batchjobs
    3. Debuggen von Batchjobs
    4. Lange Umgebungsvariablen und lange Kommandozeilen
    5. UpCase in Batchjobs
    6. Batchprozessor-Bug umgehen
    7. ERRORLEVEL abfragen
    8. Probleme mit Verzeichnisabfragen in Netzwerken
    9. FOR und die %%x Variablen
   10. SET und Umleitung

   Weitere Tips:

   - Sicheres Erkennung eines Novell DOS Kernels mit Batchsprache:
     siehe NWDOSTIP.TXT (MEM.BAT) und MSDOSTIP.TXT

   - Probleme mit Sharing-Violations in Verbindung mit CALL und Umleitungen:
     siehe MSDOSTIP.TXT und NWDOSTIP.TXT (MEM.BAT).

   - Ermittlung des aktuellen SwitChars:
     siehe NWDOSTIP.TXT (SWC.BAT und MEM.BAT)

                                                                             
  ---------------------------------------------------------------------------

   1. Allgemeine Tips fr Batchjobs: [96-11-29]
   ============================================

    In diesem ersten Abschnitt mchte ich ein paar generelle Tips fr das
    Programmieren von Batchjobs geben. Die Tips sollen helfen, versions-
    und herstellerabhngige Unterschiede zwischen den Kommandoprozessoren
    auszubgeln, weil ich festgestellt habe, da die meisten Programmierer
    ihre Batchjobs nur mit ihrem eigenen Kommandoprozessor testen. Da die
    Batchsprache (gegenber blichen Programmiersprachen) enorm viele un-
    ausgesprochene Implikationen besitzt, die spartanischen Mglichkeiten
    auf der anderen Seite aber permanent zu tiefen Griffen in die Trickkiste
    zwingen, kommt es hufig vor, da ein Programmierer bestimmte Details
    bersehen hat, die z.B. nur bei relativen Pfadangaben, nur mit Netz-
    laufwerken, nur bei Umleitungen, nur bei verschachtelten Batchjobs,
    nur mit sehr langen Zeilen, nur in anderssprachlichen Regionen oder
    bestimmten Lndern, nur unter bestimmten Kommandoprozessorversionen,
    nur unter Multitaskern, nur in temporren oder sekundren Shells etc.
    auftreten (diese Liste liee sich beliebig fortsetzen), sonst aber
    normal arbeiten.

    Trotzdem ist die Batchsprache fr viele Verwaltungs-, Organisations-
    und Konfigurationsaufgaben (auch im Netzwerk) eine ideale Basis, denn
    als gemeinsamer Nenner existiert ein implementationsunabhngiger
    Sprachstandard ber alle DOS-Kommandoprozessoren, der im Vergleich
    zu anderen 'hheren' Programmiersprachen bezglich des Datei- und
    Applikations-Handlings und der Systemkonfiguration eine sehr viel
    hhere Abstraktionsebene bietet.
    Auerdem bieten (fast) nur Batchjobs die Mglichkeit, sich selbst zur
    Laufzeit 'umzuprogrammieren' (natrlich bringt das Interpreter-Prinzip
    auch eine ganze Reihe Probleme mit sich).
    Problematisch ist lediglich, da die eingeschrnkten Mglichkeiten zur
    Fallunterscheidung einen zu aberwitzigen Konstruktionen zwingen, die
    eben wiederum viele Seiteneffekte auslsen knnen.

    Es ist unmglich, an dieser Stelle auch nur ansatzweise *alles* zu be-
    schreiben, was dazu notwendig ist, *alle* mglichen Fehlerzustnde bei
    der Programmierung von Batchjobs zu umgehen. Obwohl die Programmierung
    von trickreichen Batchjobs seit vielen Jahren eines meiner Steckenpferde
    ist (eine moderne Form des 'Schachspiels', bei dem man immer um drei
    Ecken denken mu...;-) ), unterlaufen auch mir immer wieder Fehler...
    Fr Begrndungen, warum dies oder das so, wie hier beschrieben pro-
    grammiert werden sollte, sei auf die anderen Dokumente (besonders
    NWDOSTIP.TXT, MSDOSTIP.TXT und 4DOS5TIP.TXT) verwiesen. Am besten,
    Sie behalten immer eine Reihe Bootdisketten mit alten DOS-Versionen
    und alternativen Kommandoprozessoren in Reichweite, um Ihren Batchjob
    vor einer Verffentlichung unter anderen Randbedingungen durchzuchecken.

     Halten Sie bestimmte Konventionen ein, z.B. meine Empfehlung:

      - Alle internen Befehle und externe DOS-Kommandos in Groschrift
        (GOTO x)
      - Alle Pfadangaben und Dateispezifikationen in Kleinschrift (c:\dos)
      - Eigene Umgebungsvariablen in Kleinschrift (%dummy%)
      - System-Umgebungsvariablen, Pseudo-Variablen und -Funktionen und
        System-Konstanten in Gro-/Kleinschrift (%CmdLine%, %_Date%)
      - Label in Kleinschrift mit '_' als Trenner. Alle Labels maximal acht
        Zeichen. ( :label_1 )
      - Token (als Parameter) beginnen und enden jeweils mit "_" als Sonder-
        zeichen, um sie von blichen Eingaben zu unterscheiden (_mode1_).
      - Benutzen Sie bestimmte Konventionen fr Dateinamen, z.B. Temporr-
        dateien in %tmp% und namentlich mglichst dem Batchjob hnlich (z.B.
        nur andere Dateiendung als der Batchjob, der sie verwendet). Fr
        Zwischendaten mglichst die .$$$-Endung und fr Semaphor-Dateien
        .SEM verwenden.
      - Gleiches gilt fr Umgebungsvariablen. 'Lokale' Variablen sollten
        dem Batchjob hnlich heien, damit es keine Wechselwirkung mit
        anderen Variablen anderer Batchjobs gibt.
      - berlegen Sie sich genau, ob es sinnvoll ist, bestimmte systemweit
        benutzte Variablen am Ende jedes Batchjobs zu lschen, auf die alten
        Werte zurckzusetzen oder bestehen zu lassen. Je nach Verwendung der
        Variable ist das eine oder andere sinnvoll, mu dann aber ber das
        ganze System durchgezogen werden. blicherweise werden 'lokale'
        Variablen gelscht, globale jedoch nicht angetastet.

     Pfadwerte in Umgebungsvariablen sollten niemals mit "\" aufhren,
      es sei denn, dies wird ausdrcklich fr eine Zweck bentigt (z.B.
      Root eines Laufwerks). Viele Programme (und vor allem ltere DOS-
      Versionen), die Variablen auswerten wollen, kommen nicht mit dem
      Backslash am Schlu zurecht. Bsp.:

       SET tmp=c:\tmp
       IF NOT EXIST %tmp%\nul MD %tmp%

      Auerdem behalten Sie auf diese Weise bei Referenzen auf diese
      Variablen die Auswahl zwischen "%tmp%" oder "%tmp%\" etc.

     Wenn Sie relative Pfade verwenden, referenzieren Sie mglichst ber
      Variablen, Substitut-Laufwerke oder kombinieren Sie beide Mglich-
      keiten. Auf diese Weise bleibt Ihr Batchjob (und auch Ihre Programm-
      konfiguration) leicht wartbar.

      Manchmal meinen Installationsprogramme besonders 'schlau' zu sein,
      und lassen keine relativen Pfadangaben oder die Installation in ein
      Wurzelverzeichnis zu (z.B. manche Utilities der PC Tools); in diesem
      Fall hilft meist ein Trick, indem man vom aktuellen Verzeichnis aus
      erst eine Verzeichnisebene zurck geht, um dann wieder in das aktuelle
      Verzeichnis zu wechseln:

       Aktuelles Verzeichnis sei: c:\dummy\inst_dir\
       Schreiben Sie trotzdem   : ..\inst_dir\

      oder auch

       Aktuelles Verzeichnis sei: c:\
       Schreiben Sie            : c:\dummy\..\  (Verzeichnis mu existieren)

     Die meines Erachtens nach sicherste Methode, ein Temporrlaufwerk ein-
      zurichten, bietet sich mit der Verwendung der Variablen %Temp% und
      %tmp% an, die auf ein Substitut-Laufwerk zeigen. Bsp.:

       IF ""=="%tmp%" SET tmp=%Temp%
       IF ""=="%tmp%" SET tmp=c:\tmp
       c:
       SUBST z: /d
       SUBST z: %tmp%
       SET Temp=z:\.
       SET tmp=%Temp%

      Sie knnen nun ber %tmp%\, %Temp%\ oder "z:", "z:.", "z:\", "z:.\"
      oder "z:\.\" auf dieses Laufwerk zugreifen, wobei die Unterschiede
      dadurch im Fall eines Temporrlaufwerkes fast unerheblich werden.
      Sollte %tmp% einmal nicht definiert sein, ist das auch nicht weiter
      tragisch, die Datei wird dann einfach im aktuellen Verzeichnis an-
      gelegt:

      %tmp%\tempfile.$$$

     Vermeiden Sie Zeilen, die in irgendeiner Phase ihrer Bearbeitung
      (vor, whrend oder nach der Expandierung) lnger als 120 Zeichen
      werden (auer in Abschnitten, die *sicher* nur von 4DOS/NDOS durch-
      laufen werden).

     Benutzen Sie die Zeichen ">", "<" und "|" nur fr Umleitungszwecke,
      auch wenn manche Kommandoprozessoren (etwa DR DOS 6.0, Novell DOS 7,
      Caldera OpenDOS COMMAND.COM) sie auch in anderen Fllen akzeptieren.
      Gleiches gilt fr andere Erweiterungen, wie z.B. Novells
      "IF ... AND ..." oder 4DOS' "IF ... .AND. ...".
      Schreiben Sie solche Formulierungen mglichst um:
      "IF ... IF ...".
      Wenn Sie unbedingt die obigen Zeichen verwenden *mssen*, setzen Sie
      sie in doppelte Anfhrungszeichen (falls das mglich ist), etwa bei
      Formulierungen wie:

       DIR *.* | FIND "<DIR>"
       ECHO "Bitte drcken Sie die <ESC>-Taste!"

      Dies ist (zumindest unter Novell DOS und Caldera OpenDOS COMMAND.COM
      getestet) auch an anderen Stellen mglich, allerdings werden die '"'-
      Zeichen nicht verschluckt, was die Auswertung etwas erschwert.

     Verwenden Sie in IF-Vergleichen (von Ausnahmen abgesehen, wo Sie
      numerische Werte in Relation setzen mssen) auf beiden Seiten des
      Vergleichs doppelte Anfhrungszeichen. Damit knnen direkt mehrere
      mgliche implizite Probleme ausgerumt werden, die manchmal auftreten.

      Manchmal, insbesondere unter 4DOS, mu man die Anfhrungszeichen
      weglassen, hier sollte man gegebenenfalls vorher auf 4DOS abtesten.
      Problematisch an numerischen Werten ist der Dezimaltrenner, der sich
      je nach Landeseinstellungen unterscheidet und z.B. ab 4DOS 5.5/5.51?
      groe Probleme bei internationalen Batchjobs aufwirft, wenn Sie eine
      Variable mit einer Konstanten vergleichen wollen.

     Schreiben Sie in IF-Vergleichen "wert"=="%variable%" statt
      "%variable%"=="wert", auch wenn "wert" leer ist, d.h "".
      berlegen Sie, ob es sinnvoll ist, die Bedingung zu invertieren, um
      die Konsistenz der Logik aufrechtzuerhalten, wenn die Zeile bei der
      Variablenexpansion zu lang werden sollte (Hintergrund siehe an anderer
      Stelle in dieser Datei).

      Achtung: Die saubere Invertierung ist ein vorangestelltes NOT, nicht
      eine genderte Logik, die auf anderem Weg die gegenteilige Bedingung
      auswertet.
      Einige Leser werden mich jetzt fr verrckt erklren, aber die Praxis
      zeigt, da tatschlich ein impliziter Unterschied (kein Bug, sondern
      eine Designschwche) besteht! ;-)
      Ich sage nur: Vergleiche/Relationen von Fliekommazahlen unter alten
      und neuen 4DOS-Versionen (vor/nach 5.5) in anderen Lndern als den
      USA (ein exaktes Beispiel wrde einige Seiten Erklrungen bentigen,
      die ich mir hier sparen mchte...).

     Falls auf beiden Seiten eines Vergleichs Variablen stehen, sollten
      Sie die Variable mit den voraussichtlich lngeren Werten nach hinten
      setzen.

     Vermeiden Sie "ECHO." und "@"-Zeichen vor einem Befehl, wenn der
      Batchjob mit DOS COMMAND.COM vor 3.3 laufen soll. Falls Sie "@"
      verwenden, mu es in der ersten Spalte stehen, auch wenn danach
      evtl. noch weitere Leerfelder folgen.

     Fr "ECHO." knnen Sie auch "ECHO _" schreiben, wobei _ *hier* ein
      Platzhalter fr das unsichtbare Sperr-Leerfeld ASCII-255 ist
      (Eingabe per <Alt>-NumPad oder - bei K3, K3PLUS oder FreeKEYB - auch
      mit <Alt>+<Ctrl>+<Space>). Achtung:
      Manche schlechteren Editore (etwa der interne Editor des NC)
      ersetzen ein in einer Datei vorhandenes ASCII-255 stillschweigend
      durch ein normales Leerfeld, und Sie wundern sich spter ber
      seltsame Resultate.
      Und noch etwas: Wenn Sie unter MS-DOS/PC-DOS COMMAND.COM einen Text
      mit ECHO ausgeben wollen, achten Sie darauf, da die reservierten
      Worte "on" und "off" nicht das erste Wort in diesem Text sind, sonst
      interpretiert COMMAND.COM dies nicht als Text...
      (Novell DOS und Caldera OpenDOS COMMAND.COM sowie 4DOS kennen dieses
      Problem nicht.)

     Lassen Sie - von Ausnahmen abgesehen - die Dateiendung von ausfhr-
      baren Dateien (.EXE, .COM, .BAT, .BTM) weg. Eine solche Ausnahme ist
      z.B. die Verwendung von Batchjobs als 'Dispatcher' (Programmver-
      zweiger), um die %Path% Anweisung kurz zu halten. In solchen Wrappern
      mssen Sie meistens die Dateiendung und/oder den kompletten Pfad mit
      angeben, um eine Rekursion zu vermeiden. Wenn auch noch MS-DOS vor 4.0
      untersttzt werden soll, *drfen* Sie - zumindest bei blichen Pro-
      grammaufrufen in Batchjobs - keine Dateispezifikation angeben.

     Lassen Sie aus den gleichen Grnden mglichst auch die Pfadspezifi-
      kation zu solchen ausfhrbaren Dateien weg und verwenden Sie statt-
      dessen indirekte Referenzen ber %Path% oder aufrufende Batchjobs,
      die z.B. im C:\BAT Verzeichnis liegen (welches natrlich in %Path%
      aufgenommen wurde).

     Wenn Ihr Batchjob nicht mit DOS vor 3.3 arbeiten mu, stellen Sie
      allen externen Befehlen ein @CALL voran. Damit ermglichen Sie es,
      da diese externen Befehle auch (indirekt) ber Batchjobs aufrufbar
      werden, ohne da in diesem Fall spter die Logik Ihres Batchjobs
      durcheinander kommt. Mit anderen Worten: Nach der Bearbeitung kommen
      Sie wieder in den aktuellen Batchjob zurck - wenn Sie nicht irgendwo
      anders ein CALL vergessen haben. Solange Sie nur .EXE oder .COM
      Programme aufrufen, fllt der Unterschied nicht auf, daher wird
      dieser Fallstrick hufig bersehen. Vorbeugung ist hier die beste
      Devise. Denn Sie werden spter nicht so leicht darauf kommen, warum
      auf einmal ein Batchjob nicht mehr richtig arbeitet, obwohl Sie ihn
      gar nicht gendert haben.

     "@CALL" ist aber auch nicht unproblematisch:
      Der seit DOS 3.3 vorhandene Befehl CALL besitzt eine ganze Reihe ver-
      steckter Fallstricke. In Problemfllen (mit Umleitung, mit SHARE oder
      bei lterem DOS) schreiben Sie stattdessen %ComSpec% /C. Dabei mu
      man aber beachten, da dies keine 1:1-Umsetzung ist, sondern ein
      Workaround mit einer Reihe Seiteneffekten: Beim Aufruf eines neuen
      temporren Kommandoprozessors bleiben die Umgebungsvariablen,
      die innerhalb dieser Kopie definiert oder verndert wurden, auch
      nur fr die Laufzeit dieser Shell gltig, danach gelten wieder die
      alten Werte. 'Globale' Einstellungen mssen also vorher auf 'unterer'
      Ebene vorgenommen werden.
      Hufig benutzt man CALL, um wieder an die alte Stelle zurckzukommen,
      und lt das CALL weg, wenn man diese Kette der Rekursionen beenden
      mchte. Verwendet man stattdessen %ComSpec%, so ist die Mglichkeit,
      die Rekursion mit einem Sprung in eine andere Datei ohne CALL bzw.
      %ComSpec% zu durchbrechen, nicht gegeben. Nach der Beendigung des
      Jobs wird in jedem Fall wieder in den alten Job zurckverzweigt, auch
      wenn man auf hherer Ebene die Kette durch weggelassene CALLs unter-
      brochen hat. Die einzige Lsung, dieses Problem (wenn es denn eines
      ist, manchmal ist dies auch genau das Verhalten, was sich viele von
      CALL wnschen) zu lsen, besteht darin, da der aufgerufene Job eine
      spezielle Datei erzeugt, und der Aufrufer nach der Rckkehr anhand
      der Existenz dieser Datei ber die weitere Bearbeitung entscheidet
      (ein ausgetfteltes Beispiel fr diese Technik war mein Batchjob
      COMBINE.BAT aus Ralf Browns Interruptliste INTER50-INTER51, in-
      zwischen durch eine .COM-Version ersetzt. Die Batchfassung ist aber
      nach wie vor ber meine Web-Seite zu beziehen.).

     Wenn Sie COMMAND.COM aufrufen, spezifizieren Sie diesen ber die
      Variable %ComSpec%. Ausnahme: Sie wollen einen ganz bestimmten
      Kommandoprozessor aufrufen, der nicht unbedingt mit dem Kommando-
      prozessor bereinstimmt, der gerade geladen ist.

     Und was ist mit CALL und LOADHIGH respektive seiner Aliase? Mu man
      CALL LH oder LH CALL schreiben? Beides funktioniert (bei Novell DOS,
      Caldera OpenDOS und 4DOS), ich empfehle CALL LH, weil das sinnflliger
      scheint.

     Wenn Sie einen Batchjob schreiben, der sich rekursiv selbst aufruft,
      schreiben Sie statt dem 'eigenen' Dateinamen das Token %0. Damit
      funktioniert der Batchjob auch noch, wenn Sie die Datei umbenennen.
      Der Token %0 enthlt den Anfang der Aufrufzeile (abzglich der
      Parameter) in der Form, wie er geschrieben wurde. D.h., da %0 auch
      relative oder absolute Pfadspezifikationen enthalten kann und da die
      Dateiendung optional ist. Achtung: %0 enthlt leider nicht einheit-
      lich, sondern abhngig vom jeweiligen Kommandoprozessor, den Datei-
      namen in Gro- oder Kleinbuchstaben. Damit fllt also die Mglichkeit
      weg, unter Zuhilfenahme von %0 den eigenen Dateinamen auf Korrektheit
      zu berprfen, oder %0 in COPY oder REN Befehlen, die die Batchdatei
      selbst referenzieren, zu verwenden.

     Eine weitere Besonderheit in der Behandlung der Variablen %0..%9
      offenbart sich, wenn man den ersten (mit SwitChar abgetrennten)
      Parameter ohne Leerfeld direkt hinter den Namen des Batchjobs setzt.
      In diesem Fall wird %0 direkt vor dem SwitChar abgetrennt und %1
      enthlt den ersten Parameter inklusive des SwitChars. Bei den anderen
      Parametern %1..%9 tritt diese automatische Trennung nicht in Kraft,
      d.h. die Parameter werden als eine Zeichenkette behandelt. Daran ndert
      sich auch nichts, wenn man SHIFT einsetzt.
      (Getestet mit Novell DOS 7 COMMAND.COM und 4DOS 5.52.)

     Schreiben Sie alle Befehle, die auf keinen Fall via DOSKEY rede-
      finiert werden drfen, nicht in die erste Zeile, sondern platzieren
      z.B. ein Leerfeld davor. Ein einem Befehl vorangestelltes '@'-Zeichen
      mu trotzdem in der ersten Spalte stehen bleiben, sonst wird es z.B.
      von Novells COMMAND.COM nicht akzeptiert. Nach dem '@' knnen
      Leerzeichen folgen.

     FOR-Schleifen knnen nur bei 4DOS/NDOS ineinander verschachtelt
      werden, nicht bei MS-DOS, PC-DOS, DR DOS oder Novell DOS COMMAND.COM.
      Innerhalb der Parameterliste von "IN (liste)" mssen Sie darauf
      achten, da zwar prinzipiell beliebige Zeichenketten (nicht nur
      Dateinamen) erlaubt sind, aber da die Zeichen '?' und '*' immer als
      Wildcards interpretiert werden und da die Ersetzung von Umgebungs-
      variablen, etwa wie

       FOR %%x IN (%switch%h %switch%H) DO ECHO Hilfeschirm: %%x

      innerhalb dieser Liste nicht bei jedem Kommandoprozessor sauber
      funktioniert (z.B. nicht bei 4DOS). Abhilfe besteht nur durch
      'Herausziehen' der Umgebungsvariablen aus der "IN ()"-Aufzhlung
      und 'Abfangen' der Wildcards *vor* solchen FOR-Anweisungen, die
      eigentlich nur Parameter auswerten sollen.

     Bei Umleitungen auf Gerte sollten Sie vorsichtshalber immer \DEV\
      mit angeben, damit der Job auch noch mit MS-DOS 2.xx zusammenarbeitet.
      Ein Verzeichnis \DEV\ mu dafr nicht existieren! Z.B. "\dev\nul".
      Wenn Sie Fehlermeldungen, die bei SET-Befehlen entstehen knnen,
      unterdrcken wollen, knnen Sie diese auf \dev\nul umleiten. Beachten
      Sie aber, da das '>' unmittelbar nach der Wertangabe folgt (ohne
      Leerfelder), sonst interpretieren einige COMMAND.COM Prozessoren
      (z.B. MS-DOS 6.xx+) diese Leerfelder als gewnschten Inhalt der SET-
      Variablen (wodurch andererseits natrlich auch eine Mglichkeit
      besteht, abschlieende Leerfelder in eine Umgebungsvariable zu
      bekommen). Namen von Blockgertetreibern knnen brigens optional
      mit einem Doppelpunkt abschlieen.

     Vermeiden Sie mglichst landessprachliche Extras, wie spezielle
      Tasten oder bestimmte Schlsselworte. Wenn keine spezielle Behandlung
      fr alle mglichen Sprachen eingebaut wird, kann es vorkommen, da der
      Batchjob in einem fremden Land pltzlich nicht mehr arbeitet, obwohl
      nichts gendert wurde.

     Vermeiden Sie es - solange wie mglich -, da ein Batchjob in andere
      Jobs verzweigen mu. Neben den oben schon angesprochenen Problemen mit
      CALL etc. und der Mglichkeit, da der Job seine Hilfsdateien nicht
      findet, gibt es noch ein weiteres Problem unter Multitaskern: Hufig
      erzeugen Batchjobs temporre Batchjobs, in die sie dann verzweigen.
      Angenommen, unter einem Multitasker (wie MS Windows oder Novell DOS
      TASKMGR) wird der gleiche temporre Batchjob von mehreren Tasks
      gleichzeitig erzeugt, modifiziert, oder wieder gelscht, kommt es zur
      gegenseitigen Beeinflussung zwischen den Tasks. In den meisten Fllen
      wird wenigstens einer der Batchjobs abgebrochen. Ausnahme von dieser
      Regel sind lediglich Unterprogramm-Jobs, die speziell diese Proble-
      matik auf Ihrem System mit einbeziehen. Nachteilig an solchen
      'externen' Bibliotheken ist, da es viel schwieriger ist, den
      Batchjob weiterzugeben.
      Eine generelle 100%ige Abhilfe ist - soweit ich mir das bisher ber-
      legt habe - nicht mglich, da die Batchsprache keine sog. atomaren
      Operationen (mutual exclusion) dafr bietet.
      Aber es gibt ein paar Tips, die diese Deadlock-Situationen wenigstens
      sehr unwahrscheinlich und die kritischen Phasen zeitlich sehr kurz
      machen (wahrscheinlich werden die folgenden Tips den meisten Lesern
      etwas seltsam vorkommen, wer sich aber mit der Problematik schon mal
      auseinandergesetzt hat, wird hoffentlich den Sinn dahinter entdecken):

      - Verzweigen Sie nach Mglichkeit rekursiv auf sich selbst (ber
        Token), statt in andere Hilfsjobs.

      - Benutzen Sie fr Manipulationen - wo mglich - Umgebungsvariablen
        statt externer Dateien, denn die sind blicherweise lokal fr jeden
        Task.

      - Benutzen Sie Umleitungen auf Dateien nur, wenn es nicht anders geht.

      - Wenn Sie Umleitungen benutzen, arbeiten Sie mglichst mit implizit
        benannten temporren Dateien, nicht mit expliziter Namensnennung.
        D.h. benutzen Sie nach Mglichkeit Pipes (auch mehrfach ver-
        schachtelt), statt einen Dateinamen fr eine Umleitung zu
        spezifizieren. Solche implizit benannten Dateien zu verwalten,
        ist Sache des Betriebssystems und nicht des Programmierers, daher
        wird ein Multitasker auch Vorkehrungen getroffen haben, diese
        Dateien voneinander zu unterscheiden. (Wenn nicht, dann ist Ihr
        Multitasker nicht sehr fortschrittlich.)

      - Arbeiten Sie mit speziellen Semaphoren zur 'mglichen Proze-
        kommunikation' zwischen mehreren Instanzen des gleichen Batchjobs.
        Dazu sind auf Batch-Ebene normalerweise nur Existenzabfragen von
        Dateien mglich. Semaphoren zwischen unterschiedlichen Batchjobs
        sind nur dann noch durchschaubar, wenn man das gesamte System
        einem festen Standard unterworfen hat.

                                                                             
  ---------------------------------------------------------------------------

   2. Unerwnschter Zeilenvorschub nach Batchjobs: [96-10-16]
   ==========================================================

    In der Bearbeitung von Batchjobs gibt es einen kleinen, aber rgerlichen
    Schnheitsfehler (aufgefallen bei MS-DOS 5.0 und 6.xx):

    Am Ende der Bearbeitung wird der Prompt mehrfach hintereinander dar-
    gestellt (besonders bei AUTOEXEC.BAT zu beobachten).

    Der Rechner verhlt sich so, als ob man whrend der Abarbeitung des Jobs
    ein paar Mal <Return> gedrckt htte. Wieso dieser Fehler auftritt, ist
    letztendlich nicht immer ganz klar, denn ein sauber arbeitender Batch-
    prozessor drfte sich davon eigentlich nicht irritieren lassen. Soweit
    ich mich erinnern kann, trat dieser Effekt bei den alten MS-DOS 3.x
    Versionen auch noch nicht auf.

    Batchjobs stellen ja im Prinzip so etwas wie 'Eingaben fr die Konsole'
    dar, die stattdessen zeilenweise aus einer Datei kommen. Wenn man nun
    in der Batchdatei eine leere Zeile einfgt, so sollte sie trotzdem
    einfach berlesen werden. Stattdessen wird auch diese Zeile ausgefhrt
    und bewirkt eine Leerzeile. Offiziell und dennoch nahezu undokumentiert
    erzeugt man Leerzeilen in Batchjob mit dem ECHO-Befehl:
    ECHO. (ohne Leerfeld).

    Sehr hufig sind in Batchjobs nach dem letzten Batch-Befehl eine Reihe
    Leerzeilen angehngt, ber die man sich normalerweise keine Gedanken
    macht. Diese Leerzeilen fhren zu dem oben beschriebenen Schnheits-
    fehler. Abhilfe besteht nun darin, diese Leerzeilen zu lschen (mit
    Backspace von der letzten erreichbaren Zeile aus). Wichtig dabei ist,
    da man den Zeilenvorschub des letzten Befehls auch noch lscht, so
    da man den Cursor im Editor nicht unter die letzte Batchzeile bewegen
    kann.
    In fast allen Fllen werden danach die Probleme beseitigt sein. Bei
    MS-DOS gibt es (im Gegensatz zu DR DOS) jedoch noch weitere Verursacher
    fr dieses Phnomen, die nicht mehr so einleuchtend sind:
    Bei ECHO=off (nahezu immer in Batchjobs) verhlt sich der REM-Befehl
    recht merkwrdig (er schickt anscheinend manchmal <Return>-Sequenzen
    in den Tastaturpuffer, die dann am Ende der Bearbeitung des Batchjobs
    abgespult werden. Abhilfe schafft man dadurch, da man vor das REM den
    Klammeraffen stellt: @REM.

    Manchmal hilft es, wie zu alten DOS- und CP/M-Zeiten an das Ende des
    Batchjobs ein EOF (Dateiende-Zeichen, ASCII-26) anzuhngen. Die meisten
    modernen Editore fgen dieses Zeichen allerdings nur noch optional oder
    auf besondere Aufforderung an (je nach Editor z.B. mit <Ctrl>+<z>).

    Wenn man auf solche Kleinigkeiten (auf der letzten ausgegebenen Bild-
    schirmseite) achtet, kann man den Schnheitsfehler vermeiden.

                                                                             
  ---------------------------------------------------------------------------

   3. Debuggen von Batchjobs:
   ==========================

    Die erste Zeile eines Batchjobs heit fast immer "@ECHO off".
    Stattdessen schlage ich die folgenden Zeilen als generellen Ersatz vor,
    die manchmal die Arbeit und Fehlersuche stark erleichtern knnen, wenn
    erst einmal alle Jobs diese Einleitung haben:

     @ECHO off > \dev\nul
     ECHO off > \dev\nul
     IF ""=="%batdbg%" SET batdbg=off
     ECHO %batdbg%

    Dann kann man spter global mit "SET batdbg=on/off" zwischen dem Normal-
    und einem Debug-Modus umschalten. Enthlt %batdbg% einen anderen Wert
    als "on" oder "off", so wird dies als Statuszeile ausgegeben. Diese
    Mglichkeit kann man zur Ausgabe von Debug-Infos benutzen.

                                                                             
  ---------------------------------------------------------------------------

   4. Lange Umgebungsvariablen und lange Kommandozeilen: [96-10-16]
   ================================================================

    COMMAND.COM bearbeitet eine maximale Zeilenlnge von ca. 120 Zeichen
    (je nach DOS-Version). Das fhrt besonders in Batchjobs zu groen
    Problemen, weil man hufig in die Nhe dieser maximalen Lnge kommt.
    Wenn der Befehl dann bei der Bearbeitung hinten abgeschnitten wird,
    fhrt das i. allg. zu einer Fehlfunktion und unschnen Bildschirm-
    meldungen.

    Hufig will man z.B. abtesten, ob eine Umgebungsvariable belegt ist.

    Ein sicherlich nicht sinnvolles, aber einsichtiges Beispiel:

     IF NOT "%Path%"=="" ECHO Path ist bereits belegt, wird nun neu belegt!
     PATH c:\bat;c:\dos;c:\utl\batchutl;c:\utl\div

    Wenn PATH nun bereits vorher einen sehr langen Inhalt hatte, wird nun
    die Zeile hinten abgeschnitten, und im gnstigsten Fall wird nur ein
    Teil des ECHOs ausgegeben.
    Es kann aber auch vorkommen, da der Befehl (hier einfach ECHO) selbst
    durchschnitten wird, dann kommt es zu einem Syntaxfehler.
    U.U. ist es nun mglich, die Zeilenlnge zu verkrzen, evtl. mu man
    dabei allerdings in umgekehrter Logik und mit Sprunglabeln arbeiten:

     IF "%Path%"=="" GOTO pfad_leer
     ECHO Path ist bereits belegt, wird nun neu belegt!
     :pfad_leer
     PATH c:\bat;c:\dos;c:\utl\batchutl;c:\utl\div

    Nun ist es schon wahrscheinlicher, da die richtige Funktion ausgefhrt
    wird. Prinzipiell kann man aber ber dieses GOTO-Prinzip dafr sorgen,
    da evtl. aufgrund eines berlnge-Syntaxfehlers trotz positiv erfllter
    Bedingung nicht erfolgende GOTOs, trotzdem der richtige Fall abgear-
    beitet wird. Allerdings kann immer noch ein Syntaxfehler auftreten und
    damit zusammenhngend eine irritierende Meldung erscheinen.
    Es gibt aber auch dafr eine Lsung (Bedingung texuell drehen!!!),
    die das Risiko eines Syntaxfehlers zu Null werden lt:

     IF ""=="%Path%" GOTO pfad_leer
     ECHO Path ist bereits belegt, wird nun neu belegt!
     :pfad_leer
     PATH c:\bat;c:\dos;c:\utl\batchutl;c:\utl\div

    Wenn die Zeile zu lang wird, so wird sie irgendwo abgeschnitten,
    dies hatte bisher eine Fehlermeldung zur Folge gehabt.
    Hier kann nun keine Fehlermeldung mehr auftreten, denn die Bedingung
    wird von COMMAND.COM rein textuell und nicht logisch ausgewertet und
    z.B. "" == "C:\BAT;C:\DOS;C:\UT[Schnitt]
    ist dann einfach eine nicht erfllte Bedingung, beide Seiten des ==
    sind nicht gleich, d.h. der ebenfalls abgeschnittene THEN-Fall kann
    auch keinen Syntaxfehler mehr auslsen.
    Die Wirkung ist, da die Zeile einfach berlesen wird und damit die
    gleiche Wirkung hat, als wenn die ausgewertete Bedingung
    'PATH ist belegt' zum Nicht-Springen veranlat.
    Selbst wenn die Zeile innerhalb des Befehls GOTO oder des Labels ab-
    geschnitten wrde, wrde die vorher noch komplett enthaltene Bedingung
    aussagen: Bedingung nicht erfllt, also 'GOTO *nicht* anspringen!'
    und damit ebenfalls keine Fehlermeldung erzeugen. Nur wenn die
    Bedingung erfllt ist, also PATH leer ist, wird das GOTO angesprungen.
    In diesem Fall ist jedoch auch die Zeile kurz genug und niemals
    abgeschnitten!

    Man mu sich also beim Schreiben von Batchjobs zustzlich noch Gedanken
    darber machen, wie der Batchprozessor die Befehle verarbeiten wird und
    kann dann in sehr vielen Fllen scheinbar unvermeidbare Fehlermeldungen
    in Batchjobs trotzdem umgehen.

    Es bleibt zu wnschen, da COMMAND.COM irgendwann einmal lngere
    Eingabezeilen verarbeiten knnen wird. Dann knnte man auch auf
    solche lstige berlegungen verzichten.

                                                                             
  ---------------------------------------------------------------------------

   5. UpCase in Batchjobs: [96-10-16]
   ==================================

    Hufig bentigt man in Batchjobs die Mglichkeit, alle Zeichen einer
    Eingabe in Grobuchstaben umzuwandeln. Der folgende Trick beschreibt,
    wie dies ohne zustzliche Hilfe durch externe Utilities (oder 4DOS/NDOS)
    mit dem normalen Kommandoprozessor mglich ist.

     UPCASE.BAT:

      @ECHO off
      REM Diese Routine erwartet einen Parameter %1 als Eingabe und
      REM liefert als Ausgabe in %upstr% die zu Grobuchstaben
      REM konvertierte Zeichenkette.
      CTTY nul
      SET oldpath=%Path%
      PATH %1
      SET upstr=%Path%
      PATH %oldpath%
      SET oldpath=
      CTTY con

     DEMO.BAT:

      @ECHO off
      REM Geben Sie 'SHOW' in beliebiger Gro-/Kleinschrift an...
      CALL upcase.bat %1
      IF NOT "%upstr%"=="SHOW" GOTO end
      ECHO Dieser Text soll bei Angabe des Parameters SHOW erscheinen!!!
      :end
      SET upstr=


  ---------------------------------------------------------------------------

   6. Batchprozessor-Bug umgehen:
   ==============================

    Um einen Bug in der Zeilenbehandlung von Batchjobs mancher lterer
    MS-DOS COMMAND.COM Ausgaben (nicht DR DOS oder Novell DOS) zu umgehen,
    sollte man in die vorletzte Zeile eines Batchjobs nach Mglichkeit einen
    Kommentar schreiben.

     ...
     REM Avoiding a parsing bug in an older MS-DOS COMMAND.COM...
     :end

                                                                             
  ---------------------------------------------------------------------------

   7. ERRORLEVEL abfragen: [97-03-23]
   ==================================

    Viele Programme (auch viele externe DOS-Programme) liefern einen
    Errorlevel 0..255 an DOS zurck, aus dem erkennbar sein sollte, ob
    das Kommando normal beendet wurde (meist Errorlevel=0), oder ob Fehler
    aufgetreten sind.

    Leider ist die Auswertung in Batchjobs alles andere als einfach, da
    es unter COMMAND.COM keine Mglichkeit gibt, etwa eine Umgebungs-
    variable abzufragen (dies ist unter 4DOS und NDOS mglich).

    Die normale Syntax ist

     ...
     IF ERRORLEVEL 1 GOTO err1up
     GOTO end
     :err1up
     ECHO Es ist ein Fehler aufgetreten.
     :end

    Dabei hat 'ERRORLEVEL argument' die Funktion

    'ist Errorlevel grer-gleich argument?'

    D.h. man mu die ERRORLEVEL von oben nach unten abfragen, um eine Fall-
    unterscheidung zu bekommen. (Hufig wird in der Literatur ein optionales
    doppeltes Gleichheitszeichen "IF ERRORLEVEL == 1" angegeben; um das
    Risko einer Fehlinterpretation auszuschlieen, sollte man darauf ver-
    zichten, denn in diesem Fall wertet COMMAND.COM trotzdem nur ein
    'grer-gleich', 4DOS/NDOS jedoch ein 'gleich' aus.)

    Einen einzelnen Code kann man auch mit der folgenden Anweisung
    auskodieren:

     IF ERRORLEVEL 1 IF NOT ERRORLEVEL 2 GOTO err1

    Hufig kann man sinnvoller mit einer Abfrage in umgekehrten Logik
    'IF NOT ERRORLEVEL' arbeiten.

    Wie bekommt man die Errorlevel heraus?

    Da hufig keine Dokumentation zu den Errorleveln vorhanden ist,
    liegt meinem Tips & Tricks Paket ein Batchjob namens ERRORLVL.BAT
    bei: Er fungiert als 'Wrapper' und erlaubt die Angabe eines beliebigen
    Programms oder Batchjobs als Parameter und liefert nach seiner Be-
    endigung die zurckgelieferten Errorlevel als Text aus. Mit diesen
    Informationen kann man dann seine "IF ERRORLEVEL"-Abfrage in Batchjobs
    programmieren.
    Mehr Hilfe zu ERRORLVL gibt ERRORLVL selbst aus, wenn es ohne Parameter
    gestartet wird.

    Bemerkung zu CCI Multiuser DOS 7.xx Gold: Dieses System untersttzt
    neben der oben beschriebenen Methode auch noch eine Umgebungsvariable
    %ErrorLvl%, die jeweils den letzten Fehlercode als dreistellige
    Dezimalzahl (ggfs. mit fhrenden Nullen) zugewiesen bekommt. Dieses
    bildet mein Batchjob ERRORLVL.BAT (ab Version 1.12) standardmig nach,
    mit dem Spezialparameter [-] kann man dies jedoch unterdrcken. Neben
    dem IF ERRORLEVEL Kommando untersttzt Multiuser DOS als eine von vielen
    anderen Erweiterungen auch noch eine gleichwertige, in der abgekrzten
    Form aber bersichtlichere Schreibweise als

     ON [ERRORLEVEL] code [GOTO] label

    die zu "ON code label" abgekrzt werden kann. Leider wird diese Form
    von keinem anderen Kommandoprozessor untersttzt, auch nicht von DR DOS,
    Novell DOS oder Caldera OpenDOS 7.01.


    Unvollstndige bersicht ber Errorlevel einiger externer DOS-Kommandos:

    (Die Bemerkungen fr MS-DOS gelten zumindest bis einschlielich MS-DOS
     5.0 auch fr PC-DOS bis 5.0. Dort, wo explizit bekannt, wurde PC-DOS
     ab 5.0 gesondert aufgefhrt. Die angegebenen Errorlevel gelten fr alle
     aufgelisteten DOS-Versionen, abgesehen von extra markierten Ausnahmen,
     d.h. eine nicht aufgelistete DOS-Version kann durchaus die gleichen
     Werte liefern, dies wurde aber nicht berprft. Unterschiede zwischen
     MS-DOS/PC-DOS und DR DOS/Novell DOS sind - abgesehen von traditionellen
     Kommandos - sehr wahrscheinlich, soweit nicht explizit angegeben. Sind
     innerhalb eines Kommandos die Errorlevel fr einzelne DOS-Versionen
     getrennt aufgelistet (fangen jeweils wieder mit 0 an), so unterscheiden
     sich die Errorlevel nahezu vollstndig. OS/2 Errorlevel sind nur fr
     OS/2 2.x und Warp 3 gesichert, sollten aber auch fr andere Versionen
     gelten.)

     Weitere Auflistungen von Errorleveln sind hochwillkommen...

                verifiziert ab    Errorlevel:
                DOS-Version:

    ASSIGN      Novell DOS 7,         0  ok, Hilfe
                Caldera OpenDOS 7.01  3  Benutzerabbruch (<Ctrl>+<c> etc.)
                                      4  Syntaxfehler
    ATTRIB      MS-DOS 5.0+,          0  alles ok (angeblich auch DR DOS
                Novell DOS 7,            6.0) bei Novell DOS 7 auch: Datei
                Caldera OpenDOS 7.01     nicht gefunden
                                      1  MS-DOS: Parameter falsch oder Datei
                                         nicht gefunden
                                      3  MS-DOS: Abbruch (angeblich auch bei
                                         DR DOS 6.0)
                                     31  Novell DOS 7+: unzulssige Option
                                         oder Benutzerabbruch (<Ctrl>+<c>
                                         etc.)
    APPEND      Novell DOS 7,         0  ok
                Caldera OpenDOS 7.01  3  Benutzerabbruch (<Ctrl>+<c> etc.)
    BACKUP      MS-DOS 2.1+,          0  Normal durchgefhrt
                DR DOS 6.0,           1  Keine Dateien fr Backup gefunden
                CCI Multiuser DOS 7.x 2  Manche Dateien aufgrund Zugriffs-
                Novell DOS 7,            konflikts nicht gesichert
                Caldera OpenDOS 7.01, 3  Benutzerabbruch (<Ctrl>+<c> etc.)
                PC-DOS 7,             4  Abbruch durch Fehler
                OS/2 2.0+             5  OS/2 2.0+: reserviert
                                      6  OS/2 2.0+: BACKUP konnte kein
                                         FORMAT durchfhren
    COMP        Novell DOS 7,         0  normaler Ablauf, auch falls Ziel-
                Caldera OpenDOS 7.01     datei nicht gefunden oder bei
                                         unterschiedlich groen Dateien
                                      3  Benutzerabbruch (<Ctrl>+<c> etc.)
                                      4  keine Dateien oder Quelldatei nicht
                                         gefunden, oder bei falscher Aufruf-
                                         syntax
                OS/2 2.0+             0  alles ok
                                      1  Keine Dateien zum Vergleich ge-
                                         funden
                                      2  Einige Dateien oder Verzeichnisse
                                         konnten wegen eines Dateifehlers
                                         nicht bearbeitet werden
                                      3  Benutzerabbruch
                                      4  Abbruch durch Fehler
                                      5  Dateien waren ungleich
    CHOICE      MS-DOS 6.?+,          x  je nach Benutzerinteraktion, siehe
                PC-DOS 7,                Dokumentation
                Novell DOS 7,
                Caldera OpenDOS 7.01
    CHKDSK      MS-DOS 6.2+,          0  keine Fehler auf Laufwerk
                CCI Multiuser DOS 7.x 1  nur MDOS: Es gibt offene Dateien im
                                         System, CHKDSK kann nicht arbeiten
                                    255  Fehler auf Laufwerk
                OS/2 2.0+             0  alles ok
                                      1  reserviert
                                      2  reserviert
                                      3  Benutzerabbruch
                                      4  Abbruch wegen Fehler
                                      5  reserviert
                                      6  CHKDSK konnte das Dateisystem-
                                         spezifische CHKDSK-Overlay nicht
                                         ausfhren
    DEFRAG      MS-DOS 6.2+,          0  Defragmentierung erfolgreich
                PC-DOS 7              1  interner Fehler
                                      2  keine freie Zuordnungseinheit
                                         (mindestens eine wird bentigt)
                                      3  Benutzerabbruch (<Ctrl>+<c>)
                                      4  allgemeiner Fehler
                                      5  Fehler beim Lesen einer Zuordnungs-
                                         einheit
                                      6  Fehler beim Schreiben einer
                                         Zuordnungseinheit
                                      7  Allokationsfehler aufgetreten,
                                         bitte mit SCANDISK etc. korrigieren
                                      8  Speicherfehler
                                      9  Zu wenig Speicher
    DELTREE     MS-DOS 6.2+           0  fehlerfrei
                                      ?  sonst
    DELWATCH    Novell DOS 7,         0  normal
                Caldera OpenDOS 7.01 >27 nur in Verbindung mit Option /MBL:
                (DELWATCH 2.1)           Entspricht, nach Subtraktion von
                                         27 dem Wert der explizit mit /F:n
                                         angegebenen oder implizit angenom-
                                         menen Anzahl der maximal in der
                                         Lschverfolgung hngenden Dateien
                                         fr das/die aktivierte(n) Lauf-
                                         werk(e), d.h. ohne Angabe von /F:n
                                         fr Diskettenlaufwerke 47 (20
                                         Dateien) oder fr Festplatten-
                                         laufwerke 227 (200 Dateien).
    DISKCOMP    MS-DOS 4.0+,          0  Disketten identisch
                DR DOS 6.0,           1  Disketten verschieden oder
                Novell DOS 7,            bei MS-DOS 5.0, PC-DOS 7, DR DOS
                Caldera OpenDOS 7.01,    6.0, Novell DOS 7 und Caldera
                PC-DOS 7,                OpenDOS auch: Vergleich nicht
                OS/2 Warp 3              ausgefhrt, ungltiges Laufwerk,
                                         falsche Syntax
                                      2  Benutzerabbruch (<Ctrl>+<c> etc.)
                                      3  Hardware-Fehler, kein Vergleich
                                         durchgefhrt
                                      4  Initialisierungsfehler, zu wenig
                                         Speicher, Laufwerk oder Syntax
                                         falsch
    DISKCOPY    MS-DOS 4.0+,          0  Kopieren erfolgreich beendet
                Novell DOS 7,         1  Behebbarer Lese-/Schreibfehler,
                Caldera OpenDOS 7.01,    bei MS-DOS 5.0 auch: ungltiges
                PC-DOS 7,                Laufwerk, falsche Syntax
                OS/2 Warp 3           2  Benutzerabbruch (<Ctrl>+<c> etc.)
                                      3  Fataler Hardware-Fehler, kann
                                         Quelle nicht lesen, Ziel nicht
                                         formatieren
                                      4  Initialisierungsfehler, zu wenig
                                         Speicher, Laufwerk oder Syntax
                                         falsch
    DOSBOOK     Novell DOS 7,         0  ok
                Caldera OpenDOS 7.01 31  Syntaxfehler
    DPMI        Novell DOS 7,         0  genderter Zustand
                Caldera OpenDOS 7.01  1  Aufruf ohne Parameter bei de-
                                         aktiviertem DPMI, sonst wird
                                         auch 0 zurckgeliefert
    EAUTIL      OS/2 2.0+             0  ok
                                      1  keine Dateien zur Sicherung
                                         gefunden
                                      4  Abbruch wegen Fehler
    EDIT        Novell DOS 7,         0  ok
                Caldera OpenDOS 7.01  3  Benutzerabbruch (<Ctrl>+<c> etc.)
                                      4  Syntaxfehler
    FASTOPEN    MS-DOS 5.0+           0  alles ok (immer bei Novel DOS 7 und
                DR DOS 6.0,              DR DOS 6.0 )
                Novell DOS 7,         1  falscher Parameter (nicht bei
                Caldera OpenDOS 7.01     DR DOS 6.0 und Novell DOS 7, da
                                         dort FASTOPEN.COM/.EXE nur ein
                                         Dummy ist)
    FC          Novell DOS 7,         0  normaler Ablauf, egal ob Dateien
                Caldera OpenDOS 7.01     gleich oder ungleich sind, oder
                                         Hilfeschirm
                                      1  Datei(en) nicht gefunden oder
                                         falsche Aufrufsyntax
                                      3  Benutzerabbruch (<Ctrl>+<c> etc.)
    FDISK       Novell DOS 7,         0  normale Bearbeitung
                Caldera OpenDOS 7.01  3  Benutzerabbruch (<Ctrl>+<c> etc.)
    FIND        MS-DOS 5.0+           0  alles ok,
                                         bei MS-DOS 6.2 auch: mindestens
                                         einmal gefunden
                                         bei Novell DOS 7 und Caldera
                                         OpenDOS 7.01 auch: keine Dateien zu
                                         durchsuchen
                                      1  MS-DOS: alles ok, aber nicht
                                         gefunden
                                      2  MS-DOS: falscher Parameter
                                     31  Novell DOS 7: Benutzerabbruch
                                         (<Ctrl>+<c> etc.), falsche Para-
                                         meter oder kein Suchtext
    FORMAT      MS-DOS 4.0+,          0  Formatieren erfolgreich beendet
                Novell DOS 7,         3  Benutzerabbruch (<Ctrl>+<c> etc.)
                Caldera OpenDOS 7.01, 4  Fataler Fehler, Datentrger,
                PC-DOS 7,                falscher Name
                OS/2 2.0+             5  Antwort <N>ein auf die Frage, ob
                                         Festplatte formatiert werden soll
                                      6  OS/2 2.0+: FORMAT konnte das
                                         Formatierprogramm fr ein anderes
                                         Dateisystem nicht finden
                                      7  OS/2 2.0+: Laufwerk wird vom
                                         Formatierprogramm fr ein anderes
                                         Dateisystem nicht untersttzt
    GRAFTABL    MS-DOS 4.0+,          0  erfolgreich geladen mit neuer Code-
                OS/2 2.0+,               seite, vorher war keine Codeseite
                Novell DOS 7,            geladen
                Caldera OpenDOS 7.01  1  zuvor geladene Tabelle durch neue
                                         ersetzt
                                      2  MS-DOS 4.0+, Novell DOS: Datei-
                                         fehler
                                         OS/2 2.0+: Es lag keine geladene
                                         Codeseite vor und es wurde auch
                                         keine geladen
                                      3  Parameter falsch, keine Aktion
                                      4  DOS-Version falsch, keine Aktion
    ISWINDOW    OS/2 Warp 3           0  DOS-Session luft im Vollbildmodus
                                      1  DOS-Session luft im Fenster
    JOIN        MS-DOS 5.0+           0  alles ok
                                      1  ungltiger Parameter
                Novell DOS 7,         0  nie???
                Caldera OpenDOS 7.01  1  Verzeichnis fr JOIN nicht anlegbar
                                      3  Benutzerabbruch (<Ctrl>+<c> etc.)
                                     32  Ausgabe der JOIN-Zuordnungsliste
                                     43  Fehler
                                    255  erfolgreich Zuordnung hergestellt
    KEYB        MS-DOS 4.0+,          0  erfolgreich beendet
                PC-DOS 7              1  Syntax ungltig, Zeichensatz
                                         falsch, Tastencode falsch
                                      2  falsche oder fehlende Tastatur-
                                         definitionsdatei
                                      3  Konnte Tastaturtabelle im resi-
                                         denten Speicher nicht erzeugen
                                         (angeblich nicht bei MS-DOS 5.0
                                         und PC-DOS 7)
                                      4  Fehler beim Ansprechen von CON:
                                      5  Ntige Codeseite nicht bereit
                                      6  Tabelle fr Codeseite nicht in
                                         residenter Tastaturtabelle gefunden
                                         (angeblich nicht bei MS-DOS 5.0 und
                                         PC-DOS 7)
                                      7  DOS-Version falsch, keine Aktion
                                         (angeblich nicht bei PC-DOS 7)
    LABEL       MS-DOS 5.0+           0  erfolgreich
                                      1  Laufwerk nicht vorhanden/ungltig
                Novell DOS 7,         0  erfolgreich
                Caldera OpenDOS 7.01  2  Benutzerabbruch (<Ctrl>+<c> etc.)
                                      4  falscher Parameter, Laufwerk nicht
                                         vorhanden/ungltig
    MEMMAX      Novell DOS 7,         0  ok
                Caldera OpenDOS 7.01  3  Benutzerabbruch (<Ctrl>+<c> etc.)
    MODE        MS-DOS 5.0+           0  ok
                                      1  falscher Parameter
    MORE        Novell DOS 7,         0  Hilfeschirm angezeigt
                Caldera OpenDOS 7.01  3  Benutzerabbruch (<Ctrl>+<c> etc.)
                                         whrend der Eingabe (auch Eingabe-
                                         umleitung).
                                    255  Nach ordnungsgemem Ablauf, auch
                                         im Falle eines Benutzerabbruchs
                                         (<Ctrl>+<c>) whrend der Ausgabe
                                         (auch bei Ausgabeumleitung).
    MOVE        MS-DOS 6.2+           0  erfolgreich
                                      1  nicht erfolgreich
    NLSFUNC     Novell DOS 7,         0  ok
                Caldera OpenDOS 7.01  3  Benutzerabbruch (<Ctrl>+<c> etc.)
    OPENS       CCI Multiuser DOS 7.x 0  Keine Dateien offen
                                      3  Es gibt offene Dateien im System
    RECOVER     Novell DOS 7,         0  ok
                Caldera OpenDOS 7.01, 1  OS/2 Warp 3: Es wurden keine zu
                OS/2 2.0+                bearbeitenden Dateien gefunden
                                      2  OS/2 Warp 3: Einige Dateien konnten
                                         wegen eines Zugriffskonfliktes
                                         nicht bearbeitet werden
                                      3  Benutzerabbruch (<Ctrl>+<c> etc.)
                                      4  OS/2 2.0+: Abbruch wegen eines
                                         Fehlers
                                      5  OS/2 2.0+: Lesen oder Schreiben
                                         auf eine der FATs unmglich
                                      6  OS/2 2.0+: Ausfhren einer RECOVER-
                                         Version fr das spezielle Datei-
                                         system nicht mglich
    REPLACE     MS-DOS 4.0+,          0  erfolgreich beendet
                PC-DOS 7,             1  OS/2 2.0+: Keine Dateien zum
                OS/2 2.0+                Ersetzen gefunden
                                      2  (Quell-)Datei nicht gefunden
                                         OS/2 2.0+: Einige Dateien oder
                                         Verzeichnisse konnten wegen Datei-
                                         fehler nicht bearbeitet werden
                                      3  Pfad nicht gefunden (bei PC-DOS 7
                                         auch Quelldatei nicht gefunden)
                                      4  OS/2 2.0+: Abbruch wegen eines
                                         Fehlers
                                      5  Zugriff (auf Quelldatei) verweigert
                                         OS/2 Warp 3: Abhilfe mit Parameter
                                         /R
                                      8  Zu wenig Speicherplatz (evtl. nicht
                                         bei OS/2 2.x)
                                     11  Kommandozeilenfehler (evtl. nicht
                                         bei OS/2 2.x)
                                     15  Laufwerk ungltig (angeblich nicht
                                         bei MS-DOS 5.0, evtl. nicht bei
                                         OS/2 2.x)
    RESTORE     MS-DOS 4.0+,          0  Befehl erfolreich
                DR DOS 6.0,           1  Keine Dateien zu restaurieren
                CCI Multiuser DOS 7.x 2  Einige Dateien wegen Zugriffs-
                Novell DOS 7,            konflikt nicht restauriert (evtl.
                Caldera OpenDOS 7.01,    nicht bei PC-DOS 7)
                PC-DOS 7,             3  Benutzerabbruch (<Ctrl>+<c> etc.)
                OS/2 2.0+             4  wegen anderem Fehler beendet,
                                         Quelle enthlt keine Sicherungs-
                                         daten, Syntax falsch
    SCANDISK    MS-DOS 6.2+           0  ok
                                      1  falsche Syntax
                                      2  Speicherberlauf, interner Fehler
                                      3  Benutzerabbruch (<Ctrl>+<c> etc.)
                                      4  Logischer Laufwerkstest erfolg-
                                         reich, aber Oberflcheanalyse nicht
                                         (fr alle Laufwerke) vollstndig
                                         durchgefhrt bzw. abgebrochen,
                                         sonst aber ok. Nicht, wenn Ober-
                                         flchenanalyse vollstndig umgangen
                                         wurde.
                                    254  Datentrgerfehler gefunden und
                                         vollstndig korrigiert
                                    255  Datentrgerfehler gefunden, aber
                                         nicht (vollstndig) korrigiert
    SETVER      MS-DOS 4.0+,          0  Befehl erfolgreich
                PC-DOS 7,             1  Befehlsoption ungltig
                (Novell DOS 7,           Novell DOS 7 und PC-DOS 7: un-
                Caldera OpenDOS 7.01)    gltige DOS-Version angegeben
                                      2  Dateiname ungltig
                                      3  Zu wenig Systemspeicher, um Befehl
                                         auszufhren
                                      4  Format der Versionsnummer ungltig
                                      5  Eintrag in Versionstabelle nicht
                                         gefunden
                                      6  SETVER.EXE nicht gefunden
                                      7  Laufwerk ungltig
                                      8  Zu viele Kommandozeilenparameter
                                      9  Fehlende Kommandozeilenparameter
                                     10  Fehler beim Lesen von SETVER.EXE
                                     11  SETVER.EXE beschdigt oder un-
                                         brauchbar
                                     12  SETVER.EXE nicht gefunden oder
                                         (angeblich bei MS-DOS 6.2 und
                                         PC-DOS 7) SETVER.EXE untersttzt
                                         keine Versionstabelle
                                     13  Zu wenig Platz in Versionstabelle
                                         fr neuen Eintrag
                                     14  Fehler beim Schreiben von
                                         SETVER.EXE
    SORT        Novell DOS 7,         0  alles ok
                Caldera OpenDOS 7.01  1  wahrscheinlich nicht benutzt, da
                                         SORT auch mit Dateien grer
                                         64 KByte zurecht kommt
                                      2  Benutzerabbruch (<Ctrl>+<c> etc.)
                                      4  falscher Parameter
                MS-DOS/PC-DOS         0  alles ok
                                      1  Datei zu gro (grer 64 KByte)???
    SUBST       MS-DOS 5.0+,          0  ok
                Novell DOS 7,         1  ungltiger Parameter
                Caldera OpenDOS 7.01     Novell DOS 7: zuwenig Parameter
                                  3..67  nur Novell DOS 7: Entspricht der
                                         Lnge des TRUENAMEs eines gender-
                                         ten SUBST-Laufwerks (bei diesen
                                         Errorleveln knnte es sich um ein
                                         uerst praktisches Zufallsresultat
                                         handeln).
    SYS         Novell DOS 7,         0  ok
                Caldera OpenDOS 7.01  3  Benutzerabbruch (<Ctrl>+<c> etc.),
                                         kann Bootsektor nicht schreiben
                                      4  Syntaxfehler
    TOUCH       Novell DOS 7,         0  ok, Hilfe
                Caldera OpenDOS 7.01 31  kein Dateiname, Syntaxfehler,
                                         TOUCH fr einige Dateien fehlge-
                                         schlagen
    TREE        Novell DOS 7,         0  ok
                Caldera OpenDOS 7.01  1  Syntaxfehler, Laufwerks-(zugriffs-)
                                         fehler
                                      3  Benutzerabbruch (<Ctrl>+<c> etc.)
                                      4  Lesefehler (Diskette fehlt)
    UNDELETE    Novell DOS 7,         0  ok, keine Funktion???
                Caldera OpenDOS 7.01  2  ???
                                     31  Allgemeiner Fehler (Fehlercode xx),
                                         z.B. Fehlercode 3 bei ungltigem
                                         Zeitformat im /T: Parameter
    UNFORMAT    Novell DOS 7,         0  ok
                Caldera OpenDOS 7.01  1  unzulssiges Laufwerk
                                      3  Benutzerabbruch (<Ctrl>+<c> etc.)
                                      4  Kann Laufwerk nicht lesen
                                         (keine Diskette)
    UNPACK      OS/2 2.0+             0  alles ok
                                      1  Keine Dateien zum Entpacken ge-
                                         funden
                                      2  Einige Dateien oder Verzeichnisse
                                         konnten wegen eines Dateifehlers
                                         nicht bearbeitet werden
                                      3  Benutzerabbruch
                                      4  Abbruch wegen eines Fehlers
    XCOPY       MS-DOS 4.0+,          0  Befehl erfolgreich
                Novell DOS 7,         1  Keine Dateien zu kopieren
                Caldera OpenDOS 7.01, 2  Benutzerabbruch (<Ctrl>+<c> etc.)
                PC-DOS 7,                (wohl nicht bei PC-DOS 7)
                OS/2 2.0+                OS/2 2.0: Einige Dateien oder Ver-
                                         zeichnisse konnten wegen Datei-
                                         fehler nicht bearbeitet werden
                                      3  OS/2 2.0 und PC-DOS 7: Benutzer-
                                         abbruch
                                      4  Initialisierungsfehler, zu wenig
                                         Speicher, ungltige Optionen,
                                         Diskette voll, Datei/Pfad nicht
                                         gefunden
                                      5  Fehler bei INT24 beim Lesen/
                                         Schreiben der Daten

    4DOS (5.52a) setzt (undokumentiert) Errorlevel 255, wenn man interne
    Kommandos mit <Ctrl>+<c> abbricht (evtl. nur whrend des Hilfeschirms).

    VLMs von Netware/PNW (Novell DOS 7) lassen sich normalerweise auf-
    grund der Dateiendung .VLM nicht starten. Trotzdem besitzen sie ein
    erweitertes .EXE-Format. Benennt man sie in .EXE um und ruft sie auf,
    liefert der integrierte Stub sofort Errorlevel 6 zurck (dies gilt
    zumindest fr alle VLMs, die mir bisher in die Quere gekommen sind).

                                                                             
  ---------------------------------------------------------------------------

   8. Probleme mit Verzeichnisabfragen in Netzwerken:
   ==================================================

    Unter DOS kann man - wie wenig bekannt - die Existenz eines Ver-
    zeichnisses mit

     IF EXIST path\nul ECHO Das Verzeichnis path\ existiert!

    abfragen. Dies liegt daran, da das Gert NUL in jedem Verzeichnis
    vorkommt - zumindest wenn die AVAILDEV Funktion auf 'laxe' Auslegung
    geschaltet ist, was mit allen aktuellen DOS-Versionen der Fall (Nur
    bei DOS 2.xx gab es die Mglichkeit, die Unix-Konvention \dev\ zu
    forcieren). Unter Novell DOS 7 und DR DOS 6.0 kann (und sollte) man
    stattdessen auch

     IF DIREXIST path\ ECHO Das Verzeichnis path\ existiert!

    schreiben, unter 4DOS/NDOS sind sowohl DIREXIST als auch

     IF ISDIR path\ ECHO Das Verzeichnis path\ existiert!

    erlaubt.

    Leider funktioniert die erste Form (path\NUL) nicht (immer) in
    NetWare-Netzlaufwerken (unabhngig von SHOWDOTS=ON in NET.CFG) und
    spte Versionen von DR DOS 6.0 untersttzen diese Schreibweise auch
    nicht in allen Situationen: Hier meldet die Abfrage immer die Existenz
    des Verzeichnisses zurck, egal ob dies der Fall ist oder nicht. Man
    kann hier entweder auf die Spezialkommandos DIREXIST oder ISDIR aus-
    weichen mu (die aber MS-DOS COMMAND selbst in Version 6.22 noch nicht
    kennt). Als einziger Ausweg, der leider auch nicht immer anwendbar ist,
    gibt es eine BruteForce-Methode mit

     IF EXIST path\*.* ECHO Verzeichnis existiert, da Dateien vorhanden!

    um auf die Existenz einer beliebigen Datei in dem fraglichen Ver-
    zeichnis zu testen (wenn das der Fall ist, ist natrlich auch das
    Verzeichnis selbst vorhanden). Dies funktioniert allerdings nicht
    mit leeren Verzeichnissen.

                                                                             
  ---------------------------------------------------------------------------

   9. FOR und die %%x Variablen:
   =============================

    Wie bekannt, mssen die Schleifenvariablen bei FOR mit verdoppeltem %
    Zeichen benutzt werden. Sicherlich haben Sie sich auch schon einmal
    gefragt, warum das so ist. Ein paar berlegungen zu folgendem Beispiel,
    das den Parameter BINGO verschlucken soll, fhren zum Ergebnis:

     ...
     FOR %%x IN (%1 %2 %3 %4 %5 %6 %7 %8 %9) DO IF "%%x"=="BINGO" SHIFT
     ...

    - Wie sieht nachher der Inhalt der Variablen %1 %2 %3 %4 %5 %6 %7 %8 %9
      aus?

    - Werden bestimmte Variablen aus %1..%9 bersprungen, wenn ein Parameter
      BINGO enthlt? Mit anderen Worten: Aktualisiert FOR evtl. vernderte
      Variablen bei jedem neuen Durchlauf oder wird der Kopf der FOR-An-
      weisung PASCAL-konform nur einmal am Anfang bearbeitet, wodurch die
      mglichen Implikationen auflsen?

    Die Erklrung findet sich in der Art und Weise, wie COMMAND.COM eine
    FOR-Anweisung textuell behandelt. Vor der Ausfhrung werden Variablen-
    namen expandiert, d.h. intern liegt etwas vor, das zum Beispiel beim
    Aufruf mit

     %1     %2     %3    %4     %5
     DUMMY1 DUMMY2 BINGO DUMMY3 DUMMY4

    so aussieht:

     FOR %x IN (DUMMY1 DUMMY2 BINGO DUMMY3 DUMMY4) DO IF "%x"=="BINGO" SHIFT

    Diese Anweisung ist nun wieder eindeutig. Natrlich kann man dieses Ver-
    halten auch bewut ausnutzen...

                                                                             
  ---------------------------------------------------------------------------

   10. SET und Umleitung:
   ======================

    MS-DOS 6.xx und 7.0 (Windows95) haben einen Bug bei der Belegung von
    Variablen mit SET, wenn man diese Zeile umleitet. In diesem Fall werden
    Leerfelder nicht ignoriert.

     SET test=123456789
     IF NOT "123456789"=="%test%" ECHO Umgebung ist voll!

    Funktioniert wunderbar, nicht aber:

     SET test=123456789 > \dev\nul
     IF NOT "123456789"=="%test%" ECHO Umgebung ist voll!

    Wohl aber (Leerfelder vor '>' entfernen):

     SET test=123456789> \dev\nul
     IF NOT "123456789"=="%test%" ECHO Umgebung ist voll!

    Novell DOS 7 COMMAND.COM und 4DOS/NDOS besitzen diesen Bug nicht.

    In diesem Zusammenhang sei noch auf ein verwandtes Problem hingewiesen:

     SET params=%1 %2 %3 %4 %5 %6 %7 %8 %9> \dev\nul
     IF NOT "%params%"=="%1 %2 %3 %4 %5 %6 %7 %8 %9" ECHO Fehler!

    In vielen Fllen wird (bei MS-DOS/PC-DOS COMMAND.COM und 4DOS/NDOS) die
    Ausgabe "Fehler!" erscheinen, weil die Anzahl der in dem Variablenwert
    enthaltenen Leerfelder mit der Anzahl der Parameter variiert. Derartige
    Fehler kann man durch Einzelabfragen vermeiden.


  ---------------------------------------------------------------------------
