# Stapelverarbeitungsdatei

Eine Stapelverarbeitungsdatei, englisch batch file, ist eine ausführbare Textdatei, deren Inhalt zeilenweise aus Kommandos besteht, die von einem Kommandozeileninterpreter (beispielsweise von PC-kompatiblem DOS) ausgeführt werden. Der Begriff leitet sich von der aus der Datenverarbeitung stammenden Stapelverarbeitung (englisch batch job) ab. Da sich unter PC DOS und MS-DOS, den meist vorinstallierten Betriebssystemen des IBM PC und kompatibler Computer, die Dateinamenserweiterung .BAT etabliert hatte, ist auch abseits von kompatiblen DOS-Betriebssystemen BAT-Datei, .BAT-Datei bzw. Batch-Datei neben Batch-Skript, Stapelverarbeitungsskript und Batch-Programm ein Synonym für Stapelverarbeitungsdatei.
Begrifflich sind solche Dateien zu unterscheiden von Datenbeständen, die durch Programme vom Typ Stapelverarbeitung im Allgemeinen verarbeitet werden und die meist strukturell gleichartige Datensätze enthalten (mit Datenfeldern über Kunden, Rechnungen etc.) und die oft in einer festgelegten Sortierfolge (wie Kundennummer, Rechnungsnummer, ...) vorliegen müssen.

## Technische Details und Geschichte

Als Dateiformat sind Stapelverarbeitungsdateien grundsätzlich Textdateien, deren Inhalt von einem Kommandozeileninterpreter als Stapelverarbeitung ausgeführt werden können. Skripte zur Abarbeitung von Kommandos einer Shell gab es bereits in den 1960er- und 70er-Jahren unter Multics und Unix. Der Kommandozeileninterpreter der meisten PC-kompatiblen DOS-Betriebssysteme wie MS-DOS, PC DOS und DR-DOS ist COMMAND.COM, der von Windows NT ist cmd.exe. Alternativen wie 4DOS erweitern die Skriptfähigkeiten durch zusätzliche Kommandos und zusätzliche Funktionen bestehender Kommandos.
Unter CP/M, dem Vorbild des ursprünglich als 86-DOS entwickelten späteren MS-DOS, gab es mit SUBMIT bereits die Möglichkeit, Stapelverarbeitungsdateien mit der Dateinamenserweiterung .SUB zu starten. Unter OS/2 und Windows NT (die Nachfolger von PC DOS bzw. MS-DOS) werden die Befehle der COMMAND.COM durch cmd.exe implementiert und zusätzliche Befehle wurden eingeführt, weshalb Stapelverarbeitungsdateien auf NT-basierten Windows-Versionen und auf OS/2 die Dateinamenserweiterung .cmd verwenden; .BAT-Dateien funktionieren jedoch weiterhin.
Allen Betriebssystemen ist gemein, dass als Laufzeitumgebung und Interpreter der Kommandozeileninterpreter, eine zeilenweise arbeitende Shell, verwendet wird. Alle Kommandozeilenbefehle lassen sich in der Regel sowohl auf der Kommandozeile direkt als auch aus einer Stapelverarbeitungsdatei heraus ausführen, auch Kommentare. Sprungmarken und Abfragen sind jedoch nur in einer Stapelverarbeitungsdatei sinnvoll anwendbar und es gibt teilweise kleinere Unterschiede, etwa bei der Verwendung von Variablen. Das trifft ebenso auf Shellskripte zu, einem Synonym für Stapelverarbeitungsdatei auf der Unix- und der PowerShell.

### Kompatibilität

Da unter Windows NT die meisten Befehle von COMMAND.COM durch cmd.exe nachgebildet sind, sollte es in vielen Fällen möglich sein, eine für MS-DOS geschriebene Stapelverarbeitungsdatei auch unter Windows NT auszuführen. Aber selbst unter reinem DOS können Unterschiede bei Parametern genutzter Dienst- und Systemprogramme Anpassungen an der Stapelverarbeitungsdatei nötig machen, damit diese weiterhin funktioniert. In MS-DOS, DR-DOS und Windows 9x dürfen Sprungmarken bspw. nur 8 Zeichen lang sein, der Rest wird ignoriert. Dies hat zur Folge, dass eine nur 8 Zeichen langen Sprungmarke, die mit einer später aufgeführten längeren Sprungmarke in den ersten 8 Zeichen identisch ist, Priorität erhält obwohl zu dieser bspw. per GOTO Anweisung nicht gesprungen werden sollte. In Windows 2000 und FreeDOS 1.3 sind hingegen lange Sprungmarken möglich.

### Verwendung

Stapelverarbeitungsdateien werden zur Ausführung von immer wiederkehrenden Befehlsfolgen verwendet (z. B. für automatisierte Anmeldevorgänge oder Laden von TSR-Programmen). Es ist auch möglich, die Ausführung einzelner Befehlszeilen von einer Bedingung abhängig zu machen. Dafür gibt es seit IBM DOS bzw. MS-DOS 2.0 Konstrukte wie IF oder IF NOT. Unter Windows-NT-basierten Systemen wurden unter anderem IF- und FOR-Befehle stark aufgewertet, indem sie zum Beispiel Vergleiche von Werten anboten. Neben diesen Bedingungsoperatoren können auch Variablen genutzt, Sprünge ausgeführt, Benutzereingaben realisiert und Kommentare geschrieben werden.
Im PC-kompatiblen DOS diente die Datei AUTOEXEC.BAT zur Systemkonfiguration beim Starten des Betriebssystems. Windows 3.x (ab Version 3.1, nur im „Erweiterten Modus“) und Windows 9x arbeiten beim Start zusätzlich die Datei WINSTART.BAT ab.

