Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Batch Auswahlmenü mit Countdown

Anleitung Entwicklung Batch & Shell

Mitglied: s7mahess

s7mahess (Level 1) - Jetzt verbinden

01.07.2011, aktualisiert 04.07.2011, 13735 Aufrufe, 2 Kommentare, 1 Danke

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:

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ß
Mitglied: pieh-ejdsch
02.07.2011 um 18:38 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
Bitte warten ..
Mitglied: 103316
01.11.2011 um 13:35 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!
Bitte warten ..
Neuester Wissensbeitrag
CPU, RAM, Mainboards

Angetestet: PC Engines APU 3a2 im Rack-Gehäuse

Erfahrungsbericht von ashnod zum Thema CPU, RAM, Mainboards ...

Ähnliche Inhalte
Batch & Shell
Dateinamen nach Zeichnen abschneiden - Batch-Shell (9)

Frage von cberndt zum Thema Batch & Shell ...

Batch & Shell
CMD Verschlüsslung ( Batch ) (9)

Frage von clragon zum Thema Batch & Shell ...

Batch & Shell
gelöst älteste dateien via batch löschen (6)

Frage von cali169 zum Thema Batch & Shell ...

Batch & Shell
gelöst Suchen und Ersetzen mehrerer Suchbegriffe per Batch (4)

Frage von makroll10 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

DSL, VDSL
DSL-Signal bewerten (10)

Frage von SarekHL zum Thema DSL, VDSL ...

Windows Server
Mailserver auf Windows Server 2012 (8)

Frage von StefanT81 zum Thema Windows Server ...

Backup
Clients als Server missbrauchen? (8)

Frage von 1410640014 zum Thema Backup ...