Nickname
Passwort | vergessen?

182 anonyme User

1 angemeldetes Mitglied


evinben
evinben
77156 Mitglieder freuen sich auf Dich!
Top-Aktivitäten
Sehen Sie hier, wer zu den aktivsten Mitgliedern der aktuellen Woche zählt:
In den Bereich Batch & Shell wechseln ..

Batch Auswahlmenü mit Countdown

Mitglied: s7mahess
Geschrieben von s7mahess (Level 1 - Frischling)
Erstellt am 01.07.2011, um 16:08:55 Uhr, Permanent-ID: 168973
Dieser Beitrag wurde bisher 5716 mal aufgerufen und gilt als gelöst.
1 von 1 Mitglied fand diese Anleitung hilfreich.
Hilfreich+1 hilfreichDruckenBeobachten
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-c ... 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:

01.
ECHO off 
02.
SET ERRORLEVEL=3 
03.
SET wahl=nix 
04.
SET countdown_takte=15 
05.
FOR /L %%c IN ( %countdown_takte%,-1,0) DO ( 
06.
	CLS 
07.
	ECHO "Wollen sie ... durchfuehren? [J/N]" 
08.
	SET /p ".=Der Vorgang wird in %%c Sekunden automatisch gestartet..." < nul 
09.
	ECHO. 
10.
	CHOICE /c:jn0 /t:1 /d:0 /n 
11.
	IF NOT ERRORLEVEL 3 ( 
12.
		IF ERRORLEVEL 2 (  
13.
			SET wahl=n 
14.
			GOTO ergebnis 
15.
16.
		IF ERRORLEVEL 1 (  
17.
			SET wahl=j 
18.
			GOTO ergebnis 
19.
20.
21.
22.
:ergebnis 
23.
ECHO Du hast %wahl% gewaehlt! 
24.
IF %wahl%==nix ( 
25.
	ECHO Du hast nix gewaehlt deswegen setze ich wahl auf j. 
26.
	SET wahl=j 
27.
28.
IF %wahl%==j ( 
29.
	ECHO Ich fuehre druch! 
30.
31.
IF %wahl%==n ( 
32.
	ECHO NE du ich mache nix! 
33.
)

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:

01.
IF NOT ERRORLEVEL 3 ( 
02.
		IF ERRORLEVEL 2 (  
03.
			SET wahl=n 
04.
			GOTO ergebnis 
05.
06.
		IF ERRORLEVEL 1 (  
07.
			SET wahl=j 
08.
			GOTO ergebnis 
09.
10.
11.
 
12.
wenn nicht NICHTS gewählt wurde dann 
13.
	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ß
Kommentar schreibenMit Zitat
Anmeldung erforderlich!
Bitte melden Sie sich erst mit Ihrem Nicknamen und Passwort an.
Diskussionsverlauf (2 Kommentare)
thread
pieh-ejdsch
Kommentar pieh-ejdsch schreibt am 02.07.2011, 18:38:42 Uhr
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
01.
IF NOT ERRORLEVEL 3 ( 
02.
	if Errorlevel 2 set wahl=n 
03.
	if Errorlevel 1 SET wahl=j 
04.
	goto :ergebnis	 
05.
)

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
01.
@ECHO off&Setlocal 
02.
 
03.
:Marke255 
04.
cls 
05.
if defined countdown_takte (set /a countdown_takte-=1) else SET countdown_takte=15 
06.
echo Der Vorgang wird in %countdown_takte% Sekunden automatisch gestartet...  
07.
ECHO "Wollen sie ... durchfuehren? [J/N]"  
08.
CHOICE /c:jn0 /t:1 /d:0 /n >nul 
09.
goto :Marke%Errorlevel% 
10.
 
11.
:Marke3 
12.
if %countdown_takte% gtr 0 goto :Marke255 
13.
ECHO Du hast nix gewaehlt! 
14.
ECHO deswegen setze ich wahl auf j. 
15.
goto :weiter 
16.
 
17.
:Marke2 
18.
ECHO Du hast N gewaehlt! 
19.
ECHO NE du ich mache nix! 
20.
ping localhost -n 4 >nul&goto :eof 
21.
 
22.
:Marke1 
23.
ECHO Du hast Ja gewaehlt! 
24.
 
25.
:Weiter 
26.
ECHO Ich fuehre druch! 
27.
::ping localhost -n 4 >nul

Gruß Phil
AntwortenMit Zitat
Anmeldung erforderlich!
Bitte melden Sie sich erst mit Ihrem Nicknamen und Passwort an.
thread
103316
Kommentar 103316 schreibt am 01.11.2011, 13:35:55 Uhr
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!
AntwortenMit Zitat
Anmeldung erforderlich!
Bitte melden Sie sich erst mit Ihrem Nicknamen und Passwort an.