Auswahl beim Windows-Start, c't 9/99, S. 192 (Hotline),
(gr)
------------------------------------------------------

Kommentierte Version von Wahldos.bat, nicht ablauffhig!

Fr reine "Downloader": Das allgemeine Warum und Wie
zur Benutzung von Wahl.bat, um damit verschieden
eingerichtete Windows-Versionen betreiben zu knnen,
finden Sie in c't 17/98 im Artikel "Teile und herrsche"
auf Seite 86/87. Hier geht es nur um hufig gestellte
Fragen zur Funktion der eigentlichen Batch-Datei.

Der Artikel steht unter http://www.heise.de/ct/98/17/086
online zur Verfgung.

Drei allgemeine Anmerkungen noch vorweg. 

1. Im Artikel ist bei einigen Lesern der Eindruck
   erzeugt worden, das Umschalten zwischen
   verschiedenen Windows-Versionen knne und solle man
   am einfachsten durch Beenden und Wahl der Option "Im
   MS-DOS-Modus neu starten" bewirken. Richtig ist, da
   das zwar die schnellstmgliche Methode ist, die auch
   oft funktioniert.

ABER: Sowie sich die Windows-Versionen mageblich in
benutzten Treibern unterscheiden (etwa UDF-Treiber nur
in der Version, die zum CD-Brennen benutzt werden soll,
oder DF-Treibern nur in der Arbeitsversion), wird die
Lage fragwrdig. Leider ist nicht bekannt, wie viele
"Reste" beziehungsweise "Reload-Befehle" sich eine
Windows-Version auch auf MS-DOS-Ebene merkt, um diese
dann bei einer Rckkehr in einer "falschen" Version
doch noch zu starten oder zu benutzen. Daraus folgt:
Der einzig sichere Weg zum Ums chalten zwischen
Windows-Versionen kann nur in einem vollstndigen
Herunterfahren und Neustarten von DOS samt Windows
bestehen. Also bitte auch keine Abkrzungen benutzen,
etwa "Windows-Neustart" bei gedrckter Shift-Taste oder
"unter neuem Namen anmelden".

2. Windows 95 und 98 sind intern "hart verdrahtet", was
   das Boot-Laufwerk betrifft. Man kann daher durch
   Umkopieren eines kompletten Windows-Verzeichnis von
   C: nach D: Windows nicht auf D: starten.

3. Wahl.bat luft sowohl unter Windows 95 als auch
   unter Windows 98. Mir wurde zwar auch schon von
   funktionierendem Mischbetrieb berichtet, ich habe
   dabei aber Bauchschmerzen und rate davon ab. Wer
   Win95 und Win98 im Wechsel betreiben will, sollte
   dazu zum Beispiel mittels Bootmanager-Software zwei
   primre Partitionen C: im Wechsel aktivieren. Gut
   dran ist auch, wer ber EIDE- und SCSI-Platte im
   System und ein Motherboard-Setup verfgt, das die
   Umschaltung zwischen Booten von EIDE und SCSI
   erlaubt.


ZU WAHL.BAT
===========

BATch-Dateien sind -- grob vereinfacht gesprochen --
Textdateien, die als eine Art Ablaufliste DOS-Programme
bzw. DOS-Kommandos wie DIR oder DEL ausfhren. Man kann
damit beliebige Programme (.com, .exe, mittel
CALL-Befehl auch andere Batch-Dateien) automatisch
starten, so wie man sie sonst auf der DOS-Kommandozeile
von Hand eingeben wrde. Daneben bietet Batching noch
einige Kontrollstrukturen, was die Nutzung als sehr (!)
einfache Programmiersprache zur Automatisierung immer
wiederkehrender Vorgnge ermglicht/vereinfacht.

Vor allem Aufrufe etwa von XCOPY mit einem
Rattenschwanz von schwer merkbaren Parametern (/h/r/s
usw.) verpackt man bequemerweise in eine (dann nur
einzeilige) Batch-Datei. Eine solche kann man dann
unter Windows zum Beispiel ber eine Verknpfung auch
per Mausklick starten. Durch Platzhalter in der
Batchdatei kann man auch Parameter an die Batchdatei
bergeben und noch etliches mehr. Wer mehr dazu wissen
will, sollte versuchen, an ein MS-DOS-Handbuch zu
gelangen, speziell die zur Version 5 waren vorbildlich
ausfhrlich.