### Bedeutung einiger Batch-Befehle

* @ECHO OFF: Unterdrückt die Ausgabe des Befehls in der Stapelverarbeitungsdatei
* CLS (von englisch clear screen): Leert den Bildschirm
* PAUSE: Pausiert eine Stapelverarbeitung solange, bis der Benutzer eine Taste gedrückt hat.
* PAUSE > NUL: Pausiert eine Stapelverarbeitung solange, bis der Benutzer eine Taste gedrückt hat, die Meldung „Drücken Sie eine beliebige Taste...“ wird in die virtuelle Gerätedatei NUL umgeleitet, wodurch diese nicht auf dem Bildschirm ausgegeben wird.
* EXIT: Beendet die Stapelverarbeitungsdatei

## Hello-World-Beispiel

Die Ausgabe des klassischen Hello-World-Beispiels lässt sich durch eine Stapelverarbeitungsdatei erzeugen. Diese sollte zuvor unter geeignetem Dateinamen z. B. hello.bat gespeichert werden.
Eine erweiterte Version mit angepasster Titelzeile, Schrift- und Hintergrundfarbe und einer Aufforderung zum Schließen des Programms durch einen Tastendruck könnte wie folgt aussehen:
Die Absätze sind jedoch nicht zwingend erforderlich, sie dienen lediglich zur besseren Übersichtlichkeit.

## Alternativen und Nachfolger
### Batch-to-Memory

Der alternative Kommandozeileninterpreter 4DOS von JP Software, der als NDOS auch Teil der Norton Utilities ist, ergänzt den Funktionsumfang von Stapelverarbeitungsdateien. Um Verwechslungen und Inkompatibilitäten zu vermeiden, nutzt 4DOS die Dateinamenserweiterung .BTM, von englisch Batch To Memory, da die Dateien vor der Ausführung vollständig in den Arbeitsspeicher kopiert werden. Das verbraucht zwar einerseits mehr Speicher, andererseits ist die Ausführung dadurch schneller, da nicht nach jeder Zeile erneut in der Stapelverarbeitungsdatei gelesen werden muss. Batch-to-Memory-Stapelverarbeitungsdateien werden auch von JP-Softwares alternativen Kommandozeileninterpretern 4OS2 für OS/2 und 4NT bzw. Take Command (TC) für Windows unterstützt.

### REXX

Unter PC DOS ab Version 7 und OS/2 von IBM wurde mit REXX eine zusätzliche Skriptsprache eingeführt, die in Dateien mit der Erweiterung .BAT (in DOS) oder .CMD (in OS/2) ohne weitere Konfiguration ausführbar sind. Auch auf anderen Betriebssystemen sind REXX-Interpreter verfügbar. Die übliche Dateinamenserweiterung für REXX-Skripte ist .REX, die mit dem Interpreter vorangestellt aufgerufen werden müssen, z. B. mit REXX MEINPROG.REX /EinBeispielParameter.
Mit Dienstprogrammen ist es möglich, REXX-Skripte mit der Erweiterung .REX, die daher nicht wie Batch-Dateien automatisch ausführbar sind, auch ohne vorangestellten Interpreter aufrufbar zu machen, beispielsweise mit DOSKEY (ein Makro für jedes REXX-Skript) oder mit 4DOS (set .rex=C:\Pfad\zum\REXX-Interpreter.exe, was fortan für alle REXX-Skripte mit der entsprechenden Dateinamenserweiterung funktioniert; für REXX-Skripte in .BAT-Dateien wie in PC DOS muss allerdings auch REXXPath in der Datei 4DOS.INI gesetzt sein).
Eine Alternative, die jedoch einige Einschränkungen hat, sind sogenannte bilinguale Batch-Dateien, die sowohl einen klassischen Batch-Teil als auch einen REXX-Teil enthalten:
Diese Stapelverarbeitungsdatei, die mit der Erweiterung .BAT ausführbar ist und daher normal aufgerufen werden kann, startet in der ersten Zeile mit dem Kommando /*, das jedoch eine Fehlermeldung auswirft, da es sich unter DOS um kein gültiges Kommando oder Programm handelt. Mit dem Zusatz 2>NUL: wird diese Fehlermeldung unter Windows NT mit cmd.exe jedoch an das Nullgerät weitergeleitet und daher nicht auf dem Bildschirm ausgegeben; unter DOS und Windows 9x mit COMMAND.COM funktioniert das jedoch nicht, sodass die Fehlermeldung in jedem Fall ausgegeben wird und nur mit dem CLS-Kommando, das den gesamten bisherigen Textbildschirm zurücksetzt, wieder gelöscht werden kann. Ab der zweiten Zeile wird dann die Stapelverarbeitung ausgeführt, die alles aufbereitet, um sich selbst mit dem REXX-Interpreter REXX, der im Pfad sein muss, neu zu starten. Voraussetzung ist in diesem Beispiel-Skript allerdings, dass die Variable REXX_EXT=.BAT systemweit gesetzt ist, z. B. in der AUTOEXEC.BAT. In REXX wird der Batch-Teil am Anfang übersprungen, da alles, was zwischen /* ... */ steht, als Kommentar angesehen wird. Nach der Beendigung des REXX-Skripts mit dem EXIT-Befehl beendet sich schließlich auch die Stapelverarbeitung, die den REXX-Teil per GOTO-Anweisung überspringt.

### PowerShell

Im Jahr 2006 wurde von Microsoft die PowerShell veröffentlicht, eine modernere und plattformübergreifende Alternative, mit der Skripte in der eigens dafür entwickelten PowerShell Scripting Language geschrieben werden können. PowerShell-Skripte haben üblicherweise die Dateinamenserweiterung .ps1 (siehe PowerShell#Dateiendungen).