l4a-thompson
Goto Top

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  
also dast ist mein erstes menü wenn ich einfach enter drücke oder eine andere variable dann schließ sich die batch datei um dies zu verhindern möchte ich mit dem For string eine endlos schleife einbauen wenn nicht genau das gedrückt wir was ich zur verfügung stelle dann soll sie einfach zum menue zurück springen oder einen anderen befahl ausführen hab damit mal angefangen aber klappt nicht so ganz

was mach ich nun wieder falsch

Content-ID: 15002

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

Ausgedruckt am: 13.11.2024 um 08:11 Uhr

Biber
Biber 27.08.2005 um 13:31:51 Uhr
Goto Top
Moin, L4A-Thompson,

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)
HTH Biber face-wink
L4a-Thompson
L4a-Thompson 27.08.2005 um 14:10:47 Uhr
Goto Top
es geht leider nicht mit deinem
For string
werde aber auch noch weiter probieren wann ich es hinbekomme werde ich den fertigen string posten falls ich ihn mal vordir hinbekommen sollte *g

noch jemand andere vorschläge?
mr.sebi-man
mr.sebi-man 29.08.2005 um 10:50:03 Uhr
Goto Top
ruf doch einfach die batch - datei am ende wieder auf, damit musst du keine schleife einbauen, und zum beenden einfach ne neue sprungmarke, die nach dem neuaufruf läuft.
also z.B. so

*
Skript
*
skript.bat

:GOTO Exit
Rem hier bleibt einfach leer, d.h. das skript wird beendet.
Biber
Biber 29.08.2005 um 11:06:32 Uhr
Goto Top
@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. face-wink
mr.sebi-man
mr.sebi-man 29.08.2005 um 12:38:44 Uhr
Goto Top
@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...
Biber
Biber 29.08.2005 um 13:46:55 Uhr
Goto Top
@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.
::...... 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
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)