Die Windows-Hilfedateien schweigen Batching
mittlerweile so gut wie tot. Wer noch ein IBM PC-DOS
7.x im Schrank stehen hat, findet darin eine
vollstndige DOS-Online-Hilfe (CMDREF.INF) mit eigenem
Viewer (View.exe). 

Ansonsten kann man wenigstens innerhalb der DOS-Box von
Windows 95/98 zu jedem DOS-Kommando wie DIR, DEL, ECHO,
CLS usw. Direkthilfe anfordern, indem man das Kommando
gefolgt von /? aufruft, also etwa

DIR/?

Wie erwhnt ist DOS-Batching eine sehr rudimentre
Programmiersprache. Das bedeutet, um sie einigermaen
sinnvoll nutzen zu knnen, sind fast immer auf den
ersten Blick unverstndliche Umwege ntig, um ans Ziel
zu kommen. Diverse Rckfragen seitens unserer Leser
veranlaten uns daher, diese kommentierte Fassung von
Wahl.bat beizulegen.

Ich beschrnke mich im folgenden rein auf die hier
verwendeten Kommandos.

@echo off

Das Echo-Kommando gibt den nachfolgenden Text auf der
DOS-Konsole (also dem Textbildschirm) aus. Das ist die
Standard-Einstellung unter DOS. Das hat zur Folge, da
smtliche Textzeilen, die innerhalb der Batch-Datei
stehen, beim Ausfhren ber den Bildschirm laufen.
Diese Einstellung ist sehr ntzlich in der Testphase
einer Batch-Entwicklung, weil man sofort sieht, an
welcher Stelle im Batch es klemmt. Noch besser
einkreisen lassen sich Problemzonen, indem man mittels
"Pause"-Statement Breakpoints setzt. 

Dir
pause
cls

Der Batch-Ablauf wird hier nach der Directory-Ausgabe
angehalten, nach Drcken einer beliebigen Taste geht es
dann weiter, im Beispiel mit CLS (ClearScreen, lsche
Bildschirm).

Spter jedoch stren die vielen Informationen, die ber
den Schirm huschen - eigentlich will man ja nur die
Meldungen der gestarteten Programme sehen. Daher sollte
man jeden Batch mit Echo Off beginnen. Daraufhin werden
nur noch die Textzeilen angezeigt, denen explizit ein
Echo vorangestellt ist. Das Jolly-Alpha (@) vorweg
unterdrckt bereits die Anzeige von Echo off selbst.

cls
echo.

Echo. dient dazu, eine Leerzeile einzufgen. Der Punkt
selbst wird unterdrckt. CLS (Lschen des Bildschirms)
ist bei greren Mens wie hier im Beispiel
unverzichtbar. Es ist die einzige Mglichkeit, eine
definierte Cursor-Startposition zu bekommen. Ansonsten
schreibt die DOS-Konsole Text stets fortlaufend
bereinander bzw. setzt sogar schon auf dem Schirm
stehende Zeilen fort.

(Es gibt Mglichkeiten der direkten Cursor-Steuerung
nebst Farbspielchen, indem man zustzliche
Mglichkeiten im DOS-Treiber ANSI.SYS nutzt. Ich rate
davon strikt ab; das Ganze ist sehr aufwendig und damit
fehlertrchtig, versionsabhngig und sieht grausam aus,
wenn kein ANSI.SYS auf der Zielmaschine geladen ist;
kaum noch ein Windows-User wird den Zeichenmll auf
einen fehlenden ANSI.SYS zurckfhren knnen und
generell Fehler in der Batch-Datei mutmaen.)

if not exist c:\Winwork\win.com goto work
if not exist c:\Winsound\win.com goto sound
if not exist c:\Wintest\win.com goto test

Das ist eine typische "Trick-Konstruktion", weil das
Batching keine Abfrage erlaubt, ob ein bestimmtes
Verzeichnis existiert. Man kann also nicht einfach
durch

if exist c:\Winwork 

