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, 13929 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 ..
Ähnliche Inhalte
Batch & Shell
Findstr Path CMD ja - Batch Script nein - FireFox Profiles (2)

Frage von ChrisIO zum Thema Batch & Shell ...

Microsoft
Pop-Up Dialog in Batch erstellen (3)

Frage von batchx zum Thema Microsoft ...

Batch & Shell
gelöst Batch starten unter berücksichtigung von Wochenenden, Feiertagen etc (7)

Frage von Kyrinja zum Thema Batch & Shell ...

Neue Wissensbeiträge
Heiß diskutierte Inhalte
Firewall
Welche Firewall ? (18)

Frage von Cyberurmel zum Thema Firewall ...

Windows Server
gelöst Einzelnes Windows Update über GPO deinstallieren (16)

Frage von lordofremixes zum Thema Windows Server ...

Windows Server
GPO zum Deinstallieren von Office Update wird nicht ausgeführt (15)

Frage von lordofremixes zum Thema Windows Server ...