s7mahess
Goto Top

Batch Auswahlmenü mit Countdown

Nach stundenlanger Recherche im Internet, und keiner brauchbaren zu findenden Lösung, habe ich mich an Basteln gemacht um ein Menü zu erstellen, welches nach gewisser Zeit einen Befehl automatisch ausführt.

Hinweis:

Der choice Befehl ist nur in
MS-DOS 6.0+
Windows 95
Windows 98
Windows Vista
Windows 7

standartmäßig verfügbar.

Edit: Wie sich herausgestellt hat gibt es 2 verschiedene Versionen mit unterschiedlicher Syntax.
Eine Version mit anderer Syntax ist http://winsupport.org/utilities/freedos-choice.html hier herunterzuladen.

Die Zeile "CHOICE /c:jn0 /t:1 /d:0 /n" muss demnach in "CHOICE /c:jn0 /t:0,1 /n" geändert werden.

Vorweg das Ergebnis meiner Arbeit:

ECHO off
SET ERRORLEVEL=3
SET wahl=nix
SET countdown_takte=15
FOR /L %%c IN ( %countdown_takte%,-1,0) DO (
	CLS
	ECHO "Wollen sie ... durchfuehren? [J/N]"  
	SET /p ".=Der Vorgang wird in %%c Sekunden automatisch gestartet..." < nul  
	ECHO.
	CHOICE /c:jn0 /t:1 /d:0 /n
	IF NOT ERRORLEVEL 3 (
		IF ERRORLEVEL 2 ( 
			SET wahl=n
			GOTO ergebnis
		)
		IF ERRORLEVEL 1 ( 
			SET wahl=j
			GOTO ergebnis
		)
	)
)
:ergebnis
ECHO Du hast %wahl% gewaehlt!
IF %wahl%==nix (
	ECHO Du hast nix gewaehlt deswegen setze ich wahl auf j.
	SET wahl=j
)
IF %wahl%==j (
	ECHO Ich fuehre druch!
)
IF %wahl%==n (
	ECHO NE du ich mache nix!
)

Gehen wir Zeile für Zeile den Quelltext zusammen durch.

Mit "ECHO off" in Zeile 1 erreichen wir das die Konsole uns nicht jeden einzellnen Befehl ausgibt. Wir wollen ja schlißelich ein Sauberes Menü erstellen.
Mit "SET ERRORLEVEL=3" geben wir die Anzahl der Möglichen Optionen an. In meinem Fall sind die (J)a, (N)ein und keine Eingabe.
"SET wahl=nix" ist eine Hilfsvariable für die Auswahl im der späteren Logik.
"SET countdown_takte=15" gibt die Zeit des Countdowns in Sekunden an.

Als nächstes betreten wir die "FOR-Schleife" die von "countdown_in_sekunden" immer um "-1" bis 0 nach unten zählt.
Der Erste Schritt in unsere FOR-Schleife ist es die Konsole mit dem Befehl ClearScreen zu säubern und folgend bauen wir unser Menü mit akuteller Zeitangabe auf.

Wichtig hier: Ins Menü die Kürzel für die Auswahloptioen mit hineinschreiben, da wir die Standartausgabe im nachfolgenen Schritt ausblenden.

Der Zweite und wichtigste Schritt von allem ist der "CHOICE" Befehl. Er ist vergleichbar mit CASE OF aus anderen Sprachen.

/c Bestimmt die zu erstellende Auswahlliste. In meinem Fall (J)a, (N)ein und 0 (NULL). Unsere versteckte Auswahl die für keine Nutzereingabe steht muss als Letztes stehen!!!
/n Blendet die Auswahlliste in der Aufforderung aus. Wir möchten ja nicht das jemand unsere versteckte 3. Option sieht.
/t Bestimmt die Länge der Pause vor der Auswahl in Sekunden. Eine Sekunde sollte hier Stehen bleiben es sei den Sie wollen einen Countdown in Minutentaktung.
/d Bestimmt die Standardauswahl nach n Sekunden. Sollte der Nutzer nicht reagieren wird diese Auswahl gewählt. In diese Option muss unsere versteckte Auswahl hinein.

Die Rückgabe von Choice ist die Umgebungsvariable ERRORLEVEL:

Die Umgebungsvariable ERRORLEVEL wird auf den Index des Schlüssels gesetzt, der aus dem Auswahlsatz ausgewählt wurde. Die erste Auswahl gibt einen Wert von 1, die zweite einen Wert von 2 usw. Falls der Benutzer eine unzulässige Taste drückt, wird ein akustisches Signal wiedergegeben. Bei einem Fehlerzustand wird ein ERRORLEVEL von 255 wiedergegeben. Beim Drücken auf STRG+Untbr oder STRG+C wird ein ERRORLEVEL-Wert von 0 wiedergegeben. Führen Sie die ERRORLEVEL-Parameter in absteigender Reihenfolge auf, falls Sie diese in einem Batchprogramm verwenden.