feststellen, ob das Verzeichnis Winwork auf der Platte
existiert, sondern kann nur prfen, ob darin eine
bestimmte Datei existiert. Daher also die Abfrage auf
c:\winwork\win.com, die zentrale Datei, die in jedem
funktionsfhigen Windows vorhanden sein mu. Diese
Datei kann natrlich auch nur gefunden werden, wenn der
zugehrige Pfad (also das Verzeichnis winwork)
existiert. Um in unserem Beispiel herausfinden zu
knnen, welches Windows aktiviert ist, mu man aber
prfen, welches Verzeichnis gerade nicht namentlich
existiert, da es ja (hier im Beispiel) gerade in
"Windows" umbenannt ist, um startfhig zu sein. Demnach
ist immer gerade das Windows aktiv, dessen
Verzeichnisname nicht existiert (not exist).

Das Ende jedes Statements bildet eine Sprunganweisung
(goto) zu einer Sprungmarke (Label). Je nachdem,
welches Verzeichnis gerade namentlich nicht existiert,
wird zu einer Programmzeile verzweigt, in der der Name
des aktuellen Windows gespeichert wird.

:work
set aktwin=Winwork
goto weiter

:sound
set aktwin=Winsound
goto weiter

:test
set aktwin=Wintest

Die eigentlichen Labels werden mit einem Doppelpunkt
eingeleitet. Wer diesen vergit (hufige Fehlerquelle,
wie ich mittlerweile aus Leserreaktionen wei), kriegt
den Batch nicht korrekt ans Laufen. Wohlgemerkt: der
Doppelpunkt mu ohne Leerzeichen oder Tabulator am
Zeilenanfang vor dem eigentlichen Label stehen. Er DARF
NICHT beim Aufruf mittels Goto Label angegeben werden!

Die erste Abfrage if exist... verzweigt auf :work.
Mittels Set-Befehl wird in die Environment-Variable der
Wert (Text-String) "Winwork" geschrieben. Damit danach
nicht die Folgezeilen durchlaufen werden, was stets
darauf hinauslaufen wrde, da am Schlu set
aktwin=Wintest und damit Wintest als eingestellte
Umgebung angezeigt wrde, mu der jeweils unerwnschte
Code mittels "goto weiter" bersprungen werden.

Anmerkung: Wer den limitierten Speicherplatz im
DOS-Environment bereits mit extrem langen
Path-Anweisungen gefllt hat und viele andere Variablen
benutzt (ganz unabhngig vom Batch Wahl.bat, aber auch
durch dessen Ausbau), wird keine Fehlermeldung
bekommen, wenn der Platz im Environment
(Umgebungsbereich) nicht mehr ausreicht. Bei
berfllung werden statt dessen einfach keine weiteren
Variablen gespeichert bzw. mittendrin abgebrochen. Eine
SET-Anweisung ohne Parameter auf der Kommandoszeile
gibt jederzeit Aufschlu ber den Zustand der aktuell
existierenden Environment-Variablen. Wenn sich keine
weiteren setzen lassen oder die zuletzt angezeigt nicht
mehr vollstndig ist, lt sich der
Environment-Speicher explizit durch ein Shell-Statement
folgender Art in der CONFIG.SYS etwa auf 1024 Bytes
vergrern:

SHELL=C:\WINDOWS\COMMAND.COM C:\WINDOWS\COMMAND\ /E:1024 /p

Nun zum Mentextblock in Wahl.bat:

:weiter
echo Welches Windows soll gestartet werden?
echo Zur Auswahl stehen
echo.
echo Standardarbeitsumgebung    [A]
echo Sound und CD-Brennen       [S]
echo Testumgebung (Shareware)   [T]
echo.
echo Aktuelle Einstellung       [X]
echo.
echo DOS-Eingabeaufforderung    [D]
echo.
echo Bitte A, S, T, X oder D drcken
echo.
echo Nach 15 Sekunden wird automatisch die aktuelle Einstellung

if %aktwin%==Winwork echo "Standardarbeitsplatzumgebung" gestartet
if %aktwin%==Winsound echo "Sound und CD-Brennen" gestartet
if %aktwin%==Wintest echo "Testumgebung (Shareware)" gestartet

