eine endlos schleife mit For in batch menü einbauen
@echo off
Title Programm Center v3.0 Produced by Thompson
setlocal
:menue
cls
color 60
echo LAN-4-ALL Teamspeak Server (Channel Wahl)
echo ==========================
echo 1 Ruheraum
echo 2 Battlefield 2
echo 3 GOF - LTP
echo 4 Laberecke
echo 5 Eigener Testserver (Eingang)
echo.
echo --------------------------------------------------------------------------------
echo Weitere Optionen ausfuehren
echo ===========================
echo iBackup, oodag Prozess Kill`n (k)
echo alle Task Processe anzeigen (t)
echo DFUE und Teamspeak channel(1-4) (d) ICQ und xFire starten automatisch
echo Antivir Guard Aktivieren? (j)
echo "O&O" Defrag Aktivieren (a)
echo Manuelle Befehlseingabe (cmd)
echo PC in XX Minuten (h)erunterfahren / Herunterfahren a(b)brechen / (n)eu starten
echo.
echo ======================= =====================
echo PROGRAMM VERLASSEN: 0 Weitere Optionen: w
echo ======================= =====================
echo.
set /p AuswahlEingabe=Aktion Auswaehlen:
REM --------------------------------------------------------------------------------------------------------------
For /F %AuswahlEingabe neq IN (1 2 3 4 5 0 k t d1 d2 d3 d4 j a h b n cmd w) do goto menue
if "%AuswahlEingabe%" equ "1" goto Ruheraum
if "%AuswahlEingabe%" equ "2" goto BF2
if "%AuswahlEingabe%" equ "3" goto GOF - LTP
if "%AuswahlEingabe%" equ "4" goto Laberecke
if "%AuswahlEingabe%" equ "0" goto EXIT
if "%AuswahlEingabe%" equ "5" goto Eigener
if "%AuswahlEingabe%" equ "k" goto Prozesse
if "%AuswahlEingabe%" equ "t" goto Task
if "%AuswahlEingabe%" equ "d1" call :DFUER
if "%AuswahlEingabe%" equ "d2" call :DFUEB
if "%AuswahlEingabe%" equ "d3" call :DFUEG
if "%AuswahlEingabe%" equ "d4" goto DFUEL
if "%AuswahlEingabe%" equ "j" goto Antivir
if "%AuswahlEingabe%" equ "a" goto defrag
if "%AuswahlEingabe%" equ "h" goto Herunterfahrer
if "%AuswahlEingabe%" equ "b" goto abbrechen
if "%AuswahlEingabe%" equ "n" goto neustart
if "%AuswahlEingabe%" equ "cmd" goto CMD
if "%AuswahlEingabe%" equ "w" goto menue2
was mach ich nun wieder falsch
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 15002
Url: https://administrator.de/contentid/15002
Ausgedruckt am: 13.11.2024 um 08:11 Uhr
6 Kommentare
Neuester Kommentar
Moin, L4A-Thompson,
sind nur Syntax-Fehler, keine Denkfehler..
1) FOR.. IN.. DO ist schon richtig, aber nicht mit Parameter /F.. der ist für Datei-Verarbeitung
2) und dann ist die Syntax sinngemäß...
FOR %%i in ( ....2 3 4 5..a b c...) DO was-auch-immer ..............mit einer Zählvariablen %%i
( Die kann auch %%a... %%z, %%A... %%Z und noch ein paar undokumentierte heißen, aber
IM BATCH IMMER mit ZWEI %-Zeichen (%%) )
3) und in dieses "was-auch-immer" gehört das "GOTO irgendwo"
4) aber erst, wenn Du alle Werte in der Liste/in der Klammer einmal verglichen hast ODER einen gültigen Wert gefunden hast. Ich würde die Logik an dieser Stelle umdrehen...
-> wenn gültige Eingabe --> gehe (springe zu) :weiter_BraverUser
-> wenn keine gültige Eingabe -> zurück zum Menu
also, alles zusammen:
HTH Biber
sind nur Syntax-Fehler, keine Denkfehler..
For /F %AuswahlEingabe neq IN (1 2 3 4 5 0 k t d1 d2 d3 d4 j a h b n cmd w) do goto menue
1) FOR.. IN.. DO ist schon richtig, aber nicht mit Parameter /F.. der ist für Datei-Verarbeitung
2) und dann ist die Syntax sinngemäß...
FOR %%i in ( ....2 3 4 5..a b c...) DO was-auch-immer ..............mit einer Zählvariablen %%i
( Die kann auch %%a... %%z, %%A... %%Z und noch ein paar undokumentierte heißen, aber
IM BATCH IMMER mit ZWEI %-Zeichen (%%) )
3) und in dieses "was-auch-immer" gehört das "GOTO irgendwo"
4) aber erst, wenn Du alle Werte in der Liste/in der Klammer einmal verglichen hast ODER einen gültigen Wert gefunden hast. Ich würde die Logik an dieser Stelle umdrehen...
-> wenn gültige Eingabe --> gehe (springe zu) :weiter_BraverUser
-> wenn keine gültige Eingabe -> zurück zum Menu
also, alles zusammen:
..
FOR %%i IN (1 2 3 4 5 0 k t d1 d2 d3 d4 j a h b n cmd w) DO IF /i [%%i] EQU [%AuswahlEingabe%] goto Weiter_BraverUser
:DummUser
goto menue "wer nicht tippen kann, muss es lernen"
-------------- bissken Prosa
und in diese Zeile kommt niemand, hier kann ich alles an Kommentar unterbringen.
der Batch (und der User) können beide nur bei ":DummUser" oder bei ":weiter_BraverUser" weiterlaufen.
Und ":DummUser" ist nur als eine Sprungmarke definiert, damit es keinen Syntaxfehler gibt. Könnte auch ein "Rem " davorstehen oder die Zeile ganz fehlen.
... und weiter gehts
:weiter_BraverUser
...
... (wie bei Dir unter der For-Schleife)
@mr. sebi-man
na., dann wäre es aber noch einfacher, das FOR..IN..DO..-Konstrukt ganz wegzulassen und nach den Verarbeitungszeilen ein "goto nachoben" zu schreiben:
if "%AuswahlEingabe%" equ "n" goto neustart
if "%AuswahlEingabe%" equ "cmd" goto CMD
if "%AuswahlEingabe%" equ "w" goto menue2
goto menue
Deine Variante ginge natürlich auch. Aber ich vermute, dass die "goto label"-Mimik vor ein paar Jahrzehnten in die damaligen DOS-Befehle eingebaut wurde, um genau das (Endlosschleife durch Sich-Selbst-Aufrufen) zu vermeiden.
Abgesehen davon bekommen wir sicherlich auch diese FOR..In..DO Schleife zum Fliegen, wenn wir uns richtig anstrengen.
na., dann wäre es aber noch einfacher, das FOR..IN..DO..-Konstrukt ganz wegzulassen und nach den Verarbeitungszeilen ein "goto nachoben" zu schreiben:
if "%AuswahlEingabe%" equ "n" goto neustart
if "%AuswahlEingabe%" equ "cmd" goto CMD
if "%AuswahlEingabe%" equ "w" goto menue2
goto menue
Deine Variante ginge natürlich auch. Aber ich vermute, dass die "goto label"-Mimik vor ein paar Jahrzehnten in die damaligen DOS-Befehle eingebaut wurde, um genau das (Endlosschleife durch Sich-Selbst-Aufrufen) zu vermeiden.
Abgesehen davon bekommen wir sicherlich auch diese FOR..In..DO Schleife zum Fliegen, wenn wir uns richtig anstrengen.
@Biber
soviel ich weiß funktioniert das GOTO nur, wenn die Sprungmarke weiter unten ist, also ein Sprung nach oben nicht möglich ist.
Sicher ist die Schleifenlösung besser aber da kenn ich mich net so gut aus...
soviel ich weiß funktioniert das GOTO nur, wenn die Sprungmarke weiter unten ist, also ein Sprung nach oben nicht möglich ist.
Sicher ist die Schleifenlösung besser aber da kenn ich mich net so gut aus...
@mr.sebi-man
Nein, GOTO funktioniert nicht nur nach unten. Bei jedem "GOTO Label" bzw "call :Label" durchsucht der CMD-Interpreter die gesamte *bat/*.cmd-Datei von oben angefangen bis zum Ende ab auf die Zeichenkette ":Label" am Zeilenanfang. War seit DOS 2.11 so. Seit neuestem liest der CMD-Interpreter von der Zeile an, in der er ein Goto findet bis unten, danach wieder vom Dateianfang aus.
( Anekdote dazu: zwischenzeitlich ist in WinXP mal ein neuer Bug reingekommen. Falls jemand versehentlich einen Label-Namen doppelt vergibt, sollte es nach meiner Aussage ja so sein, das immer das erste gefundene genommen wird. Syntaxfehler gibt es nie, weil die Suche ja in dieser Zeile mit einem "Gefunden" beendet wird.
Bsp.
Bei WinXP wird folgndes erzeugt:
D.h. der CMD-Interpreter von XP sucht von der ZeileX+1 an, wenn er in ZeileX aufgerufen wird. Wenn er dann nichts findet, liest er noch mal die *.bat-Datei von oben an. Derselbe
*.bat liefert unter 98 / NT noch andere Ergebnisse *gg.
Aber, wie zu sehen ist, springt er auch munter zurück z.B. zu :back_from_A
*ende der Anekdote)
Nein, GOTO funktioniert nicht nur nach unten. Bei jedem "GOTO Label" bzw "call :Label" durchsucht der CMD-Interpreter die gesamte *bat/*.cmd-Datei von oben angefangen bis zum Ende ab auf die Zeichenkette ":Label" am Zeilenanfang. War seit DOS 2.11 so. Seit neuestem liest der CMD-Interpreter von der Zeile an, in der er ein Goto findet bis unten, danach wieder vom Dateianfang aus.
( Anekdote dazu: zwischenzeitlich ist in WinXP mal ein neuer Bug reingekommen. Falls jemand versehentlich einen Label-Namen doppelt vergibt, sollte es nach meiner Aussage ja so sein, das immer das erste gefundene genommen wird. Syntaxfehler gibt es nie, weil die Suche ja in dieser Zeile mit einem "Gefunden" beendet wird.
Bsp.
::...... LabelTest.Bat
@echo off
GOTO labelA
:BACK_From_A
Echo Bin Bäck von LabelA
GOTO labelB
:back_from_B
Echo Bin Bäck von LabelA und LabelB
goto ende
[Raum für Notizen]
--
:LabelA
echo Hallo, hier Label A - das Original
goto :Back_from_A
:LabelB
echo Hallo, hier Label B
GOTO LabelA
:LabelA
REM Das ist //eigentlich// unerreichbar...;-)
echo Hallo, hier Label A - das unerreichbare Duplikat
:ende
Bei WinXP wird folgndes erzeugt:
>labeltest
Hallo, hier Label A - das Original
Bin Bäck von LabelA
Hallo, hier Label B
Hallo, hier Label A - das unerreichbare Duplikat
*.bat liefert unter 98 / NT noch andere Ergebnisse *gg.
Aber, wie zu sehen ist, springt er auch munter zurück z.B. zu :back_from_A
*ende der Anekdote)