Der Dritte und nicht weniger wichtige Schritt ist das wir bei einer Nutzereingabe die Schleife abbrechen. Dies erreichen wir durch eine Verschachtelung der IF Anweisungen.

Wie schon oben erwähnt muss Abfrage der Errorlevel Absteigend erfolgen, daher ist auch unsere Standardauswahl am Ende angegeben.

Die nun folgende Logik ist:

IF NOT ERRORLEVEL 3 (
		IF ERRORLEVEL 2 ( 
			SET wahl=n
			GOTO ergebnis
		)
		IF ERRORLEVEL 1 ( 
			SET wahl=j
			GOTO ergebnis
		)
)

wenn nicht NICHTS gewählt wurde dann
	schaue was gewählt wurde

NICHTS ist der Index unserer Standardauswahl, in unseren Beispiel der Index "3". Gleichzeitig auch der höchste Index.

Daraufhin erfolgt die Abfrage was der Benutzer gedrückt hat. Hierbei ist zu beachten von hinten nach vorne zu arbeiten.
Also erst Index 2, dann Index 1 usw.

Ist eine entsprechende Taste gewählt wurden setzen wir die Hilfsvariable "wahl" der Nutzerauswahl gleich und springen anschließen mit "GOTO ergebnis" aus der FOR Schleife heraus.

":ergebnis" ist die Sprungmarke für den GOTO Befehl.

Und Abschließen mit IF Anweisungen die Abfrage welche Fall eingetreten ist und was daraufhin getan werden soll.


Viel Spaß mit dem Menü

Martin Heß

Content-Key: 168973

Url: https://administrator.de/contentid/168973

Printed on: April 28, 2024 at 12:04 o'clock

Member: pieh-ejdsch
pieh-ejdsch Jul 02, 2011 at 16:38:42 (UTC)
Goto Top
moin Martin,

Schick,schick ...

Für was setzt Du den Errorlevel auf 3?

mit
if not Errorlevel Zahl - könnte man ja rein Theoretisch von Unten anfangen und nach oben soweit Durchgehen wie man muss (dachte ich, aber geht net - nur von oben herab)

Deine Zeilen 12. bis 19. kanst Du auch Kürzer schreiben
IF NOT ERRORLEVEL 3 (
	if Errorlevel 2 set wahl=n
	if Errorlevel 1 SET wahl=j
	goto :ergebnis	
)

komischerweise kann man if Errorlevel2 nicht weglassen, wenn Du nur Set wahl=n nimmst -
sollte es ja von der Programmlogik ausreichend sein - das isses aber nicht eventuell wegen der SchleifenKlammer.

das mit dem goto :AusDerSchleife sollte normal nur gemacht werden, wenn die Schleife in einem Unterprogramm ist welches Durch ein goto :EOF beendet wurde. Sonst gibt es Seiteneffekte und der Rest der Schleife wird zum Ende der Batch ausgeführt.
siehe Batch - for-Schleife vorzeitig beenden

eine Variante fast ohne Zusätzliche Variablen und ohne diese Schleifenklammer
@ECHO off&Setlocal

:Marke255
cls
if defined countdown_takte (set /a countdown_takte-=1) else SET countdown_takte=15
echo Der Vorgang wird in %countdown_takte% Sekunden automatisch gestartet... 
ECHO "Wollen sie ... durchfuehren? [J/N]"   
CHOICE /c:jn0 /t:1 /d:0 /n >nul
goto :Marke%Errorlevel%

:Marke3
if %countdown_takte% gtr 0 goto :Marke255
ECHO Du hast nix gewaehlt!
ECHO deswegen setze ich wahl auf j.
goto :weiter

:Marke2
ECHO Du hast N gewaehlt!
ECHO NE du ich mache nix!
ping localhost -n 4 >nul&goto :eof

:Marke1
ECHO Du hast Ja gewaehlt!

:Weiter
ECHO Ich fuehre druch!
::ping localhost -n 4 >nul

Gruß Phil
Mitglied: 103316
103316 Nov 01, 2011 at 12:35:55 (UTC)
Goto Top
Hallo Martin,

kannst du mir bitte den Code als interne Nachricht senden?

Wenn ich die Nachricht erhalten habe,
sende ich dir zurück,
wie man per ".vbs-Datei" einen Scherz-Virus programmiert!

Kannst du bitte noch dazu schreiben, ob ich die Datei unter "vbs ", "bat" oder etwas anderem speicher muss!

Christopher
dankt!