Das Obere ist ein Block nur zur Textausgabe. Das heit,
er hat selbst nichts mit der Funktion von Wahl.bat zu
tun, sondern informiert lediglich den Anwender, welche
Mglichkeiten der hat. Auch die IF-Statements dienen
nur zur Auswertung der Speichervariablen aktwin, um
daraufhin ausgeben zu knnen, welche Umgebung aktiv
ist. Zur Benutzung einer Environment-Variablen
(brigens jeder beliebigen, also nicht nur solcher, die
im Batch selbst deklariert wurden), greift man ber
deren Namen geklammert in %-Zeichen darauf zu. Das
doppelte Gleichheitszeichen ist der Operator zur
Prfung auf Gleichheit.

Achtung: Die Gro-/Kleinschreibung ist bei der Prfung
auf Gleichheit signifikant: WinWork ist folglich nicht
identisch mit Winwork!

choice /c:astxd /n /T:x,15
if errorlevel 5 goto dos
if errorlevel 4 goto ende
if errorlevel 3 goto mktest
if errorlevel 2 goto mksound
if errorlevel 1 goto mkwork

Das Choice-Kommando verbirgt sich hinter der Datei
Choice.com im Ordner windows\command\. (Anglophile, die
Wahl.bat daher in choice.bat umbenennen, sind
sptestens an dieser Stelle mit einer Endlosschleife
konfrontiert!)

Die genaue Aufruf-Syntax von Choice erhalten Sie mit
choice /?. Choice setzt abhngig von der getroffenen
Auswahl, also in Wahl.bat der Tastendrcke a s t x oder
d, einen sogenannten Errorlevel, eine rein interne
Variable. Wenn keine Taste bettigt wird, sorgt /T:x,15
dafr, das zeitabhngig (T) die Auswahl x automatisch
nach 15 Sekunden benutzt wird.

Auch Errorlevel ist wieder eine typische
Batching-Krcke. Gedacht war die Variable, um
Fehlermeldungen von in Batches benutzen DOS-Programmen
auswerten und dann im Klartext den Fehler an den
Anwender ausgeben zu knnen bzw. bestimmte Aktionen zu
veranlassen. Choice widmet die Nutzung fr die Auswahl
durch Texteingaben um. Die Reihenfolge der
Errorlevel-Abfrage ist wichtig: Damit man nicht auch
hier nach jedem if-Statement ein "goto weiter" einfgen
mu, kann man Errorlevel im Block immer vom hchsten
zum niedrigsten Wert abfragen, ohne da falsche
Auswertungen entstehen. Choice setzt die Errorlevels
aufsteigend vom ersten Auswahlparameter, der Errorlevel
1 liefert.

Kurzum: Die genaue Zuordnung zwischen der
Parameter-Reihenfolge von Choice und den
Errorlevel-Abfragen ist absolut wichtig.

:mktest
ren c:\Windows %aktwin%
ren c:\Wintest Windows
echo Es wird die Testumgebung gestartet
goto ende

:mksound
ren c:\Windows %aktwin%
ren c:\Winsound Windows
echo Es wird die Sound-Umgebung gestartet
goto ende

:mkwork
ren c:\Windows %aktwin%
ren c:\Winwork Windows
echo Es wird die Standardumgebung gestartet

:ende
win
:dos

Der Rest des Listings ist wieder vergleichsweise
simpel. Soll die eingestellte Windows-Version erneut
gebootet werden (x-Option), kann gleich ans
Programmende verzweigt werden. Gegenber der
ursprnglichen Version von Wahl.bat in c't 17/98,
Kasten "Teile und herrsche", S.86/87 haben wir in
Wahldos.bat noch die zustzliche Mglichkeit eingebaut,
nur bis zur MS-DOS-Eingabe zu starten. Deshalb weicht
das Ende der Datei etwas ab. 

Die Voraussetzung dafr, da der Boot-Vorgang bereits
auf DOS-Ebene enden kann, ist eine nderung der Option
BootGUI von BootGUI=1 auf BootGUI=0 in der Datei
Msdos.sys. Das kann man komfortabel mittels TweakUI im
Abschnitt "Booten" bewerkstelligen. Ansonsten mu man
Msdos.sys von Hand editieren. Dazu mu man aber
zunchst mit 

attrib msdos.sys -r -h -s 

die Attribute read only, hidden und system aufheben.
Nach dem Editieren kann man sie mit

attrib msdos.sys +r +h +s 

wieder setzen (die passende Batch-Datei siehe am Ende
dieser Datei). Nach dieser nderung startet Windows
also nur bis zur DOS-Kommandozeile. Windows kann an
dieser Stelle wie zu Win3.1-Zeiten mit dem Kommando Win
gestartet werden. Wenn man also BootGUI=0 setzt und
hinter das Label :Ende den Aufruf Win setzt, hat man
genau den funktionalen Stand von Wahl.bat in der
Ursprungsform erzeugt. 

Erst der zustzliche Parameter D im Auswahlmen, die
Einfhrung der zugehrigen Abfrage auf Errorlevel 5 mit
einer Verzweigung zu :DOS bringt die neue Funktion ins
Spiel: Nur wenn "D" bei der Auswahl gedrckt wird,
erfolgt ein Sprung ber das alte Ende hinaus auf das
tatschliche Programmende beim Label :DOS. Dann wird
der Batch auf DOS-Ebene beendet. In diesem Fall wird
die aktuelle Einstellung des aktivierten Windows nicht
verndert. Ein spterer Aufruf von Win auf der
DOS-Kommandozeile ist weiterhin mgl ich und startet
das entsprechende Windows.

Zurck aber noch mal zur ursprnglichen Funktion von
Wahl.bat. Der Sprung zu den Labels :mkwork usw.
bewirkt, da zunchst das Verzeichnis mit der
Bezeichnung "Windows" auf den Namen der aktuellen
Windows-Version benannt wird. Wenn das geschehen ist,
gibt es vorbergehend kein aktuelles, bootfhiges
Windows, da keines mit Namen Windows existiert. Das ist
aber auch absolut notwendig, denn eine Umbenennung
eines der anderen Verzeichnisse von Winwork, Winsound
oder Wintest in Windows ist erst mglich, wenn noch
kein Verzeichnis names Windows existiert. Andernfalls
verweigert der Rename-Befehl (ren) von DOS die
Mitarbeit (Doppelter Dateiname oder Datei wird
verwendet).

Damit ist jetzt auch klar, welches die notwendige
Start-Bedingung dafr ist, wann Wahl.bat das erste Mal
ohne Fehlermeldung benutzbar ist.

1. Sie mssen fr Ihre Verzeichnisnamen exakt die in
   Wahl.bat verwendeten Verzeichnisnamen benutzen, also
   Winwork, Winsound oder Wintest. Natrlich kann man
   auch andere Namen verwenden und die Batch-Datei
   entsprechend anassen -- sptestens nach Lektre
   dieser Datei hier sollte Ihnen das leichtfallen.

2. Zwei Verzeichnisse mit den benutzten Namen mssen
   existieren, eines mu bereits aktiviert unter dem
   Namen Windows bestehen bzw.  mssen Sie hier
   natrlich in der gesamten Batch-Datei den Namen
   benutzen, unter dem Sie Ihr Windows ursprnglich
   installiert haben -- ein einmal installiertes
   Windows bootet nur, wenn es sich exakt in einem
   Verzeichnis mit dem Namen findet, in das es
   ursprnglich installiert wurde. Bei vielen Anwendern
   wird das "Windows" auf Laufwerk C: sein, die
   Standard-Einstellung, die Micro soft bei der
   Installation whlt.

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

Attribute unter DOS umsetzen ist umstndlich, weil man
sich dazu Parameter merken mu und Tippfehlergefahr
besteht. Hier die Abhilfe. Schreiben Sie die folgende
Zeile in eine Datei zum Beispiel namens at.bat:

attrib %1 %2R %2H %2S

%1 und %2 stehen fr bergabeparameter an die
Batch-Datei, %1 fr den ersten, %2 fr den zweiten. Ein
Aufruf von 

at msdos.sys - 

wird dann expandiert in ATTRIB MSDOS.SYS -R -H -S und
hebt die Attribute auf; der Aufruf 

at msdos.sys + 

setzt sie wieder